Git 和大多数其他版本控制系统的一个关键区别是,其他版本控制系统倾向于将提交存储为一系列的 delta-change 集,在一个提交和下一个提交之间。这似乎是合乎逻辑的,因为它是存储关于提交的信息的最小可能数量。但是提交历史越长,比较修订范围所需的计算就越多。
相比之下,Git 存储 在每次修订中完成整个项目的快照。这没有使回购规模随着每次提交而急剧增长的原因是,项目中的每个文件都作为一个文件存储在 Git 子目录中,以其内容的散列命名。因此,如果内容没有更改,散列也没有更改,提交只是指向同一个文件。还有其他的优化。
所有这些对我来说都很有意义,直到我偶然发现了 关于包文件的信息,Git 定期将数据放入其中以节省空间:
为了节省空间,Git 利用包文件。这是一个 Git 只保存 第二部分改变了 文件,并且有一个指向它的文件的指针 类似于。
这不就是回到存储 delta 的老路上了吗?如果没有,有什么不同?这如何避免 Git 遇到其他版本控制系统所遇到的相同问题呢?
例如,Subversion 使用 deltas,回滚50个版本意味着撤消50个差异,而使用 Git 只需抓取适当的快照。除非 git 在包文件中也存储50个差异... ... 是否有某种机制说“在少量差异之后,我们将存储一个全新的快照”,这样我们就不会堆积太大的变更集?否则 Git 如何避免 delta 的缺点?