我已经将一个分支(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
是您不想要的合并提交,然后提交来自其他开发人员的A
到C
,他们已经提取了分支,然后推送。我们可以尝试使用范围为的git revert
git revert -m 1 HEAD~3^..HEAD
语法HEAD~3^..HEAD
意味着从HEAD
提交之前的三个提交(包括三个)恢复到包括HEAD
提交的一个提交。-m 1
选项告诉Git跟随分支的第一个父级,该父级通常是远程上的分支(合并的分支源为-m 2
)。
请注意,这里有必要git revert
,因为您已经发布了此分支。像硬重置和其他改变历史的选择在这里并不理想。