Git - 推送后恢复合并的所有提交

时间:2013-04-23 16:32:53

标签: git

我有以下情况:

master A -  B -  E 
                / 
second   C -   D - F

从主分支恢复“第二分支”的所有提交的最佳解决方案是什么?

'second'分支有大约70个提交。

3 个答案:

答案 0 :(得分:10)

你应该看看我提供的一个稍微不同的问题的答案,其中涉及恢复合并提交。 "Reverting Merges vs. Resetting Merges"。这将解释revert如何工作以及重置提交的重置方式。在这种情况下,有人已经恢复,但在想要撤消恢复后有一些时髦的行为 - 所以看看这个答案后你就可以全面了解它是如何工作的。

不要重置!

在推送提交后使用git-reset意味着您已经更改了其他人已有的历史记录,这很糟糕。如果重置,则实际上是在重绕历史记录。要推动这一点,您需要执行forced push。然后,其他开发人员需要知道使用git-fetch后跟git reset --hard origin/master,如果他们在您删除合并提交后有新的提交,他们甚至可能需要执行复杂的git rebase --onto。另外,他们最终会推迟你重置的同一个提交。

修改已被推送的历史记录通常是糟糕的想法。

使用Git Revert

使用git revert创建一个新的提交,它会否定合并提交的内容而不是重写它。它会让你在历史中前进而不是修改历史。

git revert E

恢复合并提交后,您将拥有以下历史记录......

master A -  B -  E  - G 
                / 
               /
second   C -  D - F

G提交代表恢复。该提交“撤消”合并引入的更改。还原合并提交时需要注意的问题。请阅读"Reverting Merges vs. Resetting Merges"上的答案,了解其工作原理,以及如何撤消以后的还原。

答案 1 :(得分:6)

我假设'E'是合并提交。有两种简单的方法可以做到这一点。一种是重置您从分支 master 的最后一次提交:

git checkout master
git reset --hard HEAD^

我不建议这样做,因为这将删除 分支的最后一次提交。

现在第二个选项是恢复提交:

git checkout master
git revert HEAD -m 1 M

您必须传递 -m 选项,因为'E'是合并提交。这将创建一个新的提交,恢复所做的更改。 我建议您先在存储库的副本中尝试此操作。此外,如果您正在与其他开发人员合作,则需要来重写历史记录。第一种方法重写历史记录,所以我建议你使用第二种方法。

另外,请检查以下链接:

how to revert a faulty merge

rewriting history

希望它有所帮助!

答案 2 :(得分:-1)

要还原它,它很容易,提交E是第二个分支中所有提交的合并提交,要做的是删除E(合并提交),然后在master分支中,将不再有来自第二分支。

  1. git checkout master
  2. git reset --hard HEAD ^
  3. 然后就可以了。

    第二个分支中的所有内容仍将保留。 对于master分支,没有更多来自第二分支的东西。