我们怎样才能提到一个提交的孩子?

问题描述 投票:1回答:2

给定分支名称或标签name,我们可以通过name~1引用其父级。我们能以某种方式提及其中一个孩子吗?

谢谢。

git
2个回答
1
投票

作为chepner said,信息不是直接可用的,因为Git只存储向后链接。父子提交在其子项创建时始终存在,但在创建父项时其子项不存在。一旦创建了一个提交,就不能改变它的任何内容,所以没有办法将它连接到它的子节点。

尽管如此,如果你有一个方向,你可以找到那个方向的孩子。这就是我的意思:假设图形如下所示:

          B--D--E   <-- branch1
         /
...--o--A
         \
          C--F--G   <-- branch2

并且,假设您现在在爪子中拥有提交A的名称或哈希ID。您可以通过在“branch1”方向上从B搜索来找到commit A的哈希ID,并通过从“branch2”方向搜索C来查找commit A的哈希ID。为此,请使用:

git rev-list --reverse --topo-order --ancestry-path A..branch1

这将按顺序列出提交BDE的哈希ID。用branch1替换branch2,按顺序获得CFG

请注意,如果图形如下所示:

          B--E   <-- branch1
         /  /
...--o--A--D
         \
          C   <-- branch2

你可以在B方向首先获得DA..branch1。要检查这种情况,而不是(或除了)使用--topo-order和/或--reverse,收集沿此祖先路径的所有提交,并为每个这样的提交,检查所有提交的父项:

ahash=$(git rev-parse A^{commit}) # in case A is a branch or tag name, for instance
for hash in $(git rev-list --ancestry-path $ahash..branch1); do
    if git rev-parse $hash^@ | grep -q $ahash; then
        echo $hash is a child of $ahash
    fi
done

(此代码未经测试)。


2
投票

Git存储库表示为提交的DAG(有向,非循环图)。每个提交包括一个指向其每个父项的指针,但没有关于哪些提交将其作为父项的信息。这就是为什么你只能引用一个提交的父母(name~1name~2等),而不是那些将name作为父母的提交。

(大多数提交都有单个父级,但合并提交是具有2个或更多父级的提交的示例,具体取决于合并中涉及的分支数量。)

© www.soinside.com 2019 - 2024. All rights reserved.