ProGit书中的箭头方向

时间:2010-04-20 15:17:42

标签: git

为什么在Pro Git book箭头中显示提交队列的所有图像都会导致相反的方向?

2 个答案:

答案 0 :(得分:11)

箭头反映的方向是 DAG, Directed Acyclic Graph ,代表Git中提交的历史记录(从最近到最旧)。

该表示不是“完美”表示,如Eric Sink details in his article

  

基于DAG的版本控制工具最酷的一点是DAG是合并历史的表达。我们将DAG中的箭头解释为“我已经得到了这个”。

alt text

  

因此,当需要从5b合并到(a)分支时,我们可以使用DAG中的信息来知道3b和2b已经完成


同一篇文章详述了该表示的限制:

  

<强> Cherrypicking

     

但是DAG只是合并历史的一种实现,它绝对不是完美的。

     

版本控制DAG中的箭头从子级转到父级。它告诉我们孩子包含父母的所有变化。和它的祖父母。还有曾祖父母。等等。

     

但如果不是这样呢?

     

考虑以下图片:

alt text

  

我想创建变更集4.
  我想从变更集1开始,然后我想应用变更集3中的更改,但不是变更集2中的内容。
  这种操作有时被称为“樱桃”。我不想将所有更改从一个分支合并到另一个分支。我只想采取一个变更集(或变更集的一部分)并将其作为补丁应用到其他地方。

     

我如何在DAG中表示这一点?

     

我不能。

  • 我可以画一个4到3的箭头(上面用红色显示)。这将正确地说4包含3中的更改,但它会错误地声称4包含2中的更改。
  • 或者,我没有画箭头。实际上,我的合并历史记录根本不会记录4实际上是3转换为补丁并应用于1的事实。
  

在任何一种情况下,下次我从一个分支合并到另一个分支时会发生一些不好的事情:

     
      
  • 如果我画出那个躺着的箭头,我将不会有机会申请变更集2,因为合并历史记录认为我已经这样做了。
  •   
  • 如果我没有绘制任何箭头,该工具将指望我处理变更集3,因为没有合并历史记录我已经做过的事实。
  •   
     

这些问题都不是灾难性的,不足以制作晚间新闻,但仍然如此。

这就是为什么{@ 3}}在樱桃挑选操作之后,为了找回更经典的DAG。

答案 1 :(得分:6)

显示父母关系。在Git中,一个特定的提交知道它的父母,但不一定知道它的孩子。 (显然,可以根据父链接派生信息,但我不认为它直接存储在提交对象中。)