我需要暂时撤销一次合并,以便稍后重新尝试。

3
我已将一个分支(feature/b)合并到develop中,出现了合并冲突,并且我做出了错误的决定来解决它们。然后我手动提交以修复其他问题。更多的提交进入了feature/b,然后我也合并了这些提交。然后我意识到了我的错误,并撤销了最后一次合并。所有内容都被推送到远程,并被团队拉取。现在情况很混乱。我需要让develop再次稳定下来,但也要能够重新尝试解决原始合并中的冲突。那么,我最好的选择是什么?1.撤销所有三个步骤吗?如果我理解正确,这不会让我有第二次修复原始冲突的机会?2.重置头?有效地破坏历史记录?这会影响其他分支的历史记录吗?3.放弃并创建例如develop2分支,在我犯错之前?我已经阅读了这个紧密相关的答案,但我正在寻求更多指导:如何撤销已推送到远程分支的合并提交?
3个回答

4
这听起来确实是一种混乱的情况。
我的建议是采用你最后提出的建议:在事情出错之前放弃并创建一个新的开发分支。在那个分支上,您可以重新执行未正确完成的合并,然后挑选所有在不正确合并后完成的好的提交。推送它并要求团队在新的开发分支上工作。
这种解决方案的优点是,如果有人在错误的开发分支上有未推送的提交,他们也可以将其私下挑选到好的分支上。

2

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

你可以回退,但是要注意,之前合并的提交将在未来的合并中被忽略(因为历史记录没有改变)。 我建议重新创建功能分支,就像它是一个新的分支一样。

你可以通过指定从哪个提交开始进行变基来轻松完成此操作,这就是你提供的链接所解释的内容。

假设我们处于这种情况:

 /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 合并,就像它是一个新分支一样。


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提交(包括HEAD提交)的所有提交。选项-m 1告诉Git遵循分支的第一个父提交,通常这将是远程分支(合并源的分支将是-m 2)。请注意,必须在此处使用git revert,因为您已经发布了此分支。像硬重置和其他更改历史记录的选择在这里都不是理想的选择。

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