回到Git

时间:2008-10-20 10:40:12

标签: git

我已经提交并推送了几个补丁: A1-> A2-> A3-> A4(HEAD)

每个人都将这些变更集合到他们的本地副本中。

现在我们要“回滚”到A2,并从那里继续发展 - 基本上扔掉了A3和A4。最好的方法是什么?

3 个答案:

答案 0 :(得分:45)

从工作副本的根目录开始

git checkout A2 -- .  
git commit -m 'going back to A2'

为此目的使用git revert会很麻烦,因为你想要删除一系列提交,revert一次撤消一次。

您也不想要git reset。这只会改变你的master分支指针:你没有记录错误的方向。协调也很痛苦:因为您更改master的提交不是远程存储库的master分支指针的子项,所以推送将失败 - 除非您添加-f(强制)或者首先删除远程存储库中的master分支,然后通过推送重新创建它。但是,那些尝试提取的人仍然会在其本地master分支中拥有旧历史记录,因此一旦origin/master出现分歧,git pull将尝试执行合并。这不是世界的终点:他们可以通过git rebase --onto origin/master $old_origin_master_commit master来摆脱这种情况(即将他们在旧origin/master之上做出的本地提交改为新{{1}的顶部}})。但Git不会知道自动执行此操作,因此您必须与每个协作者协调。简而言之,不要这样做。

答案 1 :(得分:7)

丢弃这些提交可能会对从存储库中提取的任何人产生一些负面影响。作为另一种选择,您可能需要考虑从A2开始创建备用开发分支:

A1-->A2-->A3-->A4 (master/HEAD)
      \
       -->B1-->B2 (new-master/HEAD)

这样做就像

一样简单
git branch new-master master~2

答案 2 :(得分:5)

您需要git-revert git-reset,具体取决于您要如何对待A3和A4。要删除所有A3和A4的痕迹,请使用git-reset --hard要保留A3和A4并记录您要恢复的事实,请使用git-revert

编辑:亚里士多德Pagaltzis的git-checkout解决方案非常出色,但对于小型恢复,我认为git-revert没有问题。尽管如此,我要求将来的投票给予Aristotle Pagaltzis's answer

我发现git magic是git的一个很好的资源。