让我们考虑这种情况:
---A---B---C---D---E---F---G---H---I---J--- (master from upstream)
D'--F' J' (releases from upstream)
P---Q (own branch)
我们希望将我们自己的所有分支合并或修补到 J' 上。
当P---Q是主分支的直系后代时,我没有遇到太多麻烦。但是,在这个用例中,我遇到了许多与我自己的分支中未触及的文件相关的合并冲突。这些冲突源自此示例中的 D'---F' 部分。所以我从 F'---Q 生成了一个差异,并尝试将其应用于 J'。结果:许多应用错误。另一种方法,git-format-patch F'---Q,然后git am -3 -k也被证明不是一个有效的解决方案。实际上,这与合并解决方案非常相似。我也尝试过变基。再次:许多我没有接触的文件出现在变基过程中。
有干净的解决方案吗?
我开始意识到由 git 格式补丁生成的提交数量远远超过绝对必要的。处理此问题并格式化补丁较小的提交范围导致更好地处理 git am 迭代。为了解释发生了什么,我扩展了图表:
---A---B---C---D---E---F---G---H---I---J--- (master from upstream)
D'--F' J' (releases from upstream)
M---N---P---Q (own branch)
M--N 是以前的提交,基于 master。P 是一个合并的提交,所以
git format-patch F'..Q
导致一个在历史上更深的补丁系列(我的情况:大约 60 个),以及非常奇怪的 Git AM 迭代。当使用格式补丁 P---Q 时,我得到了大约 30 次提交(实际上,P---Q 是一种简化)。现在 git am 迭代会导致 git mergetool 步骤,这些步骤与自 P 以来的提交有明确的关系,并且是可管理的。