3

我有以下情况:

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

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

“第二个”分支有大约 70 次提交。

4

3 回答 3

10

您应该看一下我为稍微不同的问题提供的答案,该问题涉及恢复合并提交。“恢复合并与重置合并”。这将解释 revert 是如何工作的,以及 reset 对于合并提交是如何工作的。在这种情况下,有人已经恢复,但在想要撤消恢复后出现了一些奇怪的行为 - 因此请在阅读此答案后查看,以便全面了解它的工作原理。

不要重置!

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

修改已经推送的历史通常是个坏主意。

使用 Git 还原

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

git revert E

还原该合并提交后,您将拥有以下历史记录...

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

G提交代表还原。该提交“撤消”了合并引入的更改。还原合并提交时需要注意一些问题。请阅读我关于“恢复合并与重置合并”的回答,了解它是如何工作的,以及以后如何撤消恢复。

于 2013-04-23T20:21:57.190 回答
6

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

git checkout master
git reset --hard HEAD^

我不推荐这样做,因为这会从你的分支中删除最后一次提交。

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

git checkout master
git revert HEAD -m 1 M

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

另外,请检查以下链接:

如何恢复错误的合并

改写历史

希望能帮助到你!

于 2013-04-23T16:53:14.357 回答
0

要还原它,很容易,commit E 是第二个分支中所有提交的合并提交,要做的就是删除 E(合并提交),然后在 master 分支中,第二个分支就没有更多的东西了。

  1. git结账大师
  2. git reset --hard HEAD^

然后就可以了。

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

于 2013-04-23T16:39:12.997 回答