Git - 撤销推送后合并的所有提交

3

我有以下情况:

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

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

1
你说的“revert”是什么意思?你不想要E提交吗? - TheOneTeam
我已经将第二个分支与主分支合并并进行了推送。现在,我想从我的主分支中排除第二个分支的所有提交。 - kemenov
6
请抽出时间写出“你”。在 Stack Overflow 上不欢迎使用聊天语。 - user229044
@feak 请更新你的可视化。我不明白第二个分支如何能够向两个方向生长。 - JJD
3个回答

11

你应该查看我为一个略有不同的问题提供的答案,其中涉及到撤销合并提交。 “Reverting Merges vs. Resetting Merges”。这将解释revert如何工作以及与合并提交相关的reset如何工作。在那种情况下,某人已经reverted了,但是想要撤销revert后出现了一些奇怪的行为-所以在阅读完这个答案后,请看一下那个答案,这样您就可以完全理解它的工作原理。

不要使用Reset!

在推送了提交后使用git-reset意味着您已更改其他人已经拥有的历史记录,这很糟糕。如果您重置,您实际上是在倒回历史。为了将其推送,您需要执行强制推送。然后,其他开发人员将需要知道使用 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提交代表还原。该提交“撤销”合并引入的更改。还原合并提交时需要注意一些问题。请阅读我的答案“撤消合并与重置合并”,了解其工作原理以及如何稍后撤消还原。


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

git checkout master
git reset --hard HEAD^

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

现在的第二个选项是还原提交:

git checkout master
git revert HEAD -m 1 M

你需要通过-m选项进行传递,因为'E'是一个合并提交。这将创建一个新的提交来撤销所做的更改。我建议在其他副本中尝试此操作,然后再进行其他操作。另外,如果您正在与其他开发人员合作,请不要重写历史记录。第一种方法会重写历史记录,因此建议使用第二种方法。
还要查看以下链接: 如何恢复有问题的合并 重写历史记录 希望对您有所帮助!

0

要还原它非常容易,提交 E 是第二个分支中所有提交合并的提交,需要做的是删除 E(合并提交),然后在主分支中,就不会再有来自第二个分支的任何内容了。

  1. git checkout master
  2. git reset --hard HEAD^

然后就可以了。

第二个分支中的所有内容仍将保留。 对于主分支,不再有来自第二个分支的任何内容。


6
我给你的回答点了个踩。你说“恢复”很容易,但是接下来描述的是“重置”。请注意区分这两者的含义。 - eddiemoya
2
因为“重置”与“还原”不同,并且合并已经被推送,所以被踩是很糟糕的选择。在这种情况下,你应该使用“还原”。 - Courtney Miles
提及以此方式重置的缺点是很好的,应该只在你能确定没有人获取正在删除的提交时才进行,或者你可以直接与已经获取该提交的人沟通,以便修复他们的仓库中的问题。 - bames53
1
很不幸,这个答案被接受了,但如果你在主分支上有更多的提交,它是错误的。reset <> revert. - Guntram Blohm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接