git如何存储版本信息

时间:2018-10-31 02:14:20

标签: git diff

我很好奇GIT如何存储其文件的版本信息。

我猜测它们很可能是增量,但是如果文件的版本很多(例如100),那么:

a)何时(如果有)存储文件的完整版本(例如testing.txt)。

b)创建新版本时(假设已添加“ Hello World”),那么它只是存储增量。

c)如果您有文件test.txt的100个版本,而我比较了20到90,那么它如何构建2个版本然后进行比较?

谢谢。

1 个答案:

答案 0 :(得分:0)

(免责声明:我不是git专家-SO方面的其他用户比我了解得多,我邀请他们编辑和改进我的答案)

Git的面向用户的外部模型是,表面上的提交代表回购状态的快照,而不是SVN和TFS工作方式的增量或变更集。这就是Git如此强大的原因:因为推理快照(并在快照之间进行任意区别)比推理一系列增量要容易。例如,尝试在SVN中执行rebase。这也是Git不专门存储文件重命名的原因。

在内部,Git使用不同的方法,它可能使用增量,也可能只存储文件的简单直接副本(例如Git LFS)。关键是它在您的存储库中的内部表示形式是抽象的实现细节,除非您真的需要知道(但很好奇!),否则您不必担心它。

针对您的问题:

  
      
  1. 何时(如果有)存储文件的完整版本(例如testing.txt)。
  2.   

只要适合,例如存储完整文件比计算差异更快(例如,在您git addgit commit一些新文件之后),或者当您对许多小文件进行实质性更改时文件。

Git针对速度(需要引用)(而不是空间)进行了优化,因此,如果不存储差异比较快,那么将不存储差异。

  
      
  1. 创建新版本时(例如,添加了“ Hello World”),那么它只是存储增量。
  2.   

(“新版本”是指“新提交”。)

不是自动的,也不一定是。我建议阅读以下质量检查线程:Git internals: how does Git store small differences between revisions?

  
      
  1. 如果您使用文件testing.txt的100个版本,而我比较20到90,它如何构建2个版本然后进行比较?
  2.   

从概念上讲,它需要快照20和快照90并立即比较两者。

但是在内部,它可能需要先从其对象存储中构建快照20和快照90,然后才能对其进行比较-并且可能具有内置的优化功能,使它能够检测和忽略无关的提交和增量。