代码之家  ›  专栏  ›  技术社区  ›  Denis Palnitsky

程序手册中的箭头方向

git
  •  5
  • Denis Palnitsky  · 技术社区  · 14 年前

    为什么在所有显示提交队列的图像上 Pro Git book 箭头指向相反的方向?

    2 回复  |  直到 6 年前
        1
  •  6
  •   mipadi    14 年前

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

        2
  •  11
  •   Community Navdeep Singh    7 年前

    箭头反映了方向,后跟a dag,directed-acyclic-graph >strong>representating here the history of commits in git(from most recent to oldest).&

    该表示不是一个“完美”的表示,如他的文章中的eric sink details

    < Buff行情>

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

    < /块引用>

    < Buff行情>

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

    < /块引用>

    同一篇文章详细说明了该表示的限制:

    < Buff行情>

    cherrypicking

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

    版本控制DAG中的箭头从子级变为父级。它告诉我们,该子级包含父级中的所有更改。还有它的祖父母。还有它的曾祖父母。等等。

    但如果这不是真的呢?

    考虑下图:

    < /块引用>

    < Buff行情>

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

    我如何在DAG中表示这个?

    我不能。

    < /块引用>
    • 我可以从4到3画一个箭头(上面用红色显示)。这将正确地说明4包含3中的更改,但它将错误地声明4包含2中的更改。
    • 或者,我不能画箭头。实际上,我的合并历史记录不会记录这样一个事实:4实际上是3转换成补丁并应用到1。
    < Buff行情>

    不管是哪种情况,下次我从一个分支合并到另一个分支时都会发生一些糟糕的事情:

    • 如果我画出那个撒谎的箭头,我就不会有机会应用变更集2,因为合并历史相信我已经做到了。
    • 如果我不画任何箭头,工具将期望我处理变更集3,因为没有合并历史记录记录我已经做过的事实。

    这两个问题都不足以造成灾难性的晚间新闻,但仍然如此。

    < /块引用>

    这就是为什么 a rebase is never far after a cherry pick operation,in order to get back a more classic dag.

    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,因为没有合并历史记录记录我已经做过的事实。

    这两个问题都不足以引起晚间新闻,但仍然如此。

    这就是为什么 a rebase is never far 经过一次樱桃采摘手术后,为了找回一把更经典的匕首。