Yafei's Blog

Git 提交错误之后强制回滚

使用 Git 常常会出现缺乏考虑的 commit,当 commit 发生之后希望回滚到之前的某个版本后,就会出现无法 push 到远程库的情况。原因是远程库默认是有「协作」属性的,而如果单方面的强制从c 版本回滚到 a 版本,再从 a 版本的基础上创作,这相当是「否认历史」,那么如果某个人也在用这个 remote,强制 push 之后置他于何地呢?

看到 Ruby China 上的一个帖子,找到了解决办法。

比较稳妥的方法是 revert,给个例子:

当前的 commit 记录

$ git log commit e7c8599d29b61579ef31789309b4e691d6d3a83f Author: fsword <[email protected]> Date: Sat Jun 8 14:27:11 2013 +0800 补充后续计划和调整方案 commit d501310d245fe50959e8bcc1f5465bb64d67d1c8 Author: fsword <[email protected]> Date: Fri Jun 7 14:36:49 2013 +0800 完成基本的设计 ...

决定放弃最近提交的 e7c8599d29b61579ef31789309b4e691d6d3a83f

git revert e7c8599d29b61579ef31789309b4e691d6d3a83f

现在查看log,发现多了一次commit,其内容就是回到了原来的那个阶段

commit 7752d450a91a4c9663f5cd03f7ef3ff6d4848a12 Author: fsword <[email protected]> Date: Tue Jun 11 01:35:58 2013 +0800 Revert "补充后续计划和调整方案" This reverts commit e7c8599d29b61579ef31789309b4e691d6d3a83f. commit e7c8599d29b61579ef31789309b4e691d6d3a83f Author: fsword <[email protected]> Date: Sat Jun 8 14:27:11 2013 +0800 补充后续计划和调整方案 commit d501310d245fe50959e8bcc1f5465bb64d67d1c8 Author: fsword <[email protected]> Date: Fri Jun 7 14:36:49 2013 +0800 完成基本的设计 ...

比较一下,发现已经和提交前一样了

$ git diff d501310d245fe50959e8bcc1f5465bb64d67d1c8 $

当然,除了 revert,依然可以强制 push,命令是 git push -f,比如:

git push origin dev -f