首页/开发/Git 与协作速查/commit-graph 加速历史遍历
进阶与大仓实践69 条

commit-graph 加速历史遍历

把提交的父子关系与序号写入图形文件,git log、merge-base 等历史类命令可显著提速;git gc 会顺带生成,也可手动写入与校验。

Git 与协作速查开发更新于 2026-10-13

commit-graph 是什么

commit-graph 是一个把提交之间的父子关系与代次信息预先算好的二进制图形文件。有了它,git log、merge-base、rev-list 这类需要反复遍历历史的命令不必每次重新解析每个提交对象,在大仓库上提速明显。它属于可再生缓存:丢了重新生成即可,不必当成不可替代的数据。

基本信息

写入git commit-graph write --reachable
增量写入git commit-graph write --reachable --split
校验git commit-graph verify
自动更新由 gc.writeCommitGraph 控制,较新版本默认随 gc 生成
文件位置.git/objects/info/commit-graph

典型使用场景

  • 大仓库里 git log 与行级追溯明显变慢时做一次历史加速
  • CI 中频繁做合并基查找与三路比较,缩短单个流水线耗时
  • 历史被重写(变基、过滤类操作)之后重新生成,避免用过期图形
  • 排查性能问题时先确认图形文件是否已生成、是否通过校验
  • 仓库例行维护中与垃圾回收一起定期执行

常用示例

常用示例
git commit-graph write --reachable          # 为所有可达提交写入图形文件
git commit-graph write --reachable --split   # 增量写入,避免每次全量重写
git commit-graph verify                      # 校验文件完整性
git gc                                       # 常规维护会顺带更新图形文件
time git log --oneline -5 --graph            # 简单对照命令耗时

子命令读法

命令作用说明
write --reachable生成图形文件覆盖所有可达提交
write --split增量写入适合频繁更新的仓库
verify校验文件检查是否损坏或与对象库不一致
图形文件是可再生的缓存:一旦怀疑过期或损坏,删除后重新写入比手工修补更简单,也不会影响仓库数据完整性。
每次重写历史(变基、过滤类操作、仓库搬迁)之后建议重新生成,否则历史类命令可能依据旧图形给出前后不一致的结果。
图形文件只记录提交对象的父代关系等元信息,不包含文件内容,所以它加速的是历史遍历而不是检出文件。大仓库通常把图形文件、多项索引与定期维护策略一起使用,日常命令的响应速度才会稳定下来;只做其中一项,收益往往被其他环节抵消。

易错点

  • 历史被改写后旧图形文件可能过期,需重新写入再校验,否则结果可能不一致
  • 多人写入的仓库里图形增量更新偶尔会异常,删除重建比手工修复更省事
  • 把图形文件当成版本库内容放进仓库或随包分发,等于把可再生缓存混入交付物
  • 只生成不校验,损坏时的症状是性能变差或命令报错,排查方向容易被带偏

数据来源与参考

  • Git 官方文档:git-commit-graph
  • Git 官方文档:git-config(gc.writeCommitGraph)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌