【问题标题】:What is a git "Snapshot"?什么是 git“快照”?
【发布时间】:2011-06-25 05:55:13
【问题描述】:

The official Git doc 说:

$ git diff test

这会告诉你你当前的工作目录和'test'分支上的快照有什么不同

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

【问题讨论】:

  • 您可能还会欣赏The Git Parable,它以故事的形式构建了 Git 的想法,其中一个核心想法是快照。
  • 谢谢 我也有同样的问题。查看 Git Parable 和 git-scm.com/book/en/v2/Getting-Started-Git-Basics ,我将“快照”理解为目录中每个已更改文件的完整副本,以及指向同一目录中所有未更改文件的指针。对吗?

标签: git


【解决方案1】:

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

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

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

与其编写一个单独版本每个文件的工具,如 Subversion,我们可能会编写一个更容易存储我们项目快照的工具,而不必每次都复制整个目录。

这本质上就是 Git。你告诉 Git 你想用 git commit 命令保存项目的快照,它基本上记录了项目中所有文件在那时的样子的清单。然后大多数命令与这些清单一起工作,以查看它们有何不同或从中提取内容等。

如果您将 Git 视为一种用于存储、比较和合并项目快照的工具,则可能更容易理解正在发生的事情以及如何正确地做事。

【讨论】:

  • 我还想指出,您可以通过 git checkout 示例kernel.org/pub/software/scm/git/docs/… 中列出的git checkout <commit> <filename> 来获取 git 中单个文件的“快照”
  • @Jens:虽然您不能拆分复选标记,但如果您认为其他答案比当前接受的答案更好,您可以重新分配。但是,是的,更多的 UPVOTES,意味着社区认为答案非常好/有价值。此外,这并不意味着必须接受。接受的答案取决于 OP。
【解决方案2】:

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

【讨论】:

  • @jens:快照在这里被用作外行人的提交的同义词。提交对象本质上是元数据(作者、日期、消息)和工作树内容的快照(表示为树对象)。请参阅The Git Object Model 了解更多信息!
  • 我不能直接评论 git 案例,但在 SVN 的情况下,您可以在一个分支中进行一些更改(未提交,仅在您的硬盘上),而在另一个分支中进行主干版本文件夹;您可以将它们相互区分。我想这个概念也存在于 git 中。
  • @jens:另一部分是分支只是指向提交的指针,所以当您说git diff test 时,您的真正意思是“与test 分支指向的提交的差异” .
【解决方案3】:

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

  1. git 松散对象格式
  2. git 包文件

假设我们有一个名为“a.txt”的文件,其内容是 git 控制下的十个“a”字母。 我们提交这个文件后,它会在 .git/objects 路径下创建三个文件夹,每个文件夹都有一个文件。每个文件都是S.N.A.P.S.H.O.T

每个文件夹都有一个文件

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

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

-->>

然后提交!

Git 在三个新文件夹下创建了另外三个新文件

这三个新文件也是S.N.A.P.S.H.O.Ts

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

这也称为松散对象格式

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

但是出色的 git 会在此之后不时做另一项工作git gc 创建 PACKFILES 并删除内容相似的快照以缩小大小本身。经过这些工作git gc,git 的磁盘成本将与其他使用 delta 方式的 VCS 一样。

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

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

GIT 是最好的

packfiles 在 .git/objects/pack 下

你自己执行“git gc”命令后就可以看到了。

【讨论】:

  • 这阐明了所谓的快照的真正组成部分。然而,据说一次提交将创建三个文件夹,每个文件夹中都有一个文件;并且“每个文件都是 S.N.A.P.S.H.O.T.”。但是每个快照都是一个提交,是所有存储库的保存状态。该快照由多个文件组成(在本例中为三个文件),因此在这里说快照是由这三个文件组成的更为合适。
  • 对于那些不熟悉哈希值或第一眼看不到文件夹图片和快照图片之间关系的人:哈希值有时由第一个数字引用。在 Git 中,您可以通过使用其哈希而不是分支名称来直接引用提交。在这里,名为 67 的文件夹(最后一个新文件夹中的第一个)具有带有大数字 67a311 的文件...如下图所示,这是哈希...所以每个 3 个文件夹名称对应于前 3 个文件 4在下面的图片中。
  • 继续快照是什么;除了包含文件内容(Git 中的 blob)的文件之外,它还包括 2 个其他对象:一棵列出目录内容并将它们与 blob 相关联的树,以及一个带有指向前一棵树的指针的提交以及所有提交元数据。所有这些都构成了“快照”(提交),它是所有存储库的,而不是特定文件的。
  • @Martin :构成快照的那些文件似乎非常小。虽然内容可能非常大。这些小文件如何存储所有这些大内容。只是散列内容?
【解决方案4】:

快照对于存储库就像屏幕截图对于视频一样。

它是某个时间点存储库的内容(文件和文件夹)。

当您commit 时,您将存储库的当前工作目录保存为新的快照(提交 = 快照 + 元数据)。您的 Git 存储库由一系列 快照(提交)组成,而其他 VCS 则由一系列 diffs 组成。

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

    • git-stash 手册页提到For quickly making a snapshot, you can omit both "save" and <message>
    【解决方案6】:

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

    正如@Femaref 所说,它是代码在特定时间的状态,并不一定意味着它是测试分支的负责人,但可能在您看到的示例中。

    【讨论】:

      【解决方案7】:

      基于发布的其他定义:

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

      Git 仅从被跟踪的第一刻起就跟踪清单之间的差异。如果文件自第一个快照以来未更改,则所有后续快照都将引用第一个快照。如果文件已更改,则所有后续快照将引用具有最近更改的快照。 git 存储的实际上是从最后一个到第一个的快照的链式历史。分支基本上是时间线中的一个拆分,允许从主链上的特定快照中替代历史快照链。

      分支通常用于功能,并且在某些时候可能会合并到主分支中。如果没有合并的意图,而是以具有自己历史的项目的新且完全独立的副本的形式与原始项目产生分歧,它通常被称为硬分叉,指的是“道路上的岔路口”。

      【讨论】:

        【解决方案8】:

        不是最终发布版本的分支,可能正在进行中

        【讨论】:

          【解决方案9】:

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

          1. 通过拍摄索引的快照来创建新的提交。
          2. 提交是给定时间的存储库快照。

          【讨论】:

          • 你用这个词来回答你的问题,但是问题直接问了什么是 git Snapshot。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-14
          • 2021-07-07
          • 1970-01-01
          • 2017-09-28
          • 2015-10-18
          • 2015-06-22
          • 2020-07-22
          相关资源
          最近更新 更多