git log 是回溯项目历史的窗口:谁在什么时候改了什么、为什么改,全靠它回答。它的高级用法其实只有两条主线——格式化每条提交怎么展示、筛选哪些提交被展示,组合起来就能定位到任何一段历史。这篇按五类整理常用参数并附速查表,完整参数用 git help log 或 官方 git-log 文档 查询,系统讲解见 Pro Git 的查看提交历史一章。
1、基础用法与短日志
最基本的 git log 按时间倒序列出提交,语法是 git log [选项] [修订范围] [路径]。它还有个分工明确的兄弟命令:git shortlog 按作者对提交分组,每组只列提交信息的第一行,统计各贡献者的活跃度时特别直观。
格式化与筛选两组参数可以自由叠加,下面分别整理。
2、格式化展示
控制"每条提交长什么样"的五个参数如下:
git log --oneline # 每条一行:简短哈希 + 消息首行
git log --decorate # 显示引用名(分支、标签指向哪条提交)
git log --stat # 附上每个提交的文件变更与增删行数摘要
git log -p # 附上每个提交的完整 diff
git log --graph # 左侧绘制提交历史的文本图形
--oneline 是 --pretty=oneline --abbrev-commit 的简写,日常最常用。--decorate 自 Git 2.13 起默认已按 auto 模式开启,显式写出多是为了配置兼容。实战高频组合是三连:git log --oneline --graph --decorate,一行一条提交、带分支拓扑图、标注引用名,看分支合流分叉一目了然。注意 --graph 不能与 --no-walk 组合使用。
3、按条件筛选
控制"哪些提交出现"的第一组过滤器,覆盖数量、日期、作者与消息:
git log -n 5 # 只显示最近 5 条
git log --after '2020-3-20' # 某日期之后的提交
git log --after 'yesterday' # 支持昨天这类自然语言
git log --before '2020-4-1' # 某日期之前
git log --author 'zhang' # 作者名匹配(支持正则)
git log --grep 'AIDL' # 按提交消息筛选(支持正则)
日期参数还能组合成区间,比如查某一周的提交量。统计类的更多玩法(按作者数提交、按周期出报表)可以看 Git 统计数据命令。多条件同时给出时默认取交集,想取并集加 --all-match 相关语义前先查文档确认。
4、按内容与范围筛选
更进一层的两个定位利器:搜代码变更、圈历史区间。
git log -S 'getInstance' # 搜索增删过该代码串的提交(pickaxe)
git log main..feature # feature 有而 main 没有的提交
git log c8f17..eb6c7 # 两个提交之间的区间(eb6c7 方向可达)
git log --merges # 只看合并提交
git log --no-merges # 反之,过滤掉合并提交
-S 俗称"鹤嘴锄":想弄清某行代码是谁引入或删除的,直接搜代码片段,比翻文件历史快得多。区间语法 A..B 表示"B 可达而 A 不可达"的提交集合——注意与空格写法的区别,git log c8f17 eb6c7 是两条历史的并集而非区间,旧资料常把这俩混为一谈。
5、速查表
两组参数浓缩一张表:
| 场景 | 命令 |
|---|---|
| 一行一条带拓扑图 | git log --oneline --graph --decorate |
| 看每条提交改了什么 | git log --stat 或 git log -p |
| 最近 N 条 | git log -n 5 |
| 按日期 / 作者 / 消息 | --after 'yesterday' / --author 'zhang' / --grep 'AIDL' |
| 谁动过这行代码 | git log -S 'getInstance' |
| 两点之间的提交 | git log A..B |
| 只看 / 不看合并 | git log --merges / --no-merges |
6、总结
git log 的用法一句话概括:格式化五参数(--oneline、--decorate、--stat、-p、--graph)决定长相,筛选参数(-n、日期、--author、--grep、-S、范围、--merges)决定范围,自由组合即得所需视图。两个易错点记住——区间是 A..B 而空格写法是并集、--graph 不与 --no-walk 同用。对于日常排障,建议把速查表存进备忘录,与前面的分支、stash 两篇凑成 Git 三件套速查,更多例子可参考 Git 系列之 git log 高级命令。


