git 是一款非常牛逼的分布式代码管理工具,Linux 之父 linus torvalds 所编写,是目前全世界最流行的代码管理工具,全世界最大的代码托管平台 Github 就是基于 git 做的,无数的开源项目使用 git ,如果不会 git 简直无法在开源世界立足,因为最近在看 《pro git》 这本书,所以我会写几篇 git 的文章,这篇文章主要介绍 git log 子命令的一些用法
log 基础
如果想查看一个 git 管理的项目的提交记录,可以通过 log 子命令来查看,为了演示,就把 Flask 项目的源码拉下来演示
git clone https://github.com/pallets/flask.git |
进入项目,直接通过 git log 可以查看所有的历史提交
cd flask |
follow
通过 --follow $FILE 选项可以查看所有提交历史中,包含指定文件更改的记录
git log --follow Makefile #查看 Makefile 的更改 |
感觉输出的条目太多了,我只想看最后一条怎么办?在选项前指定想要查看的行数 -number
git log -1 --follow Makefile |
merges
通过 --merges 显示合并的提交
git log -1 --merges |
no-merges
通过--no-merges 显示不是合并的提交
git log -1 --no-merges |
author
通过--author 过滤出对应作者的提交,我们看一下 Flask 作者Armin Ronacher 的提交
git log --author='Armin Ronacher' -1 |
stat
通过--stat 显示对比上一次提交,文件的增减
git log --stat -3 |
since
通过--since 显示某天之后的提交
git log --since '2 week ago' |
since 可以在很多种格式下工作,例如 git log --since 2015-7-11 ,git log --since 2.weeks
until
通过—until 显示某天之前的提交,和since 相反
git log --until 6.year.11.month.17.day |
显示diff
也可以通过 -p 选项来显示每一次提交之间的 diff
git log -p -2 |
搜索名称
通过 grep 选项,可以通过提交名称来过滤
git log --grep fix -3 |
搜索字符串
通过 -S 选项,可以过滤出指定字符串的修改的提交,可以配合 -p 来查看
git log -S 'app.run()' -p -1 |
组合使用
git log 子命令大多数情况下都可以指定文件,查看这个文件的历史提交,如果不指定文件的情况下,则查看这个 repo 的历史提交
我们也可以组合上面这些选项使用
例如:找出Armin Ronacher 在六年 十一月 十八天 前对 setup.py 的提交
git log --author='Armin Ronacher' --stat --until 6.year.11.month.18.day setup.py |
更漂亮的输出
通过 pretty 选项可以让 log 的输出更加的符合我们的需求
oneline
输出格式如下
每个提交只输出一行,更加简洁
git log --pretty=oneline -2 |
short
输出格式如下
commit
Author:
输出简短的信息,默认就是 short
git log --pretty=short -2 |
medium
输出格式如下
commit
Author:
Commit:
git log --pretty=medium -2 |
other
还有 full、email、full、fuller 、raw 等 git 自带的格式输出,这里就不介绍了
自定义输出
pretty 强大之处在于它可以自定义 log 的输出,就像下面这样
git log --pretty=format:'%H - %ae' -2 |
格式如下,更多的看官方文档。。
- %H: commit hash
- %h: abbreviated commit hash
- %T: tree hash
- %t: abbreviated tree hash
- %P: parent hashes
- %p: abbreviated parent hashes
- %an: author name
- %aN: author name (respecting .mailmap, see git-shortlog(1) or git-blame(1))
- %ae: author email
- %aE: author email (respecting .mailmap, see git-shortlog(1) or git-blame(1))
- %ad: author date (format respects –date= option)
- %aD: author date, RFC2822 style
从 stackoverflow 上抄了两个很好看的 log format,当然,你并不需要输入那么长,可以定义别名
git log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all |
git log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all |
参考资料:
《progit》