快照的概念

xra*_*alf 1 git snapshot

Git 基本术语中有一个快照概念.

这个概念用于Git工作流程:

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

  2. 您暂存文件,将它们的快照添加到暂存区域.

  3. 您执行提交,它将文件保存在暂存区域中,并将该快照永久存储到您的Git目录中.

你能解释一下什么是快照,并展示一些文件的小例子和它的快照以及为什么Git使用它们而不是像在其他VCS中那样产生差异?

Kar*_*ldt 7

快照只表示文件内容在给定时间点的内容.所有版本控制系统在概念上以概念方式运行.您希望能够在过去的任何给定点查看源代码的外观.它们还存储差异以节省存储空间.git是唯一的有两种方式:diffs的计算方式和内部存储方式与文件的历史记录没有直接关系,而且每次都不会重新计算差异.

假设您有一个1000字节的文件,几乎每次构建都会更新.如果更改它的一个字节,git将临时存储一个全新的文件副本,并更改​​一个字节.这是人们翻开并说,"OMG,git是如此愚蠢,它应该立即存储差异.我坚持颠覆."

但是,请考虑一下如何实际使用源代码管理.几乎你想要做的所有事情都是自你上次推动以来发生过变化的事情.因为它还没有计算差异,所以git恰好有一个完整的,易于访问的缓存,包含所有最近更改的文件,其他版本控制系统必须从版本1开始并应用数百个差异来重建相同的内容.

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

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