在合作的过程中,难免会遇到需要回滚的时候,分为本地和远程回滚。
某天,程序员 小A 喝了很多很多很多的酒,然后开始写代码 。
A开始改代码中一个文件,改了半个小时,运行之后,发现已经不知道自己在写什么,想 把这个文件恢复到该之前的样子
git checkout xxx.file //恢复单个文件
A恢复了之后,思路变的清晰了不少,下笔如神,重新改好, commit
了工作区的变动,这时A发现: 我的天,我都改了什么?这代码可太 low 了。我可不能提交我丑陋的代码!
,他做了撤销
git reset --soft HEAD^ //撤销 缓存区
然后又接着修改了代码,终于再三思量,提交了三次 commit 。
A 提交了三次代码,已经是凌晨2点,A去线上 pull
之后跑了一遍项目,瞬间头脑清醒,发现由于环境不一致,导致了 bug ,思考之后,发现暂时无法解决,只好回滚,小A首先将自己本地代码仓库回滚到,上一次
的版本,可以通过 reset
来回滚。
首先需要知道之前提交的版本号,小A通过 git log
查看提交版本
commit 25de78c066faccf5732dc86c62ebd9e85a7d6015
Author: XXX <xxxx@xx.com>
Date: Wed Sep 6 15:39:58 2017 +0800
最新一次提交
commit 85c16a9c048a035c4796f373b8816c0b2f017d18
Author: XXX <xxxx@xx.com>
Date: Wed Sep 6 13:33:56 2017 +0800
上一次提交
commit 9425c47b6cb54cdb06127749488bc48243832ad7
Author: XXX <xxxx@xx.com>
Date: Wed Sep 6 13:33:56 2017 +0800
倒数第三次提交
...
git reset --hard HEAD^ //撤销工作区到上一个版本
小A又觉得或许应该将代码回滚到 上两次
的版本
git reset --hard 9425c47b6 //版本号可以省略写
或
git reset --hard HEAD~2
小A 一看,居然将本地版本回滚到了倒数三次的版本,他生气给了自己一巴掌。然后
git reset --hard 85c16a9c
终于将版本恢复到了倒数第二次提交,可气的是,小A太过激动,把水杯打翻了,电脑 cila
就关机了,小A 颤抖着双手,终于把电脑重新开启,他只想知道自己刚刚reset 了没有,于是小A
git reflog
25de78c HEAD@{0}: reset: moving to 85c16a9c
看到了,最近的操作记录,已经会滚到了倒数第二次提交,这时候,A将他本地的代码, 回滚到了他想到的版本,但是远程仓库还是停留在最新版本,他 叹了口气,-f
推上去,这样远程的版本就被撤销了。
git push -f
注:有些 git server 不允许这样做,比如gitlab ,但是可以通过管理员开启。
这样,A 就将本地和远程master 都恢复到了上两次提交的版本。小A迷迷糊糊的把 QQ 签名改成 “喝酒不写码,写码不喝酒” ,然后便一头栽进枕头,呼呼入睡。
推荐一篇详细的介绍文章 :git reset /revert的使用方法