git - git如何存储版本信息
问题描述
我很好奇 GIT 如何存储文件的版本信息。
我猜它们很可能是增量,但如果一个文件有很多版本(例如 100),那么:
a) 何时(如果有)存储文件的完整版本(例如 testing.txt)。
b)当一个新版本被创建(假设“Hello World”被添加到它)时,它是否只存储一个增量。
c)如果你有一个文件 testing.txt 的 100 个版本,我比较 20 到 90 它如何构建 2 个版本,然后区分?
谢谢你。
解决方案
(免责声明:我不是git
专家 - SO 上的其他用户比我知识渊博,我邀请他们编辑和改进我的答案)
Git 面向用户的外部模型是,提交表面上代表你的 repo 状态的快照,而不是 SVN 和 TFS 工作方式的增量或变更集。这就是 Git 如此强大的原因:因为推理快照(并在快照之间做出任意差异)比推理一系列增量更容易。例如,尝试rebase
在 SVN 中做一个。这也是 Git 不专门存储文件重命名的原因。
在内部,Git 使用不同的方法,它可能使用增量,或者它可能只是存储文件的简单直接副本(例如 Git LFS)。关键是它对你的 repo 的内部表示是一个抽象的实现细节,除非你真的需要知道,否则你不应该关心它(但好奇是件好事!)
针对您的问题:
- 何时(如果有)存储文件的完整版本(例如 testing.txt)。
只要它适合它,例如当存储完整文件比计算差异(例如在你git add
和git commit
一些新文件之后)更快或者当你对大量小文件进行重大更改时。
Git针对速度(需要引用)而不是空间进行了优化,因此如果不存储差异更快,那么它就不会存储差异。
- 当创建一个新版本时(假设添加了“Hello World”),它是否只存储一个增量。
(通过“新版本”我假设您的意思是“新提交”。)
不是自动也不一定。我建议阅读这个 QA 线程:Git internals: Git 如何存储修订之间的微小差异?
- 如果你有一个文件的 100 个版本,
testing.txt
我比较 20 到 90 它如何构建 2 个版本然后差异?
从概念上讲,它拍摄快照 20 和快照 90,并立即比较两者。
但是在内部,它可能需要先从其对象存储构建快照 20 和快照 90,然后才能对其进行比较 - 并且可能存在内置优化,使其能够检测和忽略不相关的提交和增量。
推荐阅读
- html - 只有一列可滚动的网格布局
- javascript - Web Audio Api 与 Web Speech Api 集成 - 将扬声器/声卡输出流式传输到语音识别 api
- java - 是否不再维护独立的 ecj(Eclipse Java 编译器)包?
- c++ - 谷歌云语音到文本 C++
- r - R中的聚集堆积条形图
- c# - 如何将值从 View 传递到 .doc 模板?
- c# - 由于 DataGridView 中的空白单元格,我收到数据类型不匹配错误
- javascript - 根据在另一个选择下拉列表中选择的年份动态显示选择下拉列表中剩余的可用月份
- arrays - 有人可以为我更深入地解释 Scala 中关于数组的不变性/可变性概念吗?
- javascript - 调用 stopBackgroundTimer 时 React Native runBackgroundTimer 不会停止