git - 获取连接到 B 的 A 的直接后代

git - get direct descendants of A that connect to B

是否可以获取 A 的直接后代是 B 的直接祖先的修订列表?我我尝试 git log A..B 我将获得 B 的祖先版本的修订列表,这些版本不在​​ A 的历史记录中,这不是我想要的。我只需要直接连接 A 和 B 的修订。

是:将 --ancestry-path 添加到您的修订规范中。 (这适用于任何使用 commit-graph-walking 的命令,包括 git loggit rev-list。)但我会指出,我不确定你在这里所说的形容词 "direct" 是什么意思.

注意A..B表示B ^A,即使用集合ancestors(B) - ancestors(A)(这里的减法是集合-减法)。添加 --ancestry-path 意味着在进行集合减法之后(或者更准确地说,在构造减去的集合时),Git 也会减去任何不是否定修订 A 的后代的提交。

在内部,Git 通过使用名为 BOTTOM 的标志标记否定的提交哈希 ID(如 A..BB ^A 中的 A)来做到这一点。这样的提交被收集到 "bottom list" 和 Git 中确保每个可能在 A..B 范围内的提交 C 都有一个底部提交作为它的祖先之一。例如,如果您使用 git rev-list --ancestry-path X ^Y ^Z,这很重要:提交可以是 Y Z.\

的后代

这是一个示例图片段,显示哪些提交被选中 () 或未被选中 (),即使它们是 A..B 的 "in the range":

...--A--●---●--B--...
   \  \    /
    ○--●--●

注意commitA没有被选中,这里commitB被选中