当人们说“什么意思?”;“祖先”;关于git?
我看过很多关于它的讨论,但当我搜索它的意思时,我找不到它。什么是祖先 我猜分支x的祖先是分支的任何父母、祖父母、祖父母等当人们说“什么意思?”;“祖先”;关于git?,git,Git,我看过很多关于它的讨论,但当我搜索它的意思时,我找不到它。什么是祖先 我猜分支x的祖先是分支的任何父母、祖父母、祖父母等 如果分支x从主分支,分支y从x分支,分支z从y分支,那么z的祖先是y,x和主分支?只是猜测一下。术语祖先是merge base的第一个词(替换“parent”),解释如下: 合并基尽可能找到一个好的共同祖先。 如果选择了同样优秀的共同祖先,就不应该依赖它 决定以任何特定的方式决定 “parent”被视为直接祖先,而merge-base算法需要追溯到更远的地方 如中所述: 父项
如果分支x从主分支,分支y从x分支,分支z从y分支,那么z的祖先是y,x和主分支?只是猜测一下。术语祖先是merge base的第一个词(替换“parent”),解释如下: 合并基尽可能找到一个好的共同祖先。
如果选择了同样优秀的共同祖先,就不应该依赖它 决定以任何特定的方式决定 “parent”被视为直接祖先,而merge-base算法需要追溯到更远的地方 如中所述: 父项是提交的第一个父项。
我们可以将其命名为相同的第n代祖先的第n+1代祖先,因为commit是的第n代祖先,如果该代编号比它已有的名称更好 年,引入了第一祖先符号: [PATCH]添加新的扩展SHA1语法~ 新符号是
的缩写,后跟
插入符号(“^
”)字符。例如,“
master~4
”是当前“master
”分支头的第四代祖先,仅次于第一代父母;与“master^^^
”相同,但可读性更强
z的祖先可以从z头访问任何提交 “可达”一词是: 一个给定提交的所有祖先都可以从该提交中访问 更一般地说,一个对象可以从另一个对象访问,如果我们可以通过一个链从另一个对象访问另一个对象,该链跟随标记到它们标记的任何对象,提交到它们的父对象或树,树到它们包含的树或blob 这导致修改以下概念: 当提交只有一个相关的父提交时,提交可以达到的提交数量正好是父提交可以达到的提交数量加上一;我们不必对直接的单链珍珠上的提交运行
count\u distance()
,而只需在父项的计数中添加一个
另一方面,对于合并提交,由于可以从一个父级访问的提交可以从另一个父级访问,因此不能仅将父级的计数加上提交本身的计数;这将超过从一个以上的父母可以到达的祖先数量
TL;博士
下面内容的真正关键在于认识到分支或分支名称不是关系的来源。提交之间的关系来自提交。分支名称只是让您在图中开始
长的
除此之外,图论还有一个更一般的描述。Git存储库中的提交形成有向无环图或DAG
图G是节点或顶点V以及连接顶点之间的一组边E的集合,因此公式G=(V,E)。有向图是一种将边替换为弧(即箭头)的图。这里有两张维基百科图片。左边的第一个显示了一个规则(无向)图。第二个显示有向图:
当图形被定向时,只能按照箭头所示的方向从一个节点移动到另一个节点。上面的有向图是循环的,因为从任何节点开始,您都可以在该节点上来回移动
非循环图没有循环,也就是说,无论从哪个节点开始,都无法回到开始的位置。Git提交的图形是有向的、非循环的,因此它是DAG
在Git提交图中,每个节点或顶点都是一个提交,由其哈希ID唯一标识。每个弧及其方向都是与节点关联的父提交哈希ID的结果。因此,绘制Git图的自然方法如下:
... <-F <-G <-H <-- master
D--E
/ \
A--B--C H--I--J <-- master
\ /
F--G--K---L <-- develop
提交A
是一个没有传出弧的节点。在普通(非Git)图中,这将使其成为叶节点,但Git向后执行所有操作,因此在Git中,a
是根节点。提交B
指向A
,C
指向B
,依此类推,直到到达H
。提交H
是一个合并提交:它有两个传出弧,分别指向提交E
和G
。然后,从H
,我们可以走到顶行或底行,或者沿着这两行走,然后回到根A
正如您可能猜到的,这些名称是分支名称。它们充当tip提交的入口点。从tip commitL
我们可以沿着最下面一行返回,但我们无法到达commitH
——我们通过从L
到K
到G
,到达G
,但G
只指向F
,因此我们无法到达H
。所有的箭头都指向后面。但是,从commitJ
,我们可以向后工作到H
,从而工作到任意一行
这意味着提交K
和L
仅在develop
上,而提交D
、E
、H
、I
和J
仅在master上。所有其他提交都在两个分支上。这就是VonC所描述的可达性概念
从数学上讲,在DAG中,我们定义了前置和后继概念。对于前置词或前置词,我们使用小于≺ 符号:A≺ B如果你能从A到B,我们使用大于≻ (“继任者”或“继任者”)相反的符号。它们在图中的节点上定义了一个。当然,一个节点等于它自己,我们可以说
D--E
/ \
A--B--C H--I--J <-- master
\ /
F--G--K---L <-- develop
if git merge-base --is-ancestor $H1 $H2; then
echo commit $H1 is an ancestor of $H2
else
echo commit $H1 is not an ancestor of $H2
fi
A--B--C <-- branch1
D--E--F <-- branch2
A--B--C
\
G <-- branch1
/
D--E--F <-- branch2