分步合并Git分支的提交记录?

11

我有一个相对较大的功能分支,希望将其合并到主分支(master),但是合并会产生很多冲突。有没有一种方法可以逐个提交地合并这些分支,以便我可以逐个解决冲突并检查是否一切正常?

我能想到的一个解决方案是使用rebase而不是merge,但是历史记录将变得平坦,我不想要那样。如果有帮助的话,我可以创建额外的“合并修复”提交。


3
你可以考虑使用git-imerge。请参阅https://dev59.com/PWMl5IYBdhLWcg3wwZEq和https://dev59.com/jHzaa4cB1Zd3GeqPS6uT。 - torek
@torek 谢谢,看起来就是我需要的。 - Dunno
值得一提的是,我曾经尝试在一个庞大的代码库中使用imerge,但速度太慢了。在花费了数天时间后,我们尝试了另一种方法,并且完成得更快。我还有第三种选择(在选定的点进行手动合并)作为另一种策略,但从未有时间尝试。最终行之有效的替代方案基本上是“重新做我们所做的事情,从新的代码库开始”,即大约400个cherry-pick操作的等效操作。 - torek
2个回答

6
您可以“逐个提交”合并,但这将为您在另一个分支上有的每个提交创建一个合并提交,这相当繁重。
要做到这一点,只需查看您从哪里分离出来的master,然后在master分支上,从那里开始为每个提交发出git merge <commit_id>命令。
否则,只需一次性解决大问题,每个阅读您提交历史记录的人都会感激您。
解决此问题的好方法是定期将主分支合并到您的功能分支中。

1
压缩所有合并提交是否可行,还是会出现问题? - Dunno
我不建议压缩合并提交,因为这会使历史记录变得奇怪,到处都是章鱼式的合并。 - blue112
我认为这是一个理想的压缩地点,因为您将合并的各个阶段合并为一个提交。 - tpower

6

不要将大的特性分支进行变基,而是可以对其进行复制并进行变基。在变基后解决所有的冲突后,你可以将差异拉回:

$ git checkout -b big_feature_branch.rebased big_feature_branch
$ git rebase master big_feature_branch.rebased
# Resolve all conflicts
$ git checkout big_feature_branch
$ git diff big_feature_branch big_feature_branch.rebased | git apply -
$ git commit -am "merge fix"
$ git branch -D big_feature_branch.rebased

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