git的文件快照的含义是什么?

时间:2015-06-13 15:00:59

标签: git svn version-control

我正在阅读git basics

  

Git认为其数据更像是一组缩影的快照   文件系统

我无法理解git快照的含义。 git是否存储每个快照/版本中的整个文件内容?例如, 版本1

#include <stdio.h>
int main()
{
        printf("hello, world");
        return 0;
}

在版本2中,我在文件中添加了一行。

#include <stdio.h>
int main()
{
        printf("hello, world");
        printf("hello, git");
        return 0;
}

git会存储整个内容,而不是仅存储这两个版本之间的差异(printf("hello, git"))作为svn等吗?

如果是,那有什么意义呢?

2 个答案:

答案 0 :(得分:1)

  

git存储整个内容,而不是仅将这两个版本之间的差异(printf(“hello,git”))存储为svn等?

Git存储文件的全部内容。但是当文件没有改变时,它不需要额外的空间。

阅读关于Git包文件格式的精彩答案:Are Git's pack files deltas rather than snapshots?

关于SHA1

文件(和其他内容)以“blob”的形式存储。每个字节序列都有自己的sha1代码,这对它来说非常独特。

关于SHA1的情况如下:

  1. 文件的SHA1计算可以随时给出相同的结果,OS,Git版本或实现。
  2. 具有不同名称或路径但内容相同的文件将始终具有相同的SHA1-s。
  3. 如果两个文件具有不同的SHA1-s,则它们不等于1的概率。
  4. 如果两个文件具有相同的SHA1-s,它们相等的概率大约为1 - 1/2 400 (我记得),这非常像1。
  5. 该系统带来的好处

    1. 可以非常快速地比较修订版本。没有检查文件内容,只检查它们的SHA1-s。
      • 当您推/拉时,仅传输已更改的文件。
      • 暂时检查当前更改的状态。
      • 让您跟踪内容相同的N个文件,只在Git中使用单个文件。
    2. 更改工作树中的修订非常快。
      • 不应用连续补丁
      • 您可以从分支中排除提交,将其提取到另一个分支,更改其顺序。
    3. 关于diff(和git diff):

      您可能已经注意到git确实显示了文本文件的差异,指出了添加和删除的行。为方便起见,这是使用diff utility完成的。这也有助于收集贡献统计数据。这用于解决合并冲突。但是,Git将文本(和二进制)文件视为单个blob并将其存储。

      git add --patch

      排除

      有一种方法可以强制Git在暂存更改时将文本文件分解为块。这对于非常大的文件可能很有用,但对于小文件却没用。

      git add --patch 
      
        

      在索引和工作树之间以交互方式选择补丁,并将它们添加到索引中。这使用户有机会在将修改后的内容添加到索引之前查看差异。

      这些是我最喜欢的来自Pro Git的Git插图:

      enter image description here enter image description here

答案 1 :(得分:1)

  

git会存储整个内容而不仅仅存储差异吗? [......如果是的话]重点是什么?

是。这就是使构建好的git历史变得如此简单的原因,而且反直觉也会使压缩效率更高。

(编辑:放弃许多迂腐和详细阐述修订历史)