【发布时间】:2008-10-20 10:40:12
【问题描述】:
我已经提交并推送了几个补丁: A1-->A2-->A3-->A4(头部)
每个人都将这些变更集提取到他们的本地副本中。
现在我们想要“回滚”到 A2,并从那里继续开发 - 基本上放弃 A3 和 A4。最好的方法是什么?
【问题讨论】:
标签: git
我已经提交并推送了几个补丁: A1-->A2-->A3-->A4(头部)
每个人都将这些变更集提取到他们的本地副本中。
现在我们想要“回滚”到 A2,并从那里继续开发 - 基本上放弃 A3 和 A4。最好的方法是什么?
【问题讨论】:
标签: git
从你的工作副本的根目录执行
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 之上的本地提交重新定位到新origin/master 之上)。但 Git 不会自动执行此操作,因此您必须与每个协作者协调。简而言之,不要那样做。
【讨论】:
丢弃这些提交可能会对从您的存储库中提取的任何人产生一些负面影响。作为另一种选择,您可能需要考虑从 A2 开始创建替代开发分支:
A1-->A2-->A3-->A4 (master/HEAD) \ -->B1-->B2(新主/HEAD)这样做很简单
git branch new-master master~2【讨论】:
您需要git-revert 和 要保留 A3 和 A4 并记录您正在还原的事实,请使用 git-reset,具体取决于您要如何处理 A3 和 A4。要删除 A3 和 A4 的所有痕迹,请使用 git-reset --hard。git-revert。
编辑:Aristotle Pagaltzis 的git-checkout 解决方案更胜一筹,但对于小型还原,我认为git-revert 没有问题。尽管如此,我还是希望将来支持Aristotle Pagaltzis's answer
我发现git magic 是一个很好的 git 资源。
【讨论】: