理解git reset 三种模式 绝对经典

目录

原理理解

三种模式

使用场景

 

原理理解

理解git reset 三种模式 绝对经典
git各区域和命令关系
  • Working Tree      当前的工作区域
  • Index/Stage         暂存区域,和git stash命令暂存的地方不一样。使用git add xx,就可以将xx添加近Stage里面
  • Repository          提交的历史,即使用git commit提交后的结果

以下简单敘述一下把文件存入Repository流程:

阶段1:刚开始 working tree 、 index 与 repository(HEAD)里面的內容都是一致的

 

理解git reset 三种模式 绝对经典
阶段1

 

阶段2:我们修改文件之后,此时 working tree 的內容就会跟 index 及 repository(HEAD)的不一致,而Git知道是哪些文件  (Tracked File)被改动过,直接将文件状态设置为 modified (Unstaged files)。

 

理解git reset 三种模式 绝对经典
阶段2

 

阶段3:当我們执行 git add 后,会将这些改变的文件內容加入 index 中 (Staged files),所以此时working tree跟index的內容是一致的,但他们与repository(HEAD)內容不一致。

理解git reset 三种模式 绝对经典
阶段3

 

阶段4:接着执行 git commit 后,將Git索引中所有改变的文件內容提交至 Repository 中,建立出新的 commit 节点(HEAD)后, working tree 、 index 與与repository(HEAD)区域的内容 又会保持一致。

理解git reset 三种模式 绝对经典
阶段4

最后push到远程库当中。这就是我们最常用的提交代码流程,通过上图我们理解了三个区域:Working TreeIndex/Stage和Repository。


三种模式

1、git reset --soft     保留working Tree工作目录和index暂存区的内容,只让repository中的内容和 reset 目标节点保持一致

2、git reset --mixed(等同于git reset)  保留Working Tree工作目录的內容,但会将 Index暂存区 和 Repository 中的內容更改和reset目标节点一致

3、git reset --hard     直接将 working Tree工作目录、 index 暂存区及 repository 都重置成目标Reset节点的內容


使用场景

  • --hard(1) 要放弃目前本地的所有改变時,即去掉所有add到暂存区的文件和工作区的文件,可以执行 git reset -hard HEAD 来强制恢复git管理的文件夹的內容及状态;(2) 真的想抛弃目标节点后的所有commit(可能觉得目标节点到原节点之间的commit提交都是错了,之前所有的commit有问题)。

  • --soft原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files),所以假如我们之前工作目录没有改过任何文件,也没add到暂存区,那么使用reset --soft后,我们可以直接执行 git commit 將 index暂存区中的內容提交至 repository 中。为什么要这样呢?这样做的使用场景是:假如我们想合并「当前节点」与「reset目标节点」之间不具太大意义的 commit 记录(可能是阶段性地频繁提交,就是开发一个功能的时候,改或者增加一个文件的时候就commit,这样做导致一个完整的功能可能会好多个commit点,这时假如你需要把这些commit整合成一个commit的时候)時,可以考虑使用reset --soft来让 commit 演进线图较为清晰。总而言之,可以使用--soft合并commit节点

  • --mixed(默认)(1)使用完reset --mixed后,我們可以直接执行 git add 将這些改变果的文件內容加入 index 暂存区中,再执行 git commitIndex暂存区 中的內容提交至Repository中,这样一样可以达到合并commit节点的效果(与上面--soft合并commit节点差不多,只是多了git add添加到暂存区的操作);(2)移除所有Index暂存区中准备要提交的文件(Staged files),我们可以执行 git reset HEADUnstage 所有已列入 Index暂存区 的待提交的文件。(有时候发现add错文件到暂存区,就可以使用命令)。(3)commit提交某些错误代码,或者没有必要的文件也被commit上去,不想再修改错误再commit(因为会留下一个错误commit点),可以回退到正确的commit点上,然后所有原节点和reset节点之间差异会返回工作目录,假如有个没必要的文件的话就可以直接删除了,再commit上去就OK了。


END