我们如何指代提交的孩子?

时间:2019-01-22 17:19:07

标签: git

给出分支名称或标签name,我们可以用name~1来引用其父级。我们可以以某种方式提及它的一个孩子吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

Git存储库表示为提交的DAG(有向无环图)。每个提交都包含一个指向其每个父级的指针,但是没有有关哪些提交以 it 作为父级的信息。这就是为什么您只能引用提交(<{>)的父母(<{1}},%等),而不是引用具有 {{1 }}作为父母。

(大多数提交只有一个父提交,但合并提交就是具有两个或多个父提交的示例,具体取决于合并中涉及的分支数。)

答案 1 :(得分:1)

chepner said一样,该信息也不能直接获得,因为Git仅存储向后链接。创建子项时,父提交始终存在,但是创建父项时,子提交不存在。一旦创建了提交,就不能对其进行任何更改,因此无法将其连接到其子项。

尽管如此,如果您有一个方向的想法,您可以找到在该方向上提交的孩子。这就是我的意思:假设图形如下所示:

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

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

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

,它将按顺序列出提交BDE的哈希ID。将branch1替换为branch2,以依次获取CFG

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

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

您可以首先在B方向上得到 D A..branch1。要检查这种情况,而不是(或除了)使用--topo-order和/或--reverse,请沿此祖先路径收集 all 个提交,并针对每个此类提交,请检查提交父母的 all

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

(此代码未经测试)。