我需要暂时撤消合并,以便以后可以再次尝试

  • 本文关键字:合并 撤消 git merge
  • 更新时间 :
  • 英文 :


我已经将一个分支(feature/b)合并到develop中,我遇到了合并冲突,我在如何解决这些冲突方面做出了错误的决定。然后,我做出了一个手动承诺来解决其他一些问题。更多的提交进入了feature/b,然后我也合并了这些然后我意识到我的错误,并恢复了最后一次合并。

一切都被推到了遥控器上,并被团队拉了出来。

事情现在一团糟。我需要再次获得稳定的发展,但也能够再次尝试解决原始合并中的冲突。

解决这个问题的最佳选择是什么?

  • 恢复所有三个步骤?如果我理解正确的话,这不是给我第二次机会来解决最初的冲突吗
  • 重置磁头?有效地破坏历史?这会影响其他分支的历史吗
  • 在我去之前放弃并创建例如develop2分支错了吗

我已经阅读了这个密切相关的答案,但我正在寻找更多的指导:如何恢复';s已经推送到远程分支?

这听起来确实是一个混乱的局面。

我的方法是你最后的建议:在出现问题之前放弃并创建一个新的开发分支。在该分支上,您可以重做未正确完成的合并,然后仔细挑选在错误合并后完成的所有好的提交。推动这一点,并要求团队开发新的开发分支。

这个解决方案的优点是,如果有人在坏的dev分支上取消了提交,他们也可以私下挑选好的提交。

无论您做什么,都不要重置和推送强制develop,因为它与其他开发人员共享,并且会变得更混乱。

您可以恢复,但正如您所看到的,请注意,以前合并的提交将在未来的合并中被忽略(因为历史没有改变)。我会重新创建功能分支,就好像它是一个新分支一样。

通过指定从哪个提交开始rebase,您可以使用rebase轻松地完成这一操作,这在您提供的链接中有解释。

假设我们处于这种情况

/B-C(feature/1)
A-----D-E(develop)

其中A是合并前的develop和分支的起源,C是合并时的feature/1分支,D是合并提交,E是修复它的尝试。

首先恢复D和E,因为D是合并提交,所以必须使用-m指定要恢复到哪个父级,它应该是1,但要检查(git revert D -m 1)。然后在提交A(分支的起源)时重新建立分支feature/1的基础

git checkout feature/1
git rebase --no-ff A (no-ff to force rebase)

然后你会变成这样:

/B-C
A-----D-E-F(develop)
B'-C'(feature/1)

其中F是还原的提交,B和C是新创建的提交。

您可以将feature/1合并为一个新分支。

这个答案假设您当前的feature/b分支看起来像这样:

feature/b:  .. M -- A -- B -- C

这里的M是您不想要的合并提交,然后提交来自其他开发人员的AC,他们已经提取了分支,然后推送。我们可以尝试使用范围为的git revert

git revert -m 1 HEAD~3^..HEAD

语法HEAD~3^..HEAD意味着从HEAD提交之前的三个提交(包括三个)恢复到包括HEAD提交的一个提交。-m 1选项告诉Git跟随分支的第一个父级,该父级通常是远程上的分支(合并的分支源为-m 2)。

请注意,这里有必要git revert,因为您已经发布了此分支。像硬重置和其他改变历史的选择在这里并不理想。

最新更新