常用场景:当你在工作的时候发现之前commit的提交的代码有问题,你想
撤回在本地commit提交
,最简单的方法就是git reset
下面介绍下git reset的原理和常用的option参数;
git reset就是可以让HEAD这个指针指向其他的节点。比如我们有一次commit不是不是很满意,需要回到上一次的Commit里面。那么这个时候就需要通过reset,把HEAD指针指向上一次的commit的点。
在介绍常用参数之前,先复习下之前关于本地git add commit 的流程,本地git区域总体分为三块:
- Working Tree 工作区
- index/Stage 暂存区,和git stash命令暂存的地方不一样。使用git add xx,就可以将xx添加近Stage里面
- Respository 提交历史,即是你git commit 的历史
文件存入Repository流程:
文件更改->提交暂存->提交到respository。
-
刚开始的时候,working tree 、 index 与 repository(HEAD)的文件是一样的。
-
当git管理的文件夹里面的内容出现改变后,此時 working tree 的內容就会跟 index 及 repository(HEAD)的不一致,而Git知道是哪些文件(Tracked File)被改动过,直接将文件状态设置为 modified (Unstaged files)。
-
当我们git add 后,工作区的文件提交到暂存区,文件状态(staged),所以此时working tree跟index的內容是一致的,但他们与repository(HEAD)內容不一致。
-
当我们git commit,把暂存区的文件提交到Repository(HEAD)后,创建新的节点(HEAD)。建立出新的 commit 节点(HEAD)后, working tree 、 index 與与repository(HEAD)区域的内容 又会保持一致。
git reset 参数
git reset [--hard|soft|mixed|merge|keep]
git reset [–hard|soft|mixed|merge|keep] [或HEAD]:将当前的分支重设(reset)到指定的或者HEAD(默认,如果不显示指定,默认是HEAD,即最新的一次提交),并且根据[mode]有可能更新索引和工作目录。
1. git reset --hard
没有指定节点, 默认把 HEAD指针移动到最新的一次提交,然后重置工作区和暂存区,清除所有改动。
2. git reset --soft
会在重置 HEAD 和 branch 时,保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区。
--soft 和 --hard 的区别:--hard 会清空工作目录和暂存区的改动,*而 --soft则会保留工作目录的内容,并把因为保留工作目录内容所带来的新的文件差异放进暂存区。
3. git reset --mixed
reset 如果不加参数,那么默认使用 --mixed 参数。它的行为是:保留工作目录,并且清空暂存区。也就是说,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录。简而言之,就是「把所有差异都混合(mixed)放在工作目录中」。
参考: Git Reset 三种模式 作者:carway