使用 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