有没有办法获取git提交节点的子节点数?
我想在提交图中找到第n个节点,其中有2个或更多子节点。因此,如果历史是:有没有办法获取git提交节点的子节点数?,git,Git,我想在提交图中找到第n个节点,其中有2个或更多子节点。因此,如果历史是: A -- B -- C -- D \ E -- F* 我在F,如果我正在搜索包含多个子节点的第一个节点,我想查找B 我该如何做到这一点?Git的所有内部链接都是反向的,从子级到父级: A <-B <-C <-D ↖︎ [this is an up-and-left arrow, but it may not work in some fonts]
A -- B -- C -- D
\
E -- F*
我在F
,如果我正在搜索包含多个子节点的第一个节点,我想查找B
我该如何做到这一点?Git的所有内部链接都是反向的,从子级到父级:
A <-B <-C <-D
↖︎ [this is an up-and-left arrow, but it may not work in some fonts]
E <-F
这意味着,即使使用执行此操作的git rev list
选项(--children
),git也会声明B
有一个子项,即E
。要让Git声称B
有两个孩子,E
和C
,您必须从F
和D
开始,以便Git rev list
从D
返回C
到B
:
A-> B-> C-> D
↘︎ [this is a down-and-right arrow]
E-> F
您可以使用--branchs
让Git从所有分支名称开始,或者使用--tags
让Git从所有标记名称开始,或者使用--all
让Git从所有引用(包括refs/stash
)开始。将--topoorder
添加到git rev list
命令中,您将获得提交及其子项的列表。从该列表中,您将需要最后一次提交,该提交导致F
,但也有多个子项。不幸的是,git rev list
这里的输出仍然没有太大的用处。要快速完成这项工作,您可能需要编写自己的图形读取器,在这种情况下,您可以自己进行内部标记,只需使用git rev list--parents--all
或类似工具即可
(在Mercurial中,这项工作要容易得多,尽管即使在Mercurial中,这项工作也可能很重要。)我想问一下,为什么要找到这样一个提交?你是想找到你的分支与另一个分支的共同祖先吗?你需要脚本化的还是可视化的?此外,还有删除分支和标记的问题。如果E/F分支已被删除,或在其他地方重新设置了基础,您是否仍希望B被视为有两个孩子?如果第二个子节点仅在远程分支上,而不在本地分支上(反之亦然),是否希望将其视为有两个子节点?如果第二个孩子根本不在树枝上,只在标签上,同样的问题。@ElpieKay,只想看看树枝从哪里断开。哇!所以要做到这一点,我必须生成整个树,然后分析它?唉,smhSo,如果我在
D
,那么rev list
将行走A->B->C->D
?git如何向后行走链接?DB是否不包含实际的反向指针,或者它是通过在执行遍历之前实际重新生成整个树来执行节点遍历?后者效率很低,Git只存储父指针。导航到父级是直接的,查找子级不是,因此是的,这可能非常低效。因此,如果我在D
,那么rev list
将行走a->B->C->D
,实际上,它只是从我所在的位置出发,遍历父级并向后报告信息?
A-> B-> C-> D
↘︎ [this is a down-and-right arrow]
E-> F