是否有可能获得 A 的直系后代是 B 直系祖先的修订列表?我尝试git log A..B
我会得到 B 的祖先不在 A 历史中的修订列表,这不是我想要的。我只需要直接连接 A 和 B 的修订。
是:将--ancestry-path
添加到修订规范中。 (这适用于任何使用提交图遍历的命令,包括git log
和git rev-list
。 但我要指出的是,我不确定你在这里所说的形容词"直接"是什么意思。
注意A..B
的意思是B ^A
,即使用集合ancestors(B) - ancestors(A)
(这里的减法是集合减法(。 加--ancestry-path
意味着在做集合减法后(或者更准确地说,在构造减去的集合时(,Git 还会减去任何不是否定修订A
后代的提交。
在内部,Git 通过使用名为 BOTTOM 的标志标记否定的提交哈希 ID(如A..B
或B ^A
中的A
(来实现这一点。 此类提交被收集到"底部列表"中,Git 确保每个可能在A..B
范围内的提交C都有一个底部提交作为其祖先之一。 例如,如果您使用git rev-list --ancestry-path X ^Y ^Z
,这很重要:提交可以是Y
或Z
的后代。
下面是一个示例图形片段,显示了哪些提交被选中(●
(或未选择(○
(,即使它们在A..B
的"范围内":
...--A--●---●--B--...
/
○--●--●
请注意,此处未选择提交A
,而是选择了提交B
。