停止cherry-picking,开始合并,第9部分:追踪提交
原作者: Raymond Chen
原文链接: Stop cherry-picking, start merging, Part 9: Chasing the commit
翻译日期: 2024年5月
考虑以下情况:
%%{init: { 'gitGraph': {'showBranches': true, 'showCommitLabel':true, 'mainBranchName': 'master'}} }%%
gitGraph
commit id: "A (apple)"
branch victim
checkout victim
commit id: "V1 (apple)"
branch feature
checkout feature
commit id: "F1 (apple)"
commit id: "F2 (berry)"
checkout victim
commit id: "V2 (apple)"
merge feature id: "V3 (berry)"
checkout feature
commit id: "F3 (cherry)"
checkout master
commit id: "M1 (apple)"
从一个共同的起始提交A(其中包含的行是"apple")开始,master分支进行了一个无关的提交M1。同时,我们从提交A创建了一个名为"victim"的新分支,在该分支上进行了无关的提交V1和V2。从提交V1,创建了另一个名为"feature"的分支,在其上进行了一个无关的提交F1。在提交F1之后,有另一个提交F2,将该行从"apple"更改为"berry"。此时,feature分支合并回victim分支,形成合并提交V3,其中该行现在是"berry"。在合并之后,feature分支进行了另一个提交F3,将该行从"berry"更改为"cherry"。
此时,你决定要将提交F2(将"apple"更改为"berry"的那个)应用到master分支。也许F2修复的问题你原本认为只是feature分支的本地问题,但后来发现它也影响了master分支,现在master分支的管理者希望获取你的临时修复。
于是我们按照我们的方法进行操作。补丁分支以提交A为起点,cherry-pick了F2的副本,并将其合并到master分支中。
%%{init: { 'gitGraph': {'showBranches': true, 'showCommitLabel':true, 'mainBranchName': 'master'}} }%%
gitGraph
commit id: "A (apple)"
branch patch
checkout patch
commit id: "P (berry)"
branch feature
checkout feature
commit id: "F1 (apple)"
commit id: "F2 (berry)"
commit id: "F3 (cherry)"
checkout victim
commit id: "V1 (apple)"
commit id: "V2 (apple)"
merge feature id: "V3 (berry)"
commit id: "? (未确定)" type: HIGHLIGHT
checkout master
commit id: "M1 (apple)"
merge patch id: "M2 (berry)"
但是合并对的另一半怎么办?补丁分支应该合并到feature分支吗?
不,合并到feature分支没有帮助。提交F2已经被合并到victim分支,并且正在通过合并进入master分支的路上。此时对feature分支的任何更改都不会影响已经上路的有效载荷。
你必须将补丁分支合并到那些已经将原始更改传递到最接近目的地和将cherry-pick传递到最接近源头的分支中。在我们的例子中,源是feature分支,目的地是master分支。提交已经合并到了victim分支,所以补丁需要应用的地方就是那里。因为补丁分支的目的是确保当原始提交(F2)和它的cherry-picked副本(M2)相遇并需要合并时,正确的事情会发生。
换句话说,你需要追上这趟列车。
%%{init: { 'gitGraph': {'showBranches': true, 'showCommitLabel':true, 'mainBranchName': 'master'}} }%%
gitGraph
commit id: "A (apple)"
branch patch
checkout patch
commit id: "P (berry)"
branch feature
checkout feature
commit id: "F1 (apple)"
commit id: "F2 (berry)"
commit id: "F3 (cherry)"
checkout victim
commit id: "V1 (apple)"
commit id: "V2 (apple)"
merge feature id: "V3 (berry)"
merge patch id: "V4 (berry)"
checkout master
commit id: "M1 (apple)"
merge patch id: "M2 (berry)"
merge victim id: "M3 (berry)"
补丁分支的正确合并目标是victim分支,产生提交V4。这样,当victim分支作为提交M3与master分支合并时,提交P成为一个合格的合并基础。