Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当人们说“什么意思?”;“祖先”;关于git?_Git - Fatal编程技术网

当人们说“什么意思?”;“祖先”;关于git?

当人们说“什么意思?”;“祖先”;关于git?,git,Git,我看过很多关于它的讨论,但当我搜索它的意思时,我找不到它。什么是祖先 我猜分支x的祖先是分支的任何父母、祖父母、祖父母等 如果分支x从主分支,分支y从x分支,分支z从y分支,那么z的祖先是y,x和主分支?只是猜测一下。术语祖先是merge base的第一个词(替换“parent”),解释如下: 合并基尽可能找到一个好的共同祖先。 如果选择了同样优秀的共同祖先,就不应该依赖它 决定以任何特定的方式决定 “parent”被视为直接祖先,而merge-base算法需要追溯到更远的地方 如中所述: 父项

我看过很多关于它的讨论,但当我搜索它的意思时,我找不到它。什么是祖先

我猜分支x的祖先是分支的任何父母、祖父母、祖父母等


如果分支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 commit
L
我们可以沿着最下面一行返回,但我们无法到达commit
H
——我们通过从
L
K
G
,到达
G
,但
G
只指向
F
,因此我们无法到达
H
。所有的箭头都指向后面。但是,从commit
J
,我们可以向后工作到
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