什么是git“快照”?


71

官方的Git文档说:

$ git diff test

这将向您显示当前工作目录与“ test”分支上的快照之间的区别

作为一个新手,这非常令人困惑。我从未听说过快照一词。他们是指“测试”分支的“头”吗?


11
您可能还会喜欢The Git Parable,它以故事形式构建了Git的概念,其中的核心思想之一就是快照。
卡斯卡贝尔2011年

1
谢谢,我有同样的问题。查看Git寓言,以及git-scm.com/book/en/v2/Getting-Started-Git-Basics,我将“快照”理解为目录中每个已更改文件的完整副本,以及指向同一目录中所有未更改的文件。那是对的吗?
ouonomos 2015年

Answers:


33

快照是特定时间点某物(例如文件夹)的状态。在这种情况下,快照表示测试分支的当前内容,而不必是总修订版。


3
@jens:快照在这里用作提交的外行同义词。提交对象本质上是元数据(作者,日期,消息)和工作树内容的快照(表示为树对象)。有关更多信息,请参见Git对象模型
卡斯卡贝尔2011年

我无法直接评论git的情况,但是在SVN的情况下,您可以在分支中进行一些更改(未提交,仅在您的硬盘上),而在另一个文件夹中可以进行主干版本更改;您可以将它们相互比较。我想git也存在这个概念。
Femaref 2011年

@jens:另一个问题是分支只是一个提交的指针,所以当您说git diff test您真正的意思是“与test分支所指向的提交进行比较”。
卡斯卡贝尔2011年

46

术语快照也在git参考站点中使用

它是“修订”的替代术语。在其他版本控制系统中,将跟踪对单个文件的更改并将其称为修订,但是使用git时,您将跟踪整个工作区,因此它们使用术语快照来表示差异。

来自http://gitref.org/index.html

与其编写像Subversion这样的单独版本化每个文件的工具,我们不如编写一个可以更轻松地存储项目快照的工具,而不必每次都复制整个目录。

这本质上就是Git。您告诉Git您想要使用git commit命令保存项目的快照,并且它基本上记录了此时项目中所有文件的外观清单。然后,大多数命令会与这些清单一起使用,以查看它们之间的差异或从中提取内容等。

如果您将Git视为用于存储,比较和合并项目快照的工具,则可能更容易了解正在进行的操作以及如何正确执行操作。


我还要指出的是,您可以通过执行git checkout <commit> <filename>git checkout示例kernel.org/pub/software/scm/git/docs/…中
g19fanatic

1
@Jens:虽然您不能分割选中标记,但是如果您认为其他答案比当前接受的答案更好,则可以重新分配。但是,是的,更多的赞誉,意味着社区认为答案是如此的好/有价值。另外,这并不意味着必须接受。接受的答案取决于OP。
smRaj

15

为了解释snapshot清楚这个术语。请允许我介绍另外两件事

  1. git松散对象格式
  2. git Packfiles

假设我们有一个名为“ a.txt”的文件,其内容是在git控制下的十个“ a”字母。提交此文件后,它将在.git / objects路径下创建三个文件夹,每个文件夹都有一个文件。每个文件都是SNAPSHOT

已在git控制下提交的a.txt文件 提交后由git创建的三个文件夹

每个文件夹有一个文件

在此处输入图片说明

现在,我们编辑a.txt文件以查看会发生什么

我们将第一个字母“ a”更改为字母“ b”

在此处输入图片说明->> 在此处输入图片说明

然后犯!

Git在三个新文件夹下创建了其他三个新文件

在此处输入图片说明

这三个新文件也是SNAPSHOT

在此处输入图片说明

每次执行COMMIT git都会将快照保存到磁盘,而不是将同一文件的新版本和旧版本之间的增量保存。即使我们只更改了一个文件的一个字母,git也会将整个文件另存为快照

这也称为松散对象格式

在这种情况下,git将比其他vc (例如subversion)花费更多的磁盘空间 ,从而节省了同一文件的新版本和旧版本之间的增量。但是使用的好处是snapshot缩短了commit阶段时间。

但是,出色的git会git gc不时地执行另一项工作,这会创建PACKFILES并删除快照,快照中的内容类似于缩小自身大小。这些工作之后git gc,git的磁盘成本将与使用增量方式的其他VCS一样。

通过snapshotgit gc。Git将比其他使用增量方式的VCS更快commit阶段并且花费磁盘大小与使用增量方式的其他VCS相似。

Git在性能和磁盘空间成本之间找到了一种平衡的方法。

GIT是最好的

packfiles在.git / objects / pack下

您自己执行“ git gc”命令后即可看到它。


这阐明了所谓的快照实际上是由什么组成的。但是,据说一次提交将创建三个文件夹,每个文件夹中都有一个文件。以及“每个文件都是快照”。但是每个快照都是一次提交,即所有存储库的保存状态。该快照由几个文件组成(本例中为三个文件),因此更合适的说法是,快照是由这三个文件组成的。
马丁

1
对于那些不熟悉哈希值或看不到文件夹图片和快照图片之间关系的人,乍一看:哈希值有时由第一个数字表示。在Git中,您可以使用提交的哈希而不是分支名称直接引用提交。在这里,名为67的文件夹(第一个新文件夹)的文件编号为67a311,如下图所示,该文件为哈希表...因此,每个3个文件夹名称对应于4个文件的前3个文件在下面的图片中。
马丁

继续快照是什么;除了包含文件内容的文件(Git中的blob)之外,它还包含其他两个对象:一棵列出目录内容并将其与blob相关联的树,以及一个与指向先前树的指针的提交以及所有提交元数据。一起构成所有存储库而不是特定文件的“快照”(提交)。
马丁

8

快照到存储库,快照到视频。

它是某个时间点上存储库的内容(文件和文件夹),如果需要的话,它是存储库的状态。

该内容由git的Tree对象表示,并存储在.git文件夹中。当您commit将存储库的当前工作目录存储为新存储库的快照时。您的Git存储库由一系列快照组成,其他VCS则由一系列差异组成。


2

首先,这不是官方的git文档。这是一本社区著作。虽然它可能相当权威,但它不是福音。

AFAIK,“快照”在git中没有任何正式含义。当然git diff手册没有提到它。在给定的上下文中,它可能是对本书中的示例中如何使用“测试”分支的非正式参考,即,作为正在进行的工作的快照,用于测试目的。


4
git-stash手册页提到For quickly making a snapshot, you can omit both "save" and <message>
Mike

1

我的理解是,快照通常只是git用于存储其数据的“实体”。例如,与像SVN那样将其数据存储为一系列“增量” /变更集相反,您对git所做的每个提交都会创建一个“提交对象”,该提交引用该时间点代码的快照。

因此,正如@Femaref所说的,它是代码在特定时间的状态,并不一定意味着它是测试分支的头,而是在您所看到的示例中。


0

根据发布的其他定义:

快照以清单形式表示跟踪文件的当前状态,可以将其与其他清单进行比较以查看差异所在。

Git仅从清单被追踪的第一刻开始追踪清单之间的差异。如果自第一个快照以来未更改文件,则所有后续快照将引用第一个快照。如果文件已更改,则所有后续快照将引用具有最新更改的快照。git存储的是从上到下的快照快照历史。分支基本上是时间轴上的一个分支,它允许从主链上的特定快照到快照的备用历史链。

分支通常是用于要素的,因此可以在某些时候合并到主分支中。如果没有意图合并,而是与原始项目有所不同,以新的,完全独立的项目副本形式复制其自身的历史,则通常称为“硬分叉”,指的是“道路上的分叉”。


-1

以下是一些使用术语“快照”的上下文:

  1. 通过对索引进行快照来创建新的提交。
  2. 提交是给定时间的回购快照。

2
您使用该术语来回答您的问题,但该问题直接询问什么是git Snapshot。
Umar Ata
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.