git log:格式化与筛选

QuibblerQuibbler 2020-03-26 约 6 分钟 2125 次阅读

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 高级命令。

相关推荐

git rebase调整commit提交的顺序
Git

git rebase调整commit提交的顺序

git rebase调整commit之间顺序一连提交了几笔commit,想调整一下顺序,把其中一笔提交置顶拿到最前面来,专门修改这一笔提交。当然如果想修改某一笔提交,可以reset到那笔commit,进行修改,完成之后再把之后的提交cherry-pick回去。git log查看提交记录,每笔提交记录太多,可以让每笔提交仅显示一行查看 --oneline。使用git rebase -i进入编辑,之前

1.4w
git blame:显示文件的每行提交记录信息
Git

git blame:显示文件的每行提交记录信息

git blame:显示文件的每行提交记录信息git blame对文件的每行信息都进行注释。能看到关于该行修改的每一次commit的哈希标签、作者和提交日期。Intellij IDEA在打开文件的行数右键点击Annotate显示文件每一行的记录信息。应该用的就是这个命令实现的功能。

5.9k
Git可视化工具:Sublime Merge
Git

Git可视化工具:Sublime Merge

Git可视化工具:Sublime Merge同事推荐了一个Git 可视化客户端:Sublime Merge ,由知名文本编辑器 Sublime Text 开发商打造。自己平时用的则是最好用的Git GUI工具:SourceTree,也体验了下Sublime Merge,用起来还不错。直接点击下载或购买后,安装即可。功能免费,完整功能无限制使用。但是订阅内容(比如更换主题)付费。Sublime Me

3.1k