2011-09-21 90 views
1

在Git basic terminology中有一个概念快照快照的概念

这个概念在Git的工作流程中使用:

  1. 您修改工作目录下的文件。

  2. 您将舞台文件添加到快照您的舞台 区域。

  3. 你做了承诺,这需要的文件,因为它们是在 临时区域并存储快照永久您的Git 目录。

你能不能解释一下什么是快照,并显示文件的一些小例子,它的快照,为什么Git使用他们,而不是让差异在其他VCSS的?

回答

6

快照只是表示文件内容在给定时间点的内容。所有版本控制系统都在概念上在快照上运行。您希望能够看到过去任何时候您的源代码的样子。它们也都存储差异以节省存储空间。 git的独特之处在于两个方面:差异计算和内部存储的方式与文件的历史没有直接关系,差异不会每过一次都重新计算。

比方说,你有一个1000字节的文件,几乎每一个版本都会得到更新。如果你改变它的一个字节,git将暂时存储一个全新的文件副本,并改变一个字节。这是人们翻出来说“OMG,git是如此愚蠢,它应该马上存储差异,我坚持颠覆。”

然而,想想你是如何实际使用你的源代码管理。几乎所有你想要进行比较的事物都是自上次推送以来发生变化的事情。因为它还没有计算出差异,所以git恰好有一个完整的,容易访问的所有那些最近更改过的文件的缓存,其中的版本控制系统必须从版本1开始,并应用数百个差异来重构相同的内容。

然后,当您推送共享您的更改时,git gc会自动运行,以便更有效地存储这些文件以便通过网络传输,然后计算并存储差异。但是,它不一定是从版本n-1到版本n的文件差异。如果内容在许多文件中重复,git可以考虑这一点。如果在多个分支中进行相同的更改,git可以考虑到这一点。如果文件被移动,git可以考虑到这一点。如果将来发现一些启发式方法可以使事情变得更加高效,那么git可以在不破坏现有客户端的情况下考虑到这一点。它不符合差异必须始终从一个连续版本到下一个版本的想法。

这些基本的设计决策使得git与其他版本控制软件相比如此之快。