我有以下情况:
master A - B - E
/
second C - D - F
从主分支恢复“第二分支”的所有提交的最佳解决方案是什么?
'second'分支有大约70个提交。
答案 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 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'是合并提交。这将创建一个新的提交,恢复所做的更改。 我建议您先在存储库的副本中尝试此操作。此外,如果您正在与其他开发人员合作,则需要不来重写历史记录。第一种方法重写历史记录,所以我建议你使用第二种方法。
另外,请检查以下链接:
希望它有所帮助!
答案 2 :(得分:-1)
要还原它,它很容易,提交E是第二个分支中所有提交的合并提交,要做的是删除E(合并提交),然后在master分支中,将不再有来自第二分支。
然后就可以了。
第二个分支中的所有内容仍将保留。 对于master分支,没有更多来自第二分支的东西。