(如果“分支”是指分支名称,则不能:该信息已消失。)
假设您的意思是找到 commits,很容易找到 E,因此也很容易找到 D 和 H:git rev-list --min-parents=2 <endpoint> 枚举两个或多个父项的提交。 --min-parents=2 可以拼写为--merges。给定提交E,您可以查看它的父级,或者让git rev-list 吐出父级哈希值,在同一行具有合并的哈希值,为您提供D 和H 的哈希ID。
查找A 和F 更加困难,但也可能是错误的:
...--o--x--...--x----...----M--o
\ \ /
*--...--*--...--o
两个已加星标的提交都回到了M 的第一父系血统,因此两者都是潜在的兴趣点。
我不确定是否可以让git rev-list 在这里识别两个加星标的提交。请注意,在这种图中,除了其中一个之外,所有这些都是合并,但我们也可以:
...--o--x----...----W--...--M--o
\ / /
*--...--*--...--o
其中W 也是一个合并,这次是在M 的第一父行上,它从底部的第二父行引入提交。
所有合并都来自rev-list,其输出限制为--merges。添加--first-parent 以避免遍历第二条腿。
您可以使用git rev-list --parents 生成构建图表所需的数据,然后编写您自己的图表处理算法,选择您喜欢的任何内容。请注意,git rev-list 也可以与 --ancestry-path 和 X..Y 语法一起使用来枚举那些提交:
- 是 Y 的祖先(包括 Y 本身);但是
- 不是 X 的祖先(因此不包括 X 本身);和
- 有 X 作为祖先,即是 X 的后代
普通的X..Y 只提供满足条件一和条件二的提交,这意味着在这样的图中:
o--o <-- X
/ \
...--o--o--*---*--* <-- Y
您将获得所有已加星标的提交。添加--ancestry-path 会删除最左边的星号提交,因为它不是提交X 的后代(尽管git rev-list 实际上不是通过测试“是X 的提交后代”而是“X 是提交的祖先”来确定这一点) ——DAG 中连接节点的弧都是向后的,所以 is-ancestor 是一个简单的测试,而 is-descendant 是困难的)。