git reset 命令详解(二)

上一篇博文git reset 命令详解(一)讲了 git reset 命令的基本原理和用法,这篇博文谈一谈 git reset 的另一种用法——后面跟一个路径(或文件)。

恢复索引中的文件到某个版本

假设版本库中是文件file.txt的V1版本,HEAD、Index和工作目录都和版本库一致。这时候修改了file.txt文件,并把它(V2版本)加入Index。如下图所示:

现在,运行 git reset file.txt (这其实是 git reset --mixed HEAD file.txt 的简写形式),它会让索引看起来像 HEAD, 所以它本质上只是将 file.txt 从 HEAD 复制到索引中。如下图:

仔细对比这两幅图,你会发现 git reset file.txt 有 “取消暂存文件” 的实际效果。它和 git add 所做的事相反。这就是为什么 git status 命令的输出会建议运行此命令来取消暂存一个文件。例如:

$ git add *
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)renamed:    README.md -> READMEmodified:   CONTRIBUTING.md

另外,我们可以不让 Git 从 HEAD 拉取数据,而是通过具体指定一个提交来拉取该文件的对应版本。 我们只需运行类似于 git reset eb43bf file.txt 的命令即可。依然用图来说明:

以上是版本库、Index 和工作目录的状态。

现在,执行git reset eb43 file.txt

压缩提交(squashing commit)

假设你有一个项目,第一次提交中增加了文件 a,第二次提交增加了一个新的文件 b 并修改了 a,第三次提交再次修改了 a。如下图:

你发现第二次和第三次提交其实是增加了一个软件功能,把二者压缩成一次提交更合理。那么可以这样做:

首先,运行 git reset --soft HEAD~2 来将 HEAD 分支移动到一个旧一点的提交上(即你想要保留的最近一次提交):

然后,运行 git commit

现在你可以查看可到达的历史,即将会推送的历史,现在看起来有个 v1 版 file-a.txt 的提交,接着第二个提交将 file-a.txt 修改成了 v3 版并增加了 file-b.txt。 包含 v2 版本的文件已经不在历史中了。


参考资料

《Pro Git》(Scott Chacon, Ben Straub Version 2.1.14, 2018-05-19)

git reset 命令详解(二)—— Git 学习笔记 08相关推荐

  1. git reset 命令详解(一)—— Git 学习笔记 07

    git reset 命令详解(一) 简而言之,git reset 命令是用来将当前 branch 重置到另外一个 commit 的,这个动作可能同时影响到 index 以及 work director ...

  2. git reset 命令详解 git revert命令详解。

    git reset 命令详解 reset命令 介绍 参数 补救 git revert命令 revert说明 举例: 命令 reset命令 介绍 git reset 命令格式为: git reset [ ...

  3. git reset命令详解

    开门见山,先抛出一张图,之后再细讲.  首先,先解释下图中的一些名词.  一.名词解释 1. Working Copy:当前工作目录下的文件,一般指,有修改,没有git add,没有git commi ...

  4. git checkout 命令详解—— Git 学习笔记 16

    git checkout 命令详解 概览 git checkout 这条命令的常用格式如下: 用法一 git checkout [<commit>] [--] <paths> ...

  5. Git 常用命令详解

    Git 常用命令详解 1. Git 常用命令 1.1 常用git 命令图表汇总 1.2 配置个人信息 1.3 创建版本库 1.4 常用Git命令汇总 2. Git 解决代码冲突 3. Git 分支管理 ...

  6. git add 回滚_Git的reset命令详解

    git reset 这个命令是版本控制的精髓,非常实用且常用,真香警告! 一.为什么 我们玩闯关游戏的时候,经常要把游戏进度保存,以便我们随时能够回到那一刻.特别是打BOSS之前,做好保存,发现打不过 ...

  7. git 命令详解_再次学习Git版本控制工具

    微信公众号:PHP在线 Git 究竟是怎样的一个系统呢?为什么在SVN作为版本控制工具已经非常流行的时候,还有Git这样一个版本控制工具呢?Git和SVN的区别在哪儿呢?Git优势又在哪呢?下面PHP ...

  8. git config设置用户名_一个神奇的工具,实现多人协作,git常用命令详解

    git是一款开源的分布式版本控制工具,在世界上所有分布式版本控制工具中,git是最快.最简单.最流行的. git的作者是Linux之父:Linus Benedict Torvalds,当初开发git仅 ...

  9. git log 命令详解

    git log 命令详解 git log 命令用于查看提交历史: git log [options] [<file> <commit> <tag>...] 如果不加 ...

最新文章

  1. Python 是一门动态的、强类型语言
  2. JavaScript学习总结(7)——JavaScript基础知识汇总
  3. linux curl https报错: curl: (35) SSL connect error
  4. BZOJ 2806 Luogu P4022 [CTSC2012]Cheat (广义后缀自动机、DP、二分、单调队列)
  5. apache开源项目--ApacheDS
  6. Prefix Sum Primes
  7. 推荐一款cpp解析json工具--rapidjson
  8. frexp 中文_带有Python示例的math.frexp()方法
  9. php timesheet,vue版本的timesheet图表
  10. 免费视频直播点播服务器系统,搭建一套完整的网络视频流媒体直播/点播服务系统需要具备哪些条件?...
  11. 终端/Shell 快捷键
  12. c语言的数组长度问题
  13. 我的电脑上的软件推荐
  14. loadrunner 打印变量
  15. Python常用中文分词库:jieba
  16. input输入框添加键盘事件
  17. 中国十大域名注册虚拟主机提供商排行榜
  18. 如何找到浏览器扩展的安装位置
  19. Android短彩信源码解析-短信发送流程(一)
  20. 合肥工业大学2020-2021学年《数据挖掘》实验报告(Python实现)

热门文章

  1. Linux16.04LTS 安装Intel RealSense D435驱动
  2. Object Detection中的IOU
  3. windows下tensorflow安装
  4. Reference to Different Versions of the Same Assembly
  5. SQL Server 2008 批量插入数据时报错
  6. [LeetCode] 1091. Shortest Path in Binary Matrix
  7. Vue入门:Vue项目创建及启动
  8. 博客使用的CSS代码备份
  9. html中代码执行顺序
  10. PHP中预定义的超全局数组