Ms.*_*lib 2 git version-control
据我了解,Git 中的每次提交都是整个存储库的“快照”,这意味着至少必须读取每个文件。我的存储库是 9.2 GB,提交只需几分之一秒。发生得如此之快毫无意义。
至少,每个文件都必须被读取
相反,这是最可能发生的情况。
运行git commit以提交分阶段更改通常很快,因为实际上分阶段更改完成了大部分工作。创建提交只是将索引(也称为“暂存区”)转换为一个非常轻量级的提交对象,其中包含有关提交的元数据,以及一些包含存储库结构的树对象。
但是,当您git add在特定文件上运行时,文件中的所有数据都会添加到 git 的数据库中。然后,有关该文件的数据将存储在暂存区中,这样当您运行时git commit,有关该文件的所有信息都已在索引中。所以成本最高的部分在运行时摊销git add。
另一个微妙的事情是索引包含有关存储库中所有文件的信息 - 并且它维护有关工作目录的信息,例如上次检查文件的时间戳及其文件大小。因此,即使您运行诸如git add .暂存所有更改的文件之类的操作,它也只需要查看stat该文件是否已更改,如果未更改,则可以忽略它。
显然,查看工作目录中的所有文件有点贵,但比添加即使是未更改文件的完整快照的成本要低得多。
因此,即使 git 在每次提交时存储存储库的快照,它实际上只需要为更改的文件存储新数据,它可以为其他所有内容存储指向旧的、未更改的文件内容的指针。