高级 Git 日志

装饰 很多时候,知道每个提交与哪个分支或标记相关联是很有用的。--decorate 标记让 git log 显示指向每次提交的所有引用(例如分支、标签标记等)。

这可以与其他配置选项结合使用。例如,运行 git log --oneline --decorate 会格式化提交历史记录,方式类似于:

0e25143 (HEAD, main) Merge branch 'feature'ad8621a (feature) Fix a bug in the feature16b36c6 Add a new feature23ad9ad (tag: v0.9) Add the initial code base 这让您知道顶层提交也会签出(用 HEAD 表示),它也是 main 分支的尖端。第二次提交有另一个分支指向它,叫做 feature,最后第四次提交被标记为 v0.9。

分支、标记、HEAD 和提交历史记录几乎是 Git 存储库中包含的所有信息,因此这可以让您更全面地了解仓库的逻辑结构。

差异 git log 命令包含许多选项,用于显示每次提交的差异。两个最常见的选项是 --stat 和 -p。

--stat 选项显示每次提交修改的每个文件的插入和删除次数(请注意,修改一行表示为 1 次插入和 1 次删除)。当您想要摘要来总结每次提交引入的变更时,这会很有用。例如,以下提交在 hello.py 文件中添加了 67 行并删除了 38 行:

commit f2a238924e89ca1d4947662928218a06d39068c3Author: John Date: Fri Jun 25 17:30:28 2014 -0500 Add a new feature hello.py | 105 ++++++++++++++++++++++++----------------- 1 file changed, 67 insertion(+), 38 deletions(-) 文件名旁边的 + 和 - 符号表示每个文件被提交修改的相对变更次数。这让您知道在哪里可以找到每次提交变更。

如果您想查看每次提交引入的实际变更,可以将 -p 选项传递给 git log。这会输出代表该提交的整个补丁:

commit 16b36c697eb2d24302f89aa22d9170dfe609855bAuthor: Mary Date: Fri Jun 25 17:31:57 2014 -0500 Fix a bug in the featurediff --git a/hello.py b/hello.pyindex 18ca709..c673b40 100644--- a/hello.py+++ b/hello.py@@ -13,14 +13,14 @@ B-print("Hello, World!")+print("Hello, Git!") 对于有大量变更的提交,生成的输出可能会变得很长而且很笨拙。通常,如果您显示的是完整的补丁,您可能是在搜索特定的变更。为此,您想使用 pickaxe 选项。

Shortlog git shortlog 命令是 git log 的特殊版本,旨在创建版本公告。它按作者对每个提交分组,并显示每条提交消息的第一行。这是查看谁在做什么的简单方法。

例如,如果两个开发人员为一个项目贡献了 5 次提交,则 git shortlog 的输出可能如下所示:

Mary (2): Fix a bug in the feature Fix a serious security hole in our frameworkJohn (3): Add the initial code base Add a new feature Merge branch 'feature' 默认情况下,git shortlog 按作者姓名对输出进行排序,但您也可以传递 -n 选项,按每位作者的提交次数进行排序。

图 --graph 选项绘制一个 ASCII 图,表示提交历史记录的分支结构。它通常与 --oneline 和 --decorate 命令结合使用,以便更容易查看哪个提交属于哪个分支:

git log --graph --oneline --decorate 对于一个只有 2 个分支的简单存储库,这将产生以下结果:

* 0e25143 (HEAD, main) Merge branch 'feature'|\ | * 16b36c6 Fix a bug in the new feature| * 23ad9ad Start a new feature* | ad8621a Fix a critical security issue|/ * 400e4b7 Fix typos in the documentation* 160e224 Add the initial code base 星号显示提交在哪个分支上,因此上图告诉我们 23ad9ad 和 16b36c6 提交位于主题分支上,其余的都在 main 分支上。

虽然对于简单的存储库来说,这是一个不错的选择,但对于分支较多的项目,最好使用功能更全的可视化工具,比如 gitk 或 Sourcetree。

自定义格式 对于所有其他 git log 格式化需求,您可以使用 --pretty=format:"" 选项。这使您可以使用 printf 风格的占位符随心所欲地显示每个提交。

例如,以下命令中的 %cn、%h 和 %cd 字符分别替换为提交者名称、缩写的提交哈希和提交者日期。

git log --pretty=format:"%cn committed %h on %cd" 这会导致每次提交都采用以下格式:

John committed 400e4b7 on Fri Jun 24 12:30:04 2014 -0500 John committed 89ab2cf on Thu Jun 23 17:09:42 2014 -0500 Mary committed 180e223 on Wed Jun 22 17:21:19 2014 -0500 John committed f12ca28 on Wed Jun 22 13:50:31 2014 -0500 占位符的完整列表可以在完整格式部分找到,该部分在 git log 手册页中。

除了允许您仅查看您感兴趣的信息外,--pretty=format:"" 选项在您尝试将 git log 输出传送到另一个命令中时特别有用。