为什么不承诺跟踪他们的孩子提交?

时间:2016-01-13 09:44:01

标签: git

如果我们签出提交而不是分支,HEAD(指向分支的指针)将指向提交而不是分支的名称(调用此提交A)。这称为分离的HEAD状态。如果我创建了一个新的提交 - 提交B,那么新的提交将会丢失(好吧,也许不会立即),因为我们无法引用它(实际上,我没有得到它,因为每次提交有一个ID,对吗?我们可以在知道ID后引用它,但由于某种原因,Git会删除这些提交。可能Git不能告诉提交属于哪个分支。) / p>

只知道他们的父母,而不是孩子。是否有一个原因?如果提交A有提交B的引用,我们可以忘记分离的HEAD问题,对吧?但我想这会引起一些其他问题 - 那些是什么?

1 个答案:

答案 0 :(得分:5)

  

只知道他们的父母,而不是孩子。有这个原因吗?

简而言之

Git提交不会跟踪他们的孩子,因为他们是内容可寻址和不可变的。这一设计决策使得架构更简单,更高效。

更多细节

Git的设计师Linus Torvalds intended it to provide data integrity;如果快照中某个版本的文件被破坏,Git应该能够检测到它。

为了实现数据完整性,Git被设计为a content-addressable filesystem。特别是,提交在创建时接收基于其内容计算的“唯一”(禁止碰撞)标识符(使用SHA-1 algorithm)。此标识符充当提交的checksum,可用于检测数据损坏。

不变性是一个优势:不可变的东西更容易推理并且可以共享。因此,提交的不变性是一个非常理想的特征。一旦创建,提交就会成立;它不能以任何方式改变。您可以做的最多是创建一个“类似”现有提交的新提交(which is what happens when you run git commit --amend)。

但是,如果按照你的建议,提交跟踪他们的孩子,那么每次有新的后代时,都必须更新/替换提交,因为他们的旧哈希不会反映事实上,他们有一个全新的后代。这会破坏不变性的好处,使事情变得更加复杂。