重置功能 git reset soft|hard等几种方式的比较

309 阅读3分钟
参数      HEAD    暂存区         工作目录       描述
 --soft  改变    保持不变       保持不变       只移动HEAD指针,之前提交的改动仍然会被保留在暂存区,适用于修改最后一次提交的信息。                          
 --mixed 改变    重置          保持不变       移动HEAD指针并且重置暂存区,但不影响工作目录。修改会被保留,但需要重新add到暂存区。                        
 --merge 改变    重置          尝试保留       移动HEAD指针、重置暂存区,工作目录中与HEAD开始的提交有差异的文件尝试保留,并通过merge的方式来处理暂存区和工作目录的差异。
 --hard  改变    重置          重置          完全清除所有本地修改,重置HEAD、暂存区和工作目录到指定的状态。所有改动都将丢失。                             
 --keep  改变    重置          尝试保留       类似于--hard,但在重置到指定的提交前,会检查工作目录中的文件是否有修改,如果有修改且与指定提交有冲突,那么操作会被拒绝。

git reset命令除了--hard参数,还可以使用--soft,--mixed以及--merge--keep参数,下面我来详细描述它们的区别:

  1. --soft:此选项不影响工作目录或暂存区,只重置了HEAD指针到指定的提交。如果你再运行git commit,会将所有改动作为新提交,包括前一个提交中的所有改动。

  2. --mixed:(默认设置)。这会重置HEAD并且取消暂存,但是不会改变工作目录。这个操作把这些文件放在未暂存的状态,就像你对文件做了修改但是还没使用git add来添加进来。

  3. --merge:在重置HEAD、暂存区以及工作目录的同时,将原来的HEAD的变动依旧保留在工作目录。

  4. --hard:重置HEAD、暂存区和工作目录,丢弃所有的改动。你所有的本地修改都会被丢弃。 5.--keep:相似于--hard,但如果有可能,保留工作目录的修改。

如果比作一位教授正在写一篇论文,五种reset的情况可以类比为:

  • --soft 就好比教授只是在草稿笔记上做了一个记号,表示论文的某个版本,但并没有删除任何内容。在需要的时候,可以快速的查看到这个版本的内容。
  • --mixed 教授不仅在草稿笔记上做了记号,还点了一个大红叉,暗示自己这部分内容需要重写。但其实内容并没有真的删除,仍在草稿纸上。
  • --merge 教授在草稿笔记上做了记号,然后把当前的章节完全撕掉,并重新打印出一个原来的旧版本,但他在修改的内容,一样通过手写的方式保留在旁边。
  • --hard 教授在草稿笔记上做了记号,然后把当前的章节完全撕掉,再重新打印出一个原来的旧版本。
  • --keep 教授在草稿笔记上做了记号,然后尝试将当前章节撕掉,但如果旧的版本和新的版本有冲突,他会保