樱桃采摘合并提交时的主线父母号码

rin*_*t.6 22 git cherry-pick git-cherry-pick

假设这是我的git历史

  Z
 /
A -- C -- D
 \  /      
  B

我的HEAD目前在Z.我想樱桃挑选BC.如果我的理解是正确的,我应该这样做:

git cherry-pick B
git cherry-pick C -m 1
git commit --allow-empty
Run Code Online (Sandbox Code Playgroud)

它在我的情况下工作,因为C是一个无操作(因此之后的空提交,我需要提交其他原因),但我想知道后面的参数是什么-m.以下是我从文档中读到的内容:

-m父号

- 主线父母号码

通常你不能挑选合并因为你不知道合并的哪一边应该被认为是主线.此选项指定主线的父编号(从1开始),并允许cherry-pick重放相对于指定父级的更改.

在我的情况下,C有两个父母,但我怎么知道哪一个是1和2,更重要的是当我选择1或2时什么时候重要?

Sco*_*don 26

根据这个答案,我的理解是父1是被合并的分支,父2是被合并的分支.所以在你的情况下,父1是A,而父2是B.由于cherry-pick实际上是在两个提交之间应用diff,因此您-m 1只使用B(因为diff之间的差异AC包含更改B).对你来说,它可能并不重要,因为你之间没有提交AC.

所以是的,-m 1是你想要的,即使在A和之间有额外的提交也是如此C.

如果您想让新历史看起来更像原始历史,还有另一种方法可以做到这一点:

git cherry-pick B
git checkout Z
git merge --no-ff --no-commit B
git commit --author="Some Dev <someone@example.com>" --date="<commit C author date>"
Run Code Online (Sandbox Code Playgroud)

(如果需要,您可以B在挑选之前创建一个新分支.)

这将保留作者信息,应该给你一个如下所示的历史记录:

    B'
   /  \
  Z -- C'
 /
A -- C -- D
 \  /      
  B
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的:任何正常合并的*第一母公司*是你是在你做出合并的时候分支,让`-m 1`总是给人"的变化通过合并所带来的".但是,从图形绘制中无法分辨,因为这些信息在二维化过程中会丢失.(也就是说,我们可以*绘制*我们喜欢的图形:图形拓扑没有父排序.父排序是Git添加的.我们需要能够在每个顶点的每个出站弧上粘贴很少的计数数字,到代表Git的父母编号概念.) (3认同)