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》