Git命令进阶操作:日志格式化

在本文中,我们会深入探讨如何对git log命令的输出进行格式化。大部分git log命令的可选项,可以帮你选择输出内容中包含每次提交的哪些信息。

如果你不喜欢默认的git log输出格式,可以在git config中配置下面将要介绍的一些格式化能力的别名。

Oneline

--oneline选项会把提交信息压缩输出在单行。默认情况下,只显示commit id和commit message的第一行内容。典型的git log --oneline命令的输出会像下面一样:

0e25143 Merge branch 'feature'
ad8621a Fix a bug in the feature
16b36c6 Add a new feature
23ad9ad Add the initial code base

这些内容对于搞清楚项目的概貌比较有用。

Decorate

很多时候,了解每一次提交所关联的分支或者tag是非常有用的。--decorate选项会让git log命令输出的同时显示关联引用(比如分支,tag之类的信息)。

这些选项也可以与其他选项同时使用。比如运行git log --oneline --decorate会输出形如下面的内容:

0e25143 (HEAD, main) Merge branch 'feature'
ad8621a (feature) Fix a bug in the feature
16b36c6 Add a new feature
23ad9ad (tag: v0.9) Add the initial code base

上面输出内容的第一行告诉你这次提交也同时是当前检出的HEAD指针,并显示它也是main分支的顶端。第二行的提交指向了另外一个分支名叫feature。最后第四行显示这次提交被打上了v0.9的标签。

分支,标签,HEAD以及提交历史几乎是Git仓库中包含的所有信息了,所以这个输出内容展示出仓库中更加完整的逻辑结构。

Diffs

git log命令包括很多用于展示diff的选项。两个最常见的选项是--stat-p

--stat选项显示了每次提交中删除和插入的代码行数(请注意修改一行意味着一行插入和一行删除)。如果仅需要查看提交所含有的变更简报那么使用这个命令就可以了。下面的例子中显示这次提交改变一个文件:hello.py,并对它进行了67行插入和38行删除的操作。

commit f2a238924e89ca1d4947662928218a06d39068c3
Author: John <john@example.com>
Date:   Fri Jun 25 17:30:28 2014 -0500

    Add a new feature

 hello.py | 105 ++++++++++++++++++++++++-----------------
 1 file changed, 67 insertion(+), 38 deletions(-)

文件名旁边的+-符号代表文件被改变行数的相对数。这些信息大概显示出什么样的修改可能出现在哪次提交中。

如果你想看到这次提交涉及到的实际变更,为git log命令添加-p选项。这会输出提交中的完整变更内容:

commit 16b36c697eb2d24302f89aa22d9170dfe609855b
Author: Mary <mary@example.com>
Date:   Fri Jun 25 17:31:57 2014 -0500

    Fix a bug in the feature

diff --git a/hello.py b/hello.py
index 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命令的特殊版,多数时候用于创建版本描述。它会将commit message的第一行按照提交人进行分组显示。便于查看谁在做什么。

比如对于一个项目,有两个开发者进行了5次提交,git shortlog的输出看上去大概是下面这样:

Mary (2):
      Fix a bug in the feature
      Fix a serious security hole in our framework

John (3):
      Add the initial code base
      Add a new feature
      Merge branch 'feature'

默认情况下,git shortlog会按照提交人的名称进行排序,但你也可以传入-n选项让输出内容按照提交人的提交数量进行排序。

Graph

--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

星号表示提交是发生在那个分支上的,所以上面的图告诉我们23ad9ad16b36c6这两次提交发生在功能分支上,剩下的提交都发生在main分支上。

对于简单的仓库来说上面的例子已经足够好用,但是对于更加依赖大量分支的仓库来说,可能会更倾向于使用具有完整功能的可视化工具,比如gitk或者sourcetree

自定义格式

对于其他定制化的日志展示需求,你完全可以使用--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的高级参数来格式化适合自己的日志输出。这有助于你能够抽取项目历史的有用信息。

这些新技能是Git工具包中的重要组成部分,但是记住git log经常与其他Git命令关联使用。一旦找到你所关心的那次提交,通常来说你都会需要使用git checkoutgit revert或者其他什么命令来操作这次提交。所以,还需持续不断的学习Git的高级功能。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容