为什么在Pro Git book箭头中显示提交队列的所有图像都会导致相反的方向?
答案 0 :(得分:11)
箭头反映的方向是 DAG, Directed Acyclic Graph ,代表Git中提交的历史记录(从最近到最旧)。
该表示不是“完美”表示,如Eric Sink details in his article:
基于DAG的版本控制工具最酷的一点是DAG是合并历史的表达。我们将DAG中的箭头解释为“我已经得到了这个”。
因此,当需要从5b合并到(a)分支时,我们可以使用DAG中的信息来知道3b和2b已经完成
同一篇文章详述了该表示的限制:
<强> Cherrypicking 强>
但是DAG只是合并历史的一种实现,它绝对不是完美的。
版本控制DAG中的箭头从子级转到父级。它告诉我们孩子包含父母的所有变化。和它的祖父母。还有曾祖父母。等等。
但如果不是这样呢?
考虑以下图片:
我想创建变更集4.
我想从变更集1开始,然后我想应用变更集3中的更改,但不是变更集2中的内容。
这种操作有时被称为“樱桃”。我不想将所有更改从一个分支合并到另一个分支。我只想采取一个变更集(或变更集的一部分)并将其作为补丁应用到其他地方。我如何在DAG中表示这一点?
我不能。
在任何一种情况下,下次我从一个分支合并到另一个分支时会发生一些不好的事情:
- 如果我画出那个躺着的箭头,我将不会有机会申请变更集2,因为合并历史记录认为我已经这样做了。
- 如果我没有绘制任何箭头,该工具将指望我处理变更集3,因为没有合并历史记录我已经做过的事实。
这些问题都不是灾难性的,不足以制作晚间新闻,但仍然如此。
这就是为什么{@ 3}}在樱桃挑选操作之后,为了找回更经典的DAG。
答案 1 :(得分:6)
显示父母关系。在Git中,一个特定的提交知道它的父母,但不一定知道它的孩子。 (显然,可以根据父链接派生信息,但我不认为它直接存储在提交对象中。)