Git cherry-pick range

3

我该如何挑选提交记录 C4C5

GitTree

我尝试过使用 git cherry-pick C4..C5,但是我只得到了 C4。我认为我并不真正理解这个范围的含义。

2个回答

6

简而言之:C4^..C5

除非命令对其进行特殊处理(git cherry-pick 不包括在内),范围表达式的意思是“获取由右侧名称标识/可查找到的所有提交,减去由左侧名称标识/可查找到的所有提交”。在本例中,C5 标识了从0到5(含)的提交,而C4 标识了从0到4(含)的提交。从第一个集合中减去第二个集合后,您只剩下C5

另一种看待它的方式是,如果提交有关,则可以获得“半开区间”,就像整数(3,7]中的 4 5 6 7 一样。

与半开整数区间一样,通常的易于处理的技巧是从一步向后开始。由于C4的(第一个)父级是C4^,因此C4^..C5就足够了,就像(2,7]可以获得3 4 5 6 7一样。

(如果没有父级,即左侧是根提交,则需要某种替代策略。有些命令使这更容易,有些则更难,但现在我们可以忽略这个问题。:-))


非常感谢您的回答。我现在明白它是如何工作的了。C4和C5都是在分支b1上创建的。有没有一种方法可以挑选出在分支b1上创建的所有提交? - musium
通常,您不希望获取可从分支标签访问但无法从“HEAD”访问的所有提交(如果这样做,往往更合理的做法是合并,可能使用--no-ff强制进行真正的合并)。然而,如果您确实需要,可以利用在 A..B 中没有要求 AB 的祖先的事实。例如,如果 b1 指向提交C5,并且您想要从那里返回到根的所有提交,减去任何已经在 HEAD 上的提交,则 HEAD..b1 可以解决问题。 - torek

1
在这种特定情况下,您不需要使用范围。
来自man git-cherry-pick的示例:
 git cherry-pick master~4 master~2
           Apply the changes introduced by the fifth and third last commits pointed to by master and create 2 new commits with these changes.

所以对于您来说:
git cherry-pick C4 C5

非常感谢您的回答。它完美地运作,但我认为在实际应用中,我需要处理范围(因为不仅仅会有两个提交)。 - musium
实际上,我只在弄糟了的时候才进行“cherry-pick”。如果可能的话,我更喜欢使用“rebase”,而不是对范围进行“cherry-pick”。 - Gauthier
嗯...我不确定我的真实场景是否可以使用rebase完成...我创建了一个新问题,描述我尝试解决的“整个”问题。 - musium

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接