为什么blob在提交之前出现在存储库中?

时间:2017-08-04 21:45:59

标签: git

所以我在Pro Git的第3.1节中看到了以下段落:

“我们假设您有一个包含三个文件的目录,然后将它们全部暂存并提交。暂存文件计算每个文件的校验和(我们在”入门“中提到的SHA-1哈希),存储该版本的Git存储库中的文件(Git将它们称为blob),并将校验和添加到临时区域“

我的问题是:为什么git“在我提交这些文件之前”将文件的版本存储在Git存储库中?

1 个答案:

答案 0 :(得分:2)

Why questions are always tricky.

有一个非常机械的答案(我看到siride mentioned in a comment):Git的索引的内部结构,Git用来构建 next 的神秘对象> commit,仅存储blob哈希ID。因此,为了在索引中创建文件的副本(以便它将在下一次提交中),它必须作为blob对象存储在存储库中。

有一个性能答案:通过在索引中存储哈希ID,Git可以非常快速地进行新的提交。

有一个数据恢复答案(有点弱):通过预先将blob存储在存储库中,如果你不小心做了一件坏事,可以通过git fsck --lost-found将它恢复一段时间它。 (这里的缺点是,或者包括,如果blob匹配存储库中的现有blob,它不会显示在找不到的搜索中;并且您丢失了文件的名称,这通常是了解其内容很重要。)

有一个设计美学的答案:也许Linus认为git add file早期将文件复制到存储库比以后git commit更好。

您可以选择任何这些答案,也可以自己制作答案!