现实生活中虽然没有后悔药,但程序世界是有的。 reset 就是git中的后悔药,而且还可以根据参数不同来调整后悔的程度。
说明:
本文章并非git基础知识,需要对gi命令有一定的熟练程度才能理解,如果看官对 『工作区』『暂存区』『存储库』这三个词比较陌生,或者完全不理解是什么,那还是先请去看看git基础知识,再回头来往下浏览,以免浪费宝贵时间
1,前置知识说明
- 工作区: 即 Working Tree 或 Working Directory,不同文章中叫法不同。
- 暂存区:即 Index/Stage 或 Staged Snapshot。
- 存储库:即 Repository。
当我们新增或修改文件时,文件最先会放在工作区,这个阶段是我们正在进行文件的创建和编辑阶段。当使用 git add 命令,即表示我们的创建或编辑工作已经完成,准备将劳动成果添加到git仓库,但这时所有的创建或修改还只是临时的,被改动的文件只是转移到暂存区临时保存,并没有真正影响到git仓库的内容,只有使用 git commit 命令之后,所有的改动才最终生效,git 仓库中也产生新的文件版本记录。
简单来说,一个文件在git目录中有三种情况:
1,刚刚添加到目录中,或刚刚被修改过,此时文件被记录在工作区。
2,执行了 git add 命令, 此时文件由工作区转移到了暂存区
3,执行了 git commit 命令,此时文件由暂存区转移到git仓库,即存储库。
2,resset 的三种模式
如果把上面的 添加文件到 执行 git commit 的过程看作是前进,那么 git reset 就是回退,reset 的不同模式,其实就是回退几步,上面的提交一共有三步,对应的,reset 可以让你选择是回退一步,两步,还是三步。
以一个实例来说明,新建一个名称为 git-reset 的文件夹,使用执行 git init
将该文件夹初始化为一个git目录,然后进行如下操作:
1,新建一个文本文件 1.txt, 并添加内容为 1234
2,执行 git add 1.txt
3,执行 git commit -m '添加1.txt文件'
如果操作无误,使用 git log 命令查看日志,应该会看到一条提交记录。
为了方便下面的 reset 命令的理解 ,再继续进行如下操作:
4,修改1.txt,在原来内容后面添加 abcd。 (1.txt 最终的内容为 1234abcd)
5,执行 git add 1.txt
6,执行 git commit -m '修改1.txt文件,添加新内容'
如果操作无误,使用 git log 命令查看日志,应该会看到两条提交记录。
-
--hard
硬核模式,完全回退(就是肠子都悔清了,恨不得事情没有发生过), 就是回退三步。
在上面的例子中,执行如下命令:
$ git reset --hard HEAD^
执行完成之后,查看1.txt的内容,会发现只有1234,也就是说,1.txt 被退回到了上面 6步中的第三步之后的状态,456这三步相当于就没有发生过。
这就是--hard 模式,完全回退,使用此参数,在上一次执行 git commit 命令之后的所有操作都将会被抹除,相当于没有发生过,也就是之前在上一次git commit 命令之后的所有操作都是做了无用功,白费力气了。
**警告:
**此模式相当危险,除非你已经完全明白这个参数的含义以及执行这条命令之后的结果,否则不建议使用该参数。
-
--mixed
混合模式,回退到工作区(后悔不已,希望事情回到最初开始,自己可以做些事情来改变剧情的发展),就是回退两步。
为方便理解,将上面的 456三步再做一次(因为经过上面的 --hard 之后,456已经被抹掉了,相当于没发生),然后执行如下命令:
$ git reset --mixed HEAD^
执行完成之后,使用 git status 查看状态,并查看1.txt 的文件内容,会发现内容还是1234abcd,但git status显示的文件名称是红色,这是没有执行git add 1.txt 命令的状态,也就是说操作被回退到了第4步之后。
这就是 --mixed 模式,也是reset 的默认模式,即与 git reset HEAD^
效果是一样的,文件的修改操作并没有被抹除,也就是文件操作没有影响,但git操作被撤消了。
这是最常用的模式,所以如果不使用参数,默认即是这个模式。
-
--soft
轻度模式(或可以叫软模式),回退到暂存区(内心其实是不怎么后悔的,只是想修改一下提交记录)。
为方便理解,将上面的56两步再做一次(道理同上),然后执行如下命令:
$ git reset --soft HEAD^
执行完成之后,使用 git status 查看状态,并查看1.txt 的文件内容,会发现内容还是1234abcd,但git status显示的文件名称是绿色,这是执行了git add 命令,但没有执行 git commit 命令的效果,说明操作被回退到了第5步之后。
3,总结
git reset 的三种不同模式,其实对应的就是 git 提交的三个步骤,只要弄清楚了git提交的步骤,并能熟练使用,那么 git reset 其实也不难理解了。
网友评论