git reset 这个命令是版本控制的精髓,非常实用且常用,真香警告!
一、为什么
我们玩闯关游戏的时候,经常要把游戏进度保存,以便我们随时能够回到那一刻。特别是打BOSS之前,做好保存,发现打不过就马上重来。或者一年半载后,重玩游戏,就可以选择一个保存节点开始游戏,可以随时切换。
我们每一次保存,软件就给当时的游戏场景拍一个全景照片,记录好当下的各种参数。我们选择回溯一个保存节点时,就像是选择从一个全景照片中重新开始。
这便是版本控制的精髓---给你更多条命、更多重来的机会。
二、是什么
git reset 命令是在更改git指针HEAD的指向,具体是更改指向不同的版本号,而不同的版本号就是我们玩游戏时不同时间点的暂存记录。如下图---
三、怎么用
要想用好reset命令,必须深入理解它的三个参数---
--soft,--mixed(默认),--hard
看图说话。
1、--soft参数
如上图,soft参数是指将本地仓回滚到Y版本,但是暂存区和工作区保持不变。此时本地仓回滚到Y版本号commit完成的那一刻。
2、--mixed参数
git reset --mixed 或者 git reset
这是默认参数。表示本地仓和暂存区,都回滚到Y版本号。工作区代码不受影响。
3、--hard参数
本地仓、暂存区、工作区,三区都回滚。
切记!!!工作区有未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了。
此时如何安全回滚,请参考我的上一篇文章的git stash命令。
思来享趣:理解Git的这两件事情,就可以在Git里为所欲为zhuanlan.zhihu.com
四、使用场景
具体使用的时候,要分清的就是用哪个参数最合适,下面举几个例子。再次提醒,工作区有未提交的改动时,不要用--hard参数。
1、如何撤销一次push?
此时用--soft参数比较合适,只回滚本地仓到上一个版本,然后通过git push -f命令,撤销上次的push,最后更改好代码后重新push。步骤如下---
依次为
git reset --soft HEAD~1 // 将本地仓回滚到上一个版本号
git push origin master -f // 通过-f命令,将回滚后的版本号强制推送上去,相当于撤销了最新的push
// 修改代码
// 修改好后,重新add,commit,push即可。
2、如何撤销一次commit?
如果你要同时撤销暂存区的话,就用--mixed参数,如果要撤销工作区的修改就用--hard参数,否则用--soft最安全。
git reset --hard HEAD~1 // 慎用--hard参数,除非你知道你自己在做什么
五、组合拳
聪明的你,一定想到了,想要利用好git强大的版本控制功能,要学会使用组合拳,如以下命令---
git stash // 暂存代码
git reset --参数 版本号
git push --force
等等
这就需要你多多练习了,不过好在git足够强大,只要你稍微注意一点,不会出现找不回代码的情况,因此可以放心大胆地随意尝试。