キーワード検索48の記事がヒットしました。

鳥に生まれることができなかった人へ

うわっ、git logの結果、簡単すぎ…?

git logのオプションを紹介した#2の記事で、git log --all --graph --onelineという例を挙げました。

$ git log --all --graph --oneline
*   1a678ae (HEAD -> main) Merge branch 'develop'
|\
| * cdb059c (develop) Develop Commit
|/
* 6614af6 Initial Commit

しかしコミットの日時情報すらなく、ちょっと簡素的すぎるかもと思います。かといってデフォルトのままだと冗長、、、。そこで今回は、git logの結果を任意の形式にカスタマイズして出力する方法をお伝えします。

—formatでカスタマイズできる

まずは以下のコマンドを入力してみてください。--all--graphを付けているので、全てのブランチのコミット情報がグラフ形式で出力されるのは変わりません。--format='d %h'としているところがポイントです。

$ git log --all --graph --format='%d %h'
*   1a678ae
|\
| * cdb059c
|/
* 6614af6

何となーくお分かりかもしれませんが、%hはハッシュIDの短縮版を表します。次は半角スペースを空けながら%d %h %sと入力してみます。

$ git log --all --graph --format='%d %h %s'
*    (HEAD -> main) 1a678ae Merge branch 'develop'
|\
| *  (develop) cdb059c Develop Commit
|/
*  6614af6 Initial Commit

%dはブランチやタグを表し、%sはコミットメッセージを表します。そう!--format='%〇%〇'の形式で、出力内容を自由にフォーマットすることができるのです。

記号 内容
%H ハッシュID
%h ハッシュID(短縮版)
%P 親のハッシュID
%p 親のハッシュID(短縮版)
%T ツリーのハッシュID
%t ツリーのハッシュID(短縮版)
%s コミットメッセージ
%an Authorの名前
%ad Author Date
%cn committerの名前
%cd Committer Date
%d ブランチやタグ

また、[]-といった記号も自由に記述できます。 %hを”[]“で囲うとこうなります。

$ git log --all --graph --format='%d [%h] %s'
*    (HEAD -> main) [1a678ae] Merge branch 'develop'
|\
| *  (develop) [cdb059c] Develop Commit
|/
*  [6614af6] Initial Commit

ちょっと特殊な文字で、タブも入力できます。

記号 内容
%x09 水平タブ

x09は「水平タブ」のASCIIコードです。文字コードを直接入力することができるようですね(0x09ではなく、x09と入力します。)。

$ git log --all --graph --format='%x09 %d [%h] %s'
*         (HEAD -> main) [1a678ae] Merge branch 'develop'
|\
| *       (develop) [cdb059c] Develop Commit
|/
*         [6614af6] Initial Commit

なに?色が消えて白黒になった?大丈夫です。色を付ける方法もちゃんと後でお伝えします。

日付を表示させる

とりあえずブランチ、ハッシュID、コミットメッセージは表示させましたが、日付も表示させたいですね。日付のフォーマットは--dateで行います。

まずは、コミット日時を表す%cd--format=''の中に追記します。

$ git log --all --graph --oneline --format='%x09 %d [%h] [%cd] %s'
*         (HEAD -> main) [1a678ae] [Wed Jan 25 11:48:27 2023 +0900] Merge branch 'develop'
|\
| *       (develop) [cdb059c] [Wed Jan 25 11:48:26 2023 +0900] Develop Commit
|/
*         [6614af6] [Wed Jan 25 11:48:25 2023 +0900] Initial Commit

うーん読みにくいですね。というわけで、--date=shortを追記してみます。--dateは出力される日付のフォーマットを決定するオプションです。場所はどこでも構いません。私は末尾に記述しました。

$ git log --all --graph --oneline --format='%x09 %d [%h] [%cd] %s' --date=sh
ort
*         (HEAD -> main) [1a678ae] [2023-01-25] Merge branch 'develop'
|\
| *       (develop) [cdb059c] [2023-01-25] Develop Commit
|/
*         [6614af6] [2023-01-25] Initial Commit

指定できるオプションは以下のようなものがあります。

オプション 出力
local ローカルタイムゾーン
iso ISO 8601フォーマット
rfc rfc 2822フォーマット
short YYYY-MM-DD
realative 相対時間

中でもrealativeは使う機会があるかもしれません。現時点を基準に3days agoなどと表示してくれます。

$ git log --all --graph --oneline --format='%x09 %d [%h] [%cd] %s' --date=relative
*         (HEAD -> main) [1a678ae] [2 minutes ago] Merge branch 'develop'
|\
| *       (develop) [cdb059c] [3 minutes ago] Develop Commit
|/
*         [6614af6] [4 minutes ago] Initial Commit

--date=formatでカスタマイズする

もっと細かに日付のフォーマットを加工したいなら、--date=format:'○○'という形で指定します。

Gitのリファレンスを探してもオプションに関する記述を見つけられなかったですが、恐らく以下のようなオプションがあると思われます。

オプション 出力 出力例
%Y 2023
%y 年(短縮) 23
%m 11
%d 11
%H 17
%M 42
%S 01

例えば--date=format:'%Y/%m%d-%H%M'とすると、以下のように出力されます(段々長くなってきて疲れてきましたね)。

$ git log --all --graph --oneline --format='%x09 %d [%h] [%cd] %s' --date=format:'%Y/%m/%d %H:%M'
*         (HEAD -> main) [1a678ae] [2023/01/25 11:48] Merge branch 'develop'
|\
| *       (develop) [cdb059c] [2023/01/25 11:47] Develop Commit
|/
*         [6614af6] [2023/01/25 11:46] Initial Commit

結果に色を付ける

では最後に、出力結果に色を付けたいと思います。現在は以下の画像のように真っ白だと思いますが、

image01

やっぱり適宜色がついていた方が可読性が高いですよね。

色の指定は--formatの中に%C(色)という風に記述します。まずは--format='%C(auto)'と指定してみます。

$ git log --all --graph --oneline --format='%C(auto) %x09 %d [%h] [%cd] %s' --date=format:'%Y/%m/%d %H:%M'
*         (HEAD -> main) [1a678ae] [2023/01/25 11:48] Merge branch 'develop'
|\
| *       (develop) [cdb059c] [2023/01/25 11:48] Develop Commit
|/
*         [6614af6] [2023/01/25 11:48] Initial Commit

恐らく以下の画像の様な配色になっていると思います。

ブランチやハッシュIDが自動的に色付けされる

%C(auto)とすることで、Gitが自動的にいい感じに色を付けてくれます。

自分で色を決めたい

なに?自分で色を決めたいんですか?ちょっと大変ですができます。

例えば、文字を赤くしたいなら、--formatの最初に%C(red)と記述します。

$ git log --all --graph --format='%x09 %C(red) %d [%h] [%cd] %s' --date=format:'%Y/%m%d %H:%M'
*          (HEAD -> main) [1a678ae] [2023/0125 11:48] Merge branch 'develop'
|\
| *        (develop) [cdb059c] [2023/0125 11:48] Develop Commit
|/
*          [6614af6] [2023/0125 11:48] Initial Commit

そうすると以下の通り、出力全体が赤くなります。

image03

色はblackgreenyellowbluemagentacyan, whiteなどの色にも対応していますし、%C(#003399)という風にカラーコードで指定することもできます。

また、%C(reset)とすれば、色の変更の適用をそこでストップできます。例えば%C(red) %d %C(reset)とすれば、ブランチ名だけが赤く表示されそれ以降は白い文字になります。

$ git log --all --graph --format='%x09 %C(red) %d %C(reset) [%h] [%cd] %s' --date=format:'%Y/%m%d %H:%M'
*          (HEAD -> main)  [1a678ae] [2023/0125 11:48] Merge branch 'develop'
|\
| *        (develop)  [cdb059c] [2023/0125 11:48] Develop Commit
|/
*           [6614af6] [2023/0125 11:48] Initial Commit

image04

さらに、%C(色 reverse)とすることで、背景を塗りつぶすことができます。以下の例では、ハッシュ値の背景をシアンに塗りつぶしています。

$ git log --all --graph --format='%x09 %C(red) %d %C(reset) %C(cyan reverse) %h %C(reset) [%cd] %s' --date=format:'%Y/%m%d %H:%M'
*          (HEAD -> main)   1a678ae  [2023/0125 11:48] Merge branch 'develop'
|\
| *        (develop)   cdb059c  [2023/0125 11:48] Develop Commit
|/
*            6614af6  [2023/0125 11:48] Initial Commit

image05

最後にエイリアスを設定しよう

以上が主なカスタマイズ方法ですので、皆さん心行くまでカスタマイズを楽しんでください(私は数時間で飽きました。その後泣きながらこの記事を書いていました)。世界に一つだけのカスタマイズが完成したら、すぐに呼び出せるようにエイリアスを作成しましょう。

git config --edit --globalで設定ファイルが呼び出せるので、以下のように入力すればOKです。

[alias]
        lol = log --all --graph --format='%x09 %C(red) %d %C(reset) %C(cyan reverse) %h %C(reset) [%cd] %s' --date=format:'%Y/%m/%d %H:%M'

今回まで長らく続いてきたgit logに関する解説はひとまず終了です。次は恐らくコンフリクトかgit rebaseあたりの記事になると思います。

参考

Git - pretty-formats Documentation

git logのフォーマットを指定する

git log を見やすくする

git log の表示とか色をがんばる - Qiita

gitconfig の基本を理解する - Qiita

[Git]これだけ押さえる!gitconfigの基本 - Qiita