我刚开始学习git,为此,我开始阅读Git社区手册,在这本书中,他们说SVN和CVS存储文件之间的差异,而git存储所有文件的快照。
但是我并没有真正了解快照的含义。git是否真的在每个提交中都复制了所有文件,因为我从它们的解释中了解到这一点。
PS:如果有人能更好地学习git,我将不胜感激。
我刚开始学习git,为此,我开始阅读Git社区手册,在这本书中,他们说SVN和CVS存储文件之间的差异,而git存储所有文件的快照。
但是我并没有真正了解快照的含义。git是否真的在每个提交中都复制了所有文件,因为我从它们的解释中了解到这一点。
PS:如果有人能更好地学习git,我将不胜感激。
Answers:
Git确实为每个提交包含所有文件的完整副本,除了,对于Git存储库中已经存在的内容,快照将仅指向该内容,而不是对其进行复制。
这也意味着具有相同内容的多个文件仅存储一次。
因此,快照基本上是一种提交,是指目录结构的内容。
一些好的参考资料是:
您告诉Git您想要使用git commit命令保存项目的快照,并且它基本上记录了此时项目中所有文件的清单。
实验12说明了如何获取以前的快照
该progit书对快照有更全面的描述:
Git与任何其他VCS(包括Subversion和好友)之间的主要区别在于Git考虑其数据的方式。
从概念上讲,大多数其他系统将信息存储为基于文件的更改的列表。这些系统(CVS,Subversion,Perforce,Bazaar等)将它们保存为一组文件的信息,并随时间对每个文件进行更改

Git不会以这种方式考虑或存储其数据。相反,Git认为其数据更像是一个小型文件系统的快照集。
每次您提交或将项目状态保存在Git中时,它基本上都会拍下当时所有文件的样子,并存储对该快照的引用。
为了提高效率,如果文件没有更改,Git不会再次存储该文件-只是指向它已经存储的先前相同文件的链接。
Git更像是考虑其数据,如下所示:

这是Git与几乎所有其他VCS之间的重要区别。它使Git可以重新考虑版本控制的几乎所有方面,这是大多数其他系统从上一代复制的。这使得Git更像是一个微型文件系统,在其之上构建了一些功能强大的工具,而不仅仅是VCS。
尽管这在概念级别上是正确且重要的,但在存储级别上却并非如此。
Git确实使用增量存储。
不仅如此,它在效率上也比其他任何系统都高。因为它不保留每个文件的历史记录,所以当它想进行增量压缩时,它会提取每个斑点,选择一些可能相似的斑点(使用试探法,其中包括先前版本的近似,以及其他一些近似法),尝试生成增量并选择最小的增量。这样,它可以(通常取决于启发式方法)利用其他比以前更相似的类似文件或旧版本。“ pack window”参数允许以增量压缩质量进行交易。默认值(10)通常会给出不错的结果,但是当空间有限或为了加快网络传输时,git gc --aggressive使用值250,这使其运行非常慢,但会为历史数据提供额外的压缩。
Git在逻辑上将每个文件存储在其SHA1下。这意味着如果存储库中有两个内容完全相同的文件(或者重命名了文件),则仅存储一个副本。
但这也意味着,当您修改文件的一小部分并提交时,将存储该文件的另一个副本。git解决此问题的方法是使用打包文件。偶尔,将从回购中收集的所有“松散”文件(实际上,不仅是文件,而且还包含提交和目录信息的对象)都收集并压缩为打包文件。打包文件使用zlib压缩。类似的文件也经过增量压缩。
拉或推时(至少使用某些协议)也使用相同的格式,因此不必再次重新压缩这些文件。
这样的结果是,包含整个未压缩工作副本,未压缩最近文件和压缩较旧文件的git存储库通常相对较小,比工作副本的大小小两倍。这意味着它比具有相同文件的SVN存储库小,即使SVN不在本地存储历史记录也是如此。