首页 > 解决方案 > git如何存储版本信息

问题描述

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

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

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

b)当一个新版本被创建(假设“Hello World”被添加到它)时,它是否只存储一个增量。

c)如果你有一个文件 testing.txt 的 100 个版本,我比较 20 到 90 它如何构建 2 个版本,然后区分?

谢谢你。

标签: gitdiff

解决方案


(免责声明:我不是git专家 - SO 上的其他用户比我知识渊博,我邀请他们编辑和改进我的答案)

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

在内部,Git 使用不同的方法,它可能使用增量,或者它可能只是存储文件的简单直接副本(例如 Git LFS)。关键是它对你的 repo 的内部表示是一个抽象的实现细节,除非你真的需要知道,否则你不应该关心它(但好奇是件好事!)

针对您的问题:

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

只要它适合它,例如当存储完整文件比计算差异(例如在你git addgit commit一些新文件之后)更快或者当你对大量小文件进行重大更改时。

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

  1. 当创建一个新版本时(假设添加了“Hello World”),它是否只存储一个增量。

(通过“新版本”我假设您的意思是“新提交”。)

不是自动也不一定。我建议阅读这个 QA 线程:Git internals: Git 如何存储修订之间的微小差异?

  1. 如果你有一个文件的 100 个版本,testing.txt我比较 20 到 90 它如何构建 2 个版本然后差异?

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

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


推荐阅读