我有以下情况:
master A - B - E
/
second C - D - F
什么是从主分支恢复“第二个分支”的所有提交的最佳解决方案?
“第二个”分支有大约70个提交。
我有以下情况:
master A - B - E
/
second C - D - F
你应该查看我为一个略有不同的问题提供的答案,其中涉及到撤销合并提交。 “Reverting Merges vs. Resetting Merges”。这将解释revert如何工作以及与合并提交相关的reset如何工作。在那种情况下,某人已经reverted了,但是想要撤销revert后出现了一些奇怪的行为-所以在阅读完这个答案后,请看一下那个答案,这样您就可以完全理解它的工作原理。
在推送了提交后使用git-reset
意味着您已更改其他人已经拥有的历史记录,这很糟糕。如果您重置,您实际上是在倒回历史。为了将其推送,您需要执行强制推送
。然后,其他开发人员将需要知道使用 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
提交代表还原。该提交“撤销”合并引入的更改。还原合并提交时需要注意一些问题。请阅读我的答案“撤消合并与重置合并”,了解其工作原理以及如何稍后撤消还原。
git checkout master
git reset --hard HEAD^
我不建议这样做,因为这将从您的主分支中删除最后一次提交。
现在的第二个选项是还原提交:
git checkout master
git revert HEAD -m 1 M
要还原它非常容易,提交 E 是第二个分支中所有提交合并的提交,需要做的是删除 E(合并提交),然后在主分支中,就不会再有来自第二个分支的任何内容了。
然后就可以了。
第二个分支中的所有内容仍将保留。 对于主分支,不再有来自第二个分支的任何内容。