| 参数 | HEAD | 暂存区 | 工作目录 | 描述 |
|---|---|---|---|---|
--soft | 改变 | 保持不变 | 保持不变 | 只移动HEAD指针,之前提交的改动仍然会被保留在暂存区,适用于修改最后一次提交的信息。 |
--mixed | 改变 | 重置 | 保持不变 | 移动HEAD指针并且重置暂存区,但不影响工作目录。修改会被保留,但需要重新add到暂存区。 |
--merge | 改变 | 重置 | 尝试保留 | 移动HEAD指针、重置暂存区,工作目录中与HEAD开始的提交有差异的文件尝试保留,并通过merge的方式来处理暂存区和工作目录的差异。 |
--hard | 改变 | 重置 | 重置 | 完全清除所有本地修改,重置HEAD、暂存区和工作目录到指定的状态。所有改动都将丢失。 |
--keep | 改变 | 重置 | 尝试保留 | 类似于--hard,但在重置到指定的提交前,会检查工作目录中的文件是否有修改,如果有修改且与指定提交有冲突,那么操作会被拒绝。 |
git reset命令除了--hard参数,还可以使用--soft,--mixed以及--merge和--keep参数,下面我来详细描述它们的区别:
-
--soft:此选项不影响工作目录或暂存区,只重置了HEAD指针到指定的提交。如果你再运行git commit,会将所有改动作为新提交,包括前一个提交中的所有改动。 -
--mixed:(默认设置)。这会重置HEAD并且取消暂存,但是不会改变工作目录。这个操作把这些文件放在未暂存的状态,就像你对文件做了修改但是还没使用git add来添加进来。 -
--merge:在重置HEAD、暂存区以及工作目录的同时,将原来的HEAD的变动依旧保留在工作目录。 -
--hard:重置HEAD、暂存区和工作目录,丢弃所有的改动。你所有的本地修改都会被丢弃。 5.--keep:相似于--hard,但如果有可能,保留工作目录的修改。
如果比作一位教授正在写一篇论文,五种reset的情况可以类比为:
--soft就好比教授只是在草稿笔记上做了一个记号,表示论文的某个版本,但并没有删除任何内容。在需要的时候,可以快速的查看到这个版本的内容。--mixed教授不仅在草稿笔记上做了记号,还点了一个大红叉,暗示自己这部分内容需要重写。但其实内容并没有真的删除,仍在草稿纸上。--merge教授在草稿笔记上做了记号,然后把当前的章节完全撕掉,并重新打印出一个原来的旧版本,但他在修改的内容,一样通过手写的方式保留在旁边。--hard教授在草稿笔记上做了记号,然后把当前的章节完全撕掉,再重新打印出一个原来的旧版本。--keep教授在草稿笔记上做了记号,然后尝试将当前章节撕掉,但如果旧的版本和新的版本有冲突,他会保