使用Git进行DAG与树的对比?

Jon*_*ink 48 git data-structures

我经常读到Git使用有向无环图(DAG)数据结构,每次提交都是一个节点,而像分支和标签这样的东西作为节点的指针.

但是当我尝试使用像gitk这样的工具来显示我的提交历史时,它看起来更像是树而不是图形,因为每个父子关系都是单向的.

那么,DAG和树之间有什么区别,特别是关于Git?

Joh*_*ica 63

但是当我尝试使用像gitk这样的工具来显示我的提交历史时,它看起来更像是树而不是图形,因为每个父子关系都是单向的.

像树一样的DAG可以布置成使得所有父子关系都是单向的.它们之间的区别在于DAG中的节点可以具有多个父节点.Git中最常见的情况是合并时.合并提交将包含作为父项合并的所有提交.树不允许节点具有多个父节点.

图表与合并 (图片来源)

注意合并提交C6如何有两个父节点C4和C5.

  • @ Jonathan.Brink此外,一棵树最多只能有一个根,而DAG可以包含多个根,甚至多个断开连接的子图. (11认同)
  • @Betlista 当然可以。在上图中,如果 C3 没有 C2 没有父项怎么办?它可能没有父母。那么它和 C0 都是根。此外,如果 C6 没有 C5 作为父级,那么“master”和“iss53”将彼此断开连接,并且没有共同提交。 (2认同)