停止cherry-picking,开始合并,第5部分:利用三向合并

87 阅读1分钟

停止cherry-picking,开始合并,第5部分:利用三向合并

原文链接: Stop cherry-picking, start merging, Part 5

在上一篇文章中,我们看到了如何利用递归合并算法来处理多个cherry-pick的情况。但是,递归合并算法有一个限制:它只能处理cherry-pick之间没有冲突的情况。如果cherry-pick之间有冲突,递归合并算法就无法正确处理。

在这种情况下,我们可以利用git的三向合并算法。三向合并算法是git的另一个合并策略,它能够处理任意复杂的合并情况,包括cherry-pick之间的冲突。

让我们看看这是如何工作的。假设你有以下提交历史:

%%{init: { 'gitGraph': {'showBranches': true, 'showCommitLabel':true, 'mainBranchName': 'master'}} }%%
gitGraph
   commit id: "A"
   branch feature
   checkout feature
   commit id: "F1"
   commit id: "F2"
   commit id: "F3"
   commit id: "F4"
   checkout master
   commit id: "M1"
   commit id: "M2" type: REVERSE
   commit id: "M3"
   commit id: "M4" type: REVERSE

其中M2是F2的cherry-pick,M4是F4的cherry-pick,并且F2和F4之间有冲突。如果你使用git merge -s recursive -X patience feature,git会使用三向合并算法,并且会尝试找到最佳的合并基础。

三向合并算法会考虑所有可能的合并基础,并选择能够产生最少冲突的那个。在这个例子中,git可能会选择F2作为合并基础,因为F2是F4的祖先,并且F2和F4之间的冲突最少。

这样,git就会尽可能地减少冲突,并且能够正确处理cherry-pick之间的冲突。三向合并算法是处理复杂合并情况的最佳选择。

导航