给出分支名称或标签name
,我们可以用name~1
来引用其父级。我们可以以某种方式提及它的一个孩子吗?
谢谢。
答案 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
,它将按顺序列出提交B
,D
和E
的哈希ID。将branch1
替换为branch2
,以依次获取C
,F
和G
。
请注意,如果图形如下所示:
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
(此代码未经测试)。