在提交了若干更新,又或者克隆了某个项目之后,我们想回顾下提交历史,可使用 git log
命令。
以"simplegit"项目作为示例。运行下面的命令获取项目:
$ git clone https://github.com/schacon/simplegit-progit
$ cd simplegit-progit/
$ git log
不传入任何参数的默认情况下,git log
会按时间先后顺序列出所有的提交,最近的更新排在最上面。这个命令会列出每个提交的 SHA-1 校验和
、作者的名字
和电子邮件地址
、提交时间
以及提交说明
。
$ git log -p -<n>
$ git log -patch -<n>
这条命令会按补丁
的格式显示每次提交所引入的差异,加上-<n>
可以限制显示的日志条目数。该选项除了显示基本信息之外,还附带了每次提交的变化。
$ git log --stat
这个命令可以看到每次提交的简略统计信息,并为git log
附带一系列的总结性选项。
$ git log --pretty=oneline
git log --pretty
这个选项可以使用不同于默认格式的方式展示提交历史。这个选项有一些内建的子选项供我们使用。比如 oneline
会将每个提交放在一行显示,在浏览大量的提交时非常有用。 另外还有 short
,full
和 fuller
选项,它们展示信息的格式基本一致,但是详尽程度不一:
$ git log --pretty=format:"%h - %an, %ar : %s"
format
可以定制记录的显示格式。 这样的输出对后期提取分析格外有用——因为我们知道输出的格式不会随着 Git 的更新而发生改变:
git log --pretty=format 常用的选项:
选项 | 说明 |
---|---|
%H | 提交的完整哈希值 |
%h | 提交的简写哈希值 |
%T | 树的完整哈希值 |
%t | 树的简写哈希值 |
%P | 父提交的完整哈希值 |
%p | 父提交的简写哈希值 |
%an | 作者名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 --date=选项 来定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期(距今多长时间) |
%s | 提交说明 |
$ git log --pretty=format:"%h %s" --graph
当 oneline
或 format
与另一个 log
选项 --graph
结合使用时尤其有用。 这个选项添加了一些 ASCII 字符串来形象地展示我们的分支、合并历史:
git log 的常用选项:
选项 | 说明 |
---|---|
-p | 按补丁格式显示每个提交引入的差异。 |
--stat | 显示每次提交的文件修改统计信息。 |
--shortstat | 只显示 --stat 中最后的行数修改添加移除统计。 |
--name-only | 仅在提交信息后显示已修改的文件清单。 |
--name-status | 显示新增、修改、删除的文件清单。 |
--abbrev-commit | 仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。 |
--relative-date | 使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。 |
--graph | 在日志旁以 ASCII 图形显示分支与合并历史。 |
--pretty | 使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。 |
--oneline | --pretty=oneline --abbrev-commit 合用的简写。 |
类似 --since
和 --until
这种按照时间作限制的选项很有用。 例如,下面的命令会列出最近两周的所有提交:
$ git log --since=2.weeks
可以是类似 "2008-01-15"
的具体的某一天,也可以是类似 "2 years 1 day 3 minutes ago"
的相对日期:
$ git log --since=2008-01-15
还可以过滤出匹配指定条件的提交。 用 --author
选项显示指定作者的提交,用 --grep
选项搜索提交说明中的关键字。
Note | 我们可以指定多个 --author 和 --grep 搜索条件,这样会只输出匹配 任意 --author 模式和 任意 --grep 模式的提交。然而,如果你添加了 --all-match 选项, 则只会输出匹配 所有 --grep 模式的提交。 |
---|
另一个非常有用的过滤器是 -S
,它接受一个字符串参数,并且只会显示那些添加或删除了该字符串的提交。假设我们想找出添加或删除了对某一个特定函数的引用的提交,可以调用:
$ git log --S function
最后一个很实用的 git log
选项是路径(path), 如果只关心某些文件或者目录的历史提交,可以在git log
选项的最后指定它们的路径。 因为是放在最后位置上的选项,所以用两个短划线(–)隔开之前的选项和后面限定的路径名。
限制 git log 输出的选项:
选项 | 说明 |
---|---|
-<n> | 仅显示最近的 n 条提交。 |
--since , --after | 仅显示指定时间之后的提交。 |
--until , --before | 仅显示指定时间之前的提交。 |
--author | 仅显示作者匹配指定字符串的提交。 |
--committer | 仅显示提交者匹配指定字符串的提交。 |
--grep | 仅显示提交说明中包含指定字符串的提交。 |
-S | 仅显示添加或删除内容匹配指定字符串的提交。 |
Tip | 隐藏合并提交按照我们代码仓库的工作流程,记录中可能有为数不少的合并提交,它们所包含的信息通常并不多。 为了避免显示的合并提交弄乱历史记录,可以为 log 加上 --no-merges 选项。 |
---|