Git 的核心工作机制
🔍 差异存储(Delta Storage)
Git 会比较文件的变化,只存储改变的部分,而不是整个文件的完整副本。
举个例子:
假设你有一个 100KB 的文件,第一次提交时 Git 会完整保存。
第二次只修改了一行代码,Git 只会存储:
- "第50行,删除了 'old code',新增了 'new code'"
- 而不是重新保存整个 100KB 的文件
📦 高效的对象存储
Git 使用四种核心对象:
- Blob:存储文件内容
- Tree:存储目录结构
- Commit:存储提交信息(作者、时间、父提交等)
- Tag:存储标签信息
🔄 工作原理
第一次提交:文件A(版本1) → Blob对象A1
第二次提交:文件A(版本2) → 比较差异 → 存储差异 + 指向A1的引用
第三次提交:文件A(版本3) → 比较差异 → 存储差异 + 指向A2的引用
验证你的理解
你可以通过以下命令看到 Git 的智能存储:
bash
# 查看某个文件的历史变化
git log -p 文件名
# 查看存储效率
git count-objects -v
为什么这样设计?
- 节省空间:只存储变化,大大减少仓库体积
- 快速比较:可以轻松比较任意两个版本之间的差异
- 完整历史:通过链式引用,可以重建任何历史版本
- 分支高效:创建分支几乎不占额外空间
例外情况
对于二进制文件(如图片、编译产物),Git 无法进行差异分析,所以会完整存储每个版本。这就是为什么建议不要在 Git 中存放大型二进制文件。
你的理解完全正确! Git 是一个智能的版本控制系统,而不是简单的文件备份工具。这正是它比直接复制文件夹高效得多的原因。