发个老梗,关于GIT如何回退已经提交的COMMIT,以及如何撤销未完成的合并。
无论是当年的VSS再到后来的TFS,然后是SVN再到今日的GIT,只要是跟源代码管理(Source Control)相关的管理工作都可能带来这一问题,那么这里就简单说一下。
(顺便贴个以前的工作笔记https://www.cnblogs.com/matong/p/5619760.html)
任何还没有PUSH到远端(origin),但已经被提交到本地(local)的commit,都可以用以下命令回退。
git reset HEAD~1 --hard
这cmd的意思就是说跑git.exe里的reset方法,用当前的HEAD回退一步,这一步或许不止包含一个变动(changes),并且用--hard 硬的指令。
关于各种方法,参数的使用请详查git官方文档。
当然,你可以跑多次这个命令来一步步回退到你想要的地方,你也可以找到想要回退commit-id来进行
git reset --hard <sha1-commit-id>
注意:这样回退你所修改的代码就会直接被清掉了,但是可以用git log来查看。这个不展开了。
当然,如果你的commit已经push到远端(origin)了,你还可以通过以下命令强行覆盖提交历史(history),这一句是跑在上面回退本地提交之后的。
git push origin HEAD --force
有童鞋就可能奇怪了,怎么这里用的是git push,其实原因就是我们这里做的根本不是什么回退动作,而是直接用我们刚刚回退整理好的版本强行覆盖(--force)远端(origin),无论你是不是在做回退的操作,其实只要是需要覆盖远端的时候都会用到这个。
但这里可能会产生一个新的问题,就是你想要强制回退且强行覆盖的commit,如果被其他同事拉取(pull)了的话,当这位同事再次推送(push)这个分支的时候,那么这个原本被干掉的commit依然会被提交到现有分支上。目前不知道怎样才是一个最好的方法(这里找到了吕毅MVP大神的解决方案,很不错建议看一看),我们自己得话是喊这个分支相关的人,让他们把他们本地这个分支改个名字,然后重新检出(checkout)这一分支。
OK,到这里已经能完整地回退一个或一个已经提交的commit了,接下来另一个问题,如何撤销未完成的合并。
什么叫“未完成的”合并?
就是起了一个合并头(merge),但是没有完成提交动作(commit),这就是未完成的合并,这个我们经常会用在一些检查点,看看我已经提交的东西跟主线(master)或者其他开发主线的总差别有多少;或者是在尝试做合并的时候,艾玛,上千个冲突差点想要删库的时候。
当然,其实是可以先把合并给提交了,然后利用前面的git rest方法来回退的,对,这个也是我以前的笨方法。但是有更加有效的,那就是
git merge --abort
Mission Abort, repeat, Missioern Abort. 不好意思,傻逼病又犯了。
嗯,今天就到这里。祝各位码农在撸管撸git的路上越撸越开心,越射越远。