git showの差分をvimdiffで見る
以前、git diffをvimdiffで見る方法を紹介した。
今回はgit show
をvimdiff
で見る方法を紹介する。
git show
あるコミットの詳細を表示するコマンド。diff
も表示してくれる。
git diff
程使う機会は少ないかもしれないが、個人的にはかなりよく使うコマンド。
コードレビューや不具合解析なんかで、過去のコミットでの修正内容を確認するのに便利なんだけど、
クラシックなdiff
で表示されるのが気に入らなかったのでvimdiff
で表示する方法を探していた。
エイリアス
結論から言うと、git show
でvimdiff
を使う方法はわからなかった。
環境変数GIT_EXTERNAL_DIFF
にうまいこと設定できればできそうな気もするが、情報が少ない。
今回はエイリアスを使った方法にした。
git show
と言いつつ、裏ではgit diff
を使っている。実際、git show
したときのdiff
はgit 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'"
なかなかトリッキーなコマンドなので、解説はいつか余裕があるときに書くことにする。