Git のコミットを見やすくする

最近は、SourceTree を通じて git レポジトリを操作する人たちも多いようだ。私はふだん Ubuntu 上にいるので、残念ながら SourceTree は使用できない。コマンドベースで git を使わざるを得ない。

コマンドベースでもぜんぜん構わないのだが、どうも git show-branch や git log の出力が気に入らない。

たとえば、git show-branch -a とすると、次のような表示になる。

! [b2] ci2
 * [master] Revert "c5" YES!!
--
 * [master] Revert "c5" YES!!
 * [master^] c5
 * [master~2] c4
 * [master~3] ci2
+  [b2] ci2
+  [b2^] ci3
+* [master~4] ci1

git show-branch の使い方については、

git show-branch の見方 - 言語ゲーム

が詳しい。

要するに、git show-branch は1つ以上のブランチについて、共通の先祖コミットが現れるまでの各ブランチのすべてのコミットを表示してくれる。これでブランチの分岐具合がよくわかるというわけだ。

まず第一に私は上の [master^] みたいなコミットの相対表示が好きじゃないので、SHA1 ハッシュ表示してみよう。git における本当のオブジェクトは SHA1 だ。HEAD / ブランチ / タグ等はすべてこれら SHA1 をファイル名として持つオブジェクトに対する軽量のポインタにすぎないのだ。だから、最初から SHA1 で見たほうがいい。どうせ SHA1 は大抵の場合最初の4文字で識別できる。

(ちなみに git rev-parse コマンドの引数として、ブランチ名や最初の n 文字だけの SHA1 を与えると、完全な SHA1 ハッシュを得ることができる)

git show-branch --sha1-name -a とすると表示が次のように変わる。

! [b2] ci2
 * [master] Revert "c5" YES!!
--
 * [674042d] Revert "c5" YES!!
 * [41df102] c5
 * [efba81d] c4
 * [13aa75b] ci2
+  [af37738] ci2
+  [04cd130] ci3
+* [466ca30] ci1

このほうがずっと見やすいと思う。SHA1 ハッシュは最初の7文字に統一されているので、コミットメッセージが揃って見える。だが私はまだ不満がある。これだと「いつ」「誰が」コミットしたものかわからないのだ。

そこでまたシェルスクリプト(というか Ruby ワンライナー)で解決。

h2n (hash to name)

#!/bin/sh
ruby -pe '$_.gsub!(/([\da-f]{7})/) { "#{$1}:" + `git log -n 1 --pretty=format:%an #{$1}`[0,3] + ":" + `git log -n 1 --pretty=format:%ai #{$1}`[5,11] }'

このシェルスクリプトを使ってみる。

git show-branch --sha1-name -a | h2n

この表示結果はこんな感じ。

! [b2] ci2
 * [master] Revert "c5" YES!!
--
 * [674042d:Eij:02-20 13:18] Revert "c5" YES!!
 * [41df102:Eij:02-20 13:01] c5
 * [efba81d:Eij:02-20 12:53] c4
 * [13aa75b:Eij:02-20 12:49] ci2
+  [af37738:Eij:02-20 12:49] ci2
+  [04cd130:Eij:02-20 12:50] ci3
+* [466ca30:Eij:02-20 12:48] ci1

SHA1 ハッシュだけが表示されていた場所が [(SHA1):(Author の最初の3文字):(日時(月日時刻だけ))] と変化しているのがわかる。

h2n は単に 7桁の16進数が標準入力から来たら、それを commit の SHA1 だと想定して作者と日時を付加するのである。お好みにあわせて h2n を改造して、表示したいものを変えてほしい。

ブランチの分岐具合を別の形で表す git log --graph --oneline --decorate=short をパイプで h2n につなぐと結果はこんな感じ。

 git log --graph --oneline --decorate=short | h2n

表示結果。

*   b0b0f23:Eij:02-22 06:39 (HEAD, master) Merge branch 'b1'
|\  
| * bc91937:Eij:02-22 06:37 (b1) b1-3
* | 6c341ab:Eij:02-22 06:39 m4
|/  
* 521f612:Eij:02-22 06:35 b1-2
*   bdc88f3:Eij:02-22 06:33 m3
|\  
| * 5706047:Eij:02-22 06:32 b1-1
* | 46ba933:Eij:02-22 06:33 m2
|/  
* be4d840:Eij:02-22 06:31 1

…といちいち断りを入れるのが面倒だったので、偉そうに書いてしまったけど、私は git を本格的に使い始めて3週間の初心者なので、間違いがあったら(優しく)教えてくださいね。

Enjoy Git!