Skip to content

Git 中的模式

Git 的数据模型建立在写时复制的不可变对象和高效差异比较之上。

模式位置作用
写时复制object-file.c内容寻址不可变对象,分支共享数据
差异/补丁diff.c, xdiff/Myers 差异算法
位掩码read-cache-ll.hCE_* 缓存条目标志——暂存、有效、intent-to-add
布隆过滤器bloom.c变更路径布隆过滤器,加速 git log -- <path>
Trie 前缀树read-cache.c名称哈希表用于快速目录级路径查找
LRU 缓存pack-objects.cDelta 基础缓存,复用已计算的 delta
默克尔树tree.c内容寻址 Merkle DAG——每个 commit、tree、blob 均哈希,改一字节则所有哈希上推至根

模式如何组合:git commit

当你执行 git commit 时,多个模式协同工作,创建一个不可变、可验证的快照:

git commit -m "fix bug"
1
差异/补丁

Git 计算索引(暂存区)与工作树之间的 diff 以确定变更内容。

2
写时复制

变更的文件成为新的 blob 对象。未变更的文件通过引用共享(相同 SHA-1 → 相同对象)。除非实际变更,否则不复制数据。

3
默克尔树

tree 对象对其子节点哈希。一个 blob 的变更会改变父 tree 的哈希,进而改变 commit 哈希。任何位置的篡改都可从根节点检测。

4
布隆过滤器

commit-graph 文件存储变更路径的布隆过滤器。后续 git log 查询可跳过未触及指定路径的 commit,无需读取 tree。

核心洞察是写时复制 + Merkle 哈希同时赋予了 Git 空间效率(共享对象)和完整性验证(防篡改哈希),两者之间没有任何权衡。

延伸阅读

基于 MIT 许可证发布。