以前、git diffをvimdiffで見る方法を紹介した。 今回はgit showvimdiffで見る方法を紹介する。

git show

あるコミットの詳細を表示するコマンド。diffも表示してくれる。 git diff程使う機会は少ないかもしれないが、個人的にはかなりよく使うコマンド。

コードレビューや不具合解析なんかで、過去のコミットでの修正内容を確認するのに便利なんだけど、 クラシックなdiffで表示されるのが気に入らなかったのでvimdiffで表示する方法を探していた。

エイリアス

結論から言うと、git showvimdiffを使う方法はわからなかった。 環境変数GIT_EXTERNAL_DIFFにうまいこと設定できればできそうな気もするが、情報が少ない。

今回はエイリアスを使った方法にした。 git showと言いつつ、裏ではgit diffを使っている。実際、git showしたときのdiffgit diffを使っているのだから問題ない。

[alias]
    showtool = "!sh -c 'git difftool "${0}"~ "${0}"'"

チルダを使って1世代前のコミットからの差分を見るような形にしている。 sh -cを使ってgitを呼び出すような冗長な書き方は、ハッシュやブランチ名を引数として渡すため。

このエイリアスだと引数がないと動かない。 オリジナルのgit showの場合、引数を指定しないときはHEADを指定したときの動作をするので、これと揃えるために以下のように変更した。

[alias]
    showtool = "!sh -c 'if [ "sh" == "${0}" ]; then REVISION="HEAD"; else REVISION="${0}"; fi; git difftool $REVISION~ $REVISION'"

おまけ

差分ファイルが大量にあると、全ファイルの差分を表示するので非常にめんどくさいことになる。 そこで、pecoを使って選択的に差分ファイルを見れるようにしている。これが完成形。

[alias]
    showtool = "!sh -c 'if [ "sh" == "${0}" ]; then REVISION="HEAD"; else REVISION="${0}"; fi;\
        git log -1 --stat-width=800 $REVISION | grep \"|\" | awk \" {print \\$1}\" | peco | xargs -o git difftool $REVISION~ $REVISION'"

なかなかトリッキーなコマンドなので、解説はいつか余裕があるときに書くことにする。