历史查询的性能习惯
历史类命令在超大仓库上的开销差异很大:git log 会对可达提交做全量遍历,不加限制时等待时间随仓库规模上升。核心习惯是限定范围(提交区间、路径、时间窗)、选择轻量输出(--oneline、--count),并按需用 --first-parent 只看主线。commit-graph 文件生效后,提交元数据的遍历还会更快。
基本信息
| 限定范围 | git log <区间> -- <路径>,配合 -n 控制条数 |
|---|---|
| 主线优先 | --first-parent 只看合并主线,跳过支线提交 |
| 时间窗 | --since 与 --until 过滤提交时间 |
| 轻量输出 | --oneline、--count、--no-merges、--no-decorate |
| 底层数据 | commit-graph 缓存提交元数据,加速遍历 |
典型使用场景
- 快速浏览最近动向:git log --oneline -20 逐条读主线
- 追某文件的变更史:加 -- <路径> 把遍历限制到相关历史
- 统计提交数:git rev-list --count 比拉全量 log 再数行更轻
- 发布对比:git log v1.1.0..v1.2.0 --oneline 列出两版之间的提交
- 排查慢查询:去掉路径参数对比,判断瓶颈在遍历还是路径过滤
常用组合
常用组合
git log --oneline -20 # 最近 20 条,轻量浏览
git log --first-parent --oneline -30 origin/main # 只看合并主线上的提交
git log --since='2 weeks ago' --no-merges --oneline # 时间窗内、排除合并提交
git log --oneline v1.0.0..v1.1.0 -- src/ # 区间加路径,范围最小化
git log --oneline --no-decorate -10 # 关闭分支装饰,输出更轻
git rev-list --count HEAD # 只数提交数,不做格式化开销常用限定手段
| 手段 | 作用 | 注意 |
|---|---|---|
| 路径过滤 -- 路径 | 只遍历相关历史 | 配 --follow 会显著变慢,按需使用 |
| --first-parent | 跳过支线提交 | 按合并看主线合适,查支线细节不合适 |
| --no-merges | 排除合并提交 | 纯代码变更视角 |
| --count 与 rev-list | 只统计数量 | 比拉全量 log 再数行轻 |
| commit-graph | 缓存提交元数据 | gc 或 maintenance 时生成 |
排查 log 变慢先做对照:同一命令去掉路径参数、再去掉 --follow 各跑一次,两轮对比即可定位开销大头。
commit-graph 是性能文件:可随 git gc 重建,也可用 git commit-graph verify 检查完整性;部分托管平台克隆下来的仓库默认已带。