停止cherry-picking,开始合并,第4部分:利用递归合并算法

68 阅读1分钟

停止cherry-picking,开始合并,第4部分:利用递归合并算法

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

在上一篇文章中,我们看到了如何使用--strategy-option=merge-base选项来避免cherry-pick导致的合并冲突。但是,这种方法有一个限制:它只能处理单个cherry-pick的情况。如果你有多个cherry-pick,或者cherry-pick之间有依赖关系,这种方法就不适用了。

在这种情况下,我们可以利用git的递归合并算法。递归合并算法是git的默认合并策略,它能够处理多个共同祖先的情况。当git遇到多个共同祖先时,它会自动创建一个虚拟的合并提交,作为新的合并基础。

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

%%{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。如果你使用git merge feature,git会看到两个共同祖先:A和F2。git会创建一个虚拟的合并提交,作为新的合并基础,然后基于这个新的合并基础进行合并。

这样,git就会正确地处理合并,而不会产生不必要的冲突。递归合并算法能够处理任意复杂的cherry-pick情况,只要cherry-pick的提交之间没有冲突。

导航