Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法获取git提交节点的子节点数?_Git - Fatal编程技术网

有没有办法获取git提交节点的子节点数?

有没有办法获取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]

我想在提交图中找到第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]
      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