如何用git log
选择项目历史中的特定提交:
按数量
git log
最基础的过滤选项是限制显示的提交数量。当你只对最近几次提交感兴趣时,它可以节省你一页一页查看的时间。
你可以在后面加上-<n>
选项。比如说,下面这个命令会显示最新的3次提交:
git log -3
按日期
如果你想要查看某一特定时间段内的提交,你可以使用--after
或 --before
标记来按日期筛选。它们都接受好几种日期格式作为参数。比如说,下面的命令会显示2014年7月1日后(含)的提交:
git log --after="2014-7-1"
你也可以传入相对的日期,比如一周前("1 week ago
")或者昨天("yesterday
"):
get log --after="yesterday"
你可以同时提供--before
和 --after
来检索两个日期之间的提交。比如,为了显示2014年7月1日到2014年7月4日之间的提交,你可以这么写:
git log --after="2014-7-1" --before="2014-7-4"
注意--since
、--until
标记和--after
、--before
标记分别是等价的。
按作者
当你只想看某一特定作者的提交的时候,你可以使用--author
标记。它接受正则表达式,返回所有作者名字满足这个规则的提交。如果你知道那个作者的确切名字你可以直接传入文本字符串:
git log --author="John"
它会显示所有作者叫John的提交。作者名不一定是全匹配,只要包含那个子串就会匹配。
你也可以用正则表达式来创建更复杂的检索。比如,下面这个命令检索名叫Mary或John的作者的提交。
git log --author="John\|Mary"
注意作者的邮箱地址也算作是作者的名字,所以你也可以用这个选项来按邮箱检索。
如果你的工作流区分提交者和作者,--committer
也能以相同的方式使用。
按提交信息
按提交信息来过滤提交,你可以使用--grep
标记。它和上面的--author
标记差不多,只不过它搜索的是提交信息而不是作者。
比如说,你的团队规范要求在提交信息中包括相关的issue编号,你可以用下面这个命令来显示这个issue相关的所有提交:
git log --grep="JRA-224:"
你也可以传入-i
参数来忽略大小写匹配。
按文件
很多时候,你只对某个特定文件的更改感兴趣。为了显示某个特定文件的历史,你只需要传入文件路径。比如说,下面这个命令返回所有和foo.py
和bar.py
文件相关的提交:
git log -- foo.py bar.py
--
告诉git log
接下来的参数是文件路径而不是分支名。如果分支名和文件名不可能冲突,你可以省略--
。
按内容
我们还可以根据源代码中某一行的增加和删除来搜索提交。这被称为pickaxe,它接受形如-S"<string>"
的参数。比如说,当你想要知道Hello, World!
字符串是什么时候加到项目中哪个文件中去的,你可以使用下面这个命令:
git log -S "Hello, World!"
如果你想用正则表达式而不是字符串来搜索,你可以使用-G"<regex>"
标记。
这是一个非常强大的调试工具,它能让你定位到所有影响代码中特定一行的提交。它甚至可以让你看到某一行是什么时候复制或者移动到另一个文件中去的。
按范围
你可以传入范围来筛选提交。这个范围由下面这样的格式指定,其中<since>
和<until>
是提交的引用:
git log <since>..<until>
这个命令在你使用分支引用作为参数时特别有用。这是显示两个分支之间区别最简单的方式。看看下面这个命令:
git log master..feature
其中的master..feature范围包含了在feature分支而不在master分支中所有的提交。换句话说,这个命令可以看出从master分支fork到feature分支后发生了哪些变化。它可以这样可视化:
注意如果你更改范围的前后顺序(feature..master),你会获取到master分支而非feature分支上的所有提交。如果git log
输出了全部两个分支的提交,这说明你的提交历史已经分叉了。