Git的blob数据和差异信息

pro*_*eek 8 git diff

据我所知,Git的blob将SHA1哈希作为文件名,以便不复制存储库中的文件.

例如,如果文件A的内容为"abc"并且SHA1散列为"12345",则只要内容不变,则提交/分支可以指向相同的SHA1.

但是,如果将文件A修改为"def"以使SHA哈希"23456",会发生什么?Git是否存储文件A和修改过的文件A(不仅仅是区别,而是整个文件)?

  • 如果是这样,为什么呢?存储差异信息不是更好吗?
  • 如果没有,diff如何跟踪文件中的更改?
  • 其他VCS系统如何 - CVS/SVN/Perforce ......?

添加

以下"Git社区图书"回答了我的大部分问题.

值得注意的是,这与您可能熟悉的大多数SCM系统有很大不同.Subversion,CVS,Perforce,Mercurial等都使用Delta Storage系统 - 它们存储一个提交和下一个提交之间的差异.Git不会这样做 - 它会在每次提交时存储项目中所有文件在此树结构中的外观.这是使用Git时要理解的一个非常重要的概念.

Abi*_*ern 7

git按内容而不是差异存储文件,因此在您的示例中,A("abc"和"def")的两个版本都将存储在对象数据库中.

  • 它可以更好地存储整个对象,因为通过比较它们的SHA很容易看出文件的两个版本是否相同.有关如何存储对象的详细信息,请查看git-book.这样做效果更好,因为如果使用差异跟踪文件,则需要文件的整个历史记录来重建它.在集中式系统中很容易做到,但在分布式系统中则不容易,对文件可以进行许多不同的更改.

  • Git直接从对象执行diff.

  • 对象模型是一回事,但Git如何实际存储这些对象是一个独立的问题.Git可以并且确实以类似diff的方式存储对象(包文件中的"delta compression"); 请参阅前面链接的[Git社区书籍](http://book.git-scm.com/index.html)中的后续章节:[Git Stores Objects](http://book.git-scm.com/ 7_how_git_stores_objects.html)和[The Packfile](http://book.git-scm.com/7_the_packfile.html). (6认同)