如果我们签出提交而不是分支,HEAD(指向分支的指针)将指向提交而不是分支的名称(调用此提交A).这称为分离的HEAD状态.如果我创建了一个新的提交 - 提交B,那么新的提交将会丢失(好吧,也许不会立即),因为我们无法引用它(实际上,我没有得到它,因为每个提交都有一个ID,对吧?一旦我们知道ID,我们就可以引用它,但由于某种原因,Git将删除这些提交.可能Git无法告知提交属于哪个分支).
提交者只知道他们的父母,而不是孩子.是否有一个原因?如果提交A有提交B的引用,我们可以忘记分离的HEAD问题,对吧?但我想这会引起一些其他问题 - 那是什么?
提交者只知道他们的父母,而不是孩子.是否有一个原因?
Git提交不会跟踪他们的孩子,因为他们是内容可寻址和不可变的.这种设计决策使得架构更简单,更高效.
Git的设计者Linus Torvalds 打算提供数据完整性 ; 如果快照中的某个版本的文件被破坏,Git应该能够检测到它.
为了实现数据完整性,Git被设计为内容可寻址文件系统.特别地,提交在创建时接收基于其内容计算的"唯一"(禁止冲突)标识符(使用SHA-1算法).此标识符充当提交的校验和,可用于检测数据损坏.
不变性是一个优势:不可变的东西更容易推理并且可以共享.因此,提交的不变性是一个非常理想的特征.一旦创建,提交就会成立; 它不能以任何方式改变.你能做的最多就是创建一个"类似"现有提交的新提交(这是你运行时会发生的事情git commit --amend).
但是,如果按照你的建议,提交跟踪他们的孩子,每次他们有一个新的后代时,都必须更新/替换提交,因为他们的旧哈希不会反映他们有一个全新的后代的事实.这会破坏不变性的好处并使事情变得更加复杂.