给定分支名称或标签name
,我们可以通过name~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
这将按顺序列出提交B
,D
和E
的哈希ID。用branch1
替换branch2
,按顺序获得C
,F
和G
。
请注意,如果图形如下所示:
B--E <-- branch1
/ /
...--o--A--D
\
C <-- branch2
你可以在B
方向首先获得D
或A..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
(此代码未经测试)。
Git存储库表示为提交的DAG(有向,非循环图)。每个提交包括一个指向其每个父项的指针,但没有关于哪些提交将其作为父项的信息。这就是为什么你只能引用一个提交的父母(name~1
,name~2
等),而不是那些将name
作为父母的提交。
(大多数提交都有单个父级,但合并提交是具有2个或更多父级的提交的示例,具体取决于合并中涉及的分支数量。)