Git

gitでcommit間の差分を出力する

使わないと意外と忘れるのでメモ。
せっかくなので実務でよく使う関連するコマンドと組み合わせて使うケースも紹介します。

基本編

二つのcommit間の差分を出力

git diff <コミットID1> <コミットID2>

差分を比較したい二つのコミットのコミットIDを指定してあげればOK。
コミットIDはgit logで確認しましょう。

現在のブランチの状態からの差分を出力

git diff <コミットID1>

現在のブランチの状態から特定のコミットまでの差分比較であればコミットIDを一つだけ指定してあげればOK。

二つのcommit間で差分があるファイル名の一覧を取得

git diff --name-only <コミットID1> <コミットID2>

--name-onlyオプションでファイル名のみの出力も可能。
現在のブランチの状態からみた時に差分があるファイル名を取得したい場合はコミットID1だけを指定すればいいですね。

応用編

二つのcommit間の差分をファイルを指定して出力

# ファイル名一覧取得
git diff --name-only <コミットID1> <コミットID2>

# ファイル名を指定して差分出力
git diff <コミットID1> <コミットID2> <ファイル名>

比較する二つのコミット間で変更されたファイルの数が多い場合などは差分出力しても何が何やらということがあるため、ファイル名だけ先に出力しファイル指定で差分を出力するケースです。
「変更されたファイルがそもそも少ない」という場合や「多くても全部出したい」という場合は基本編の通りコミットIDの出力だけで十分ですね。

おまけ

git diff にて比較対象のコミットを指定する<コミットID1>と<コミットID2>は指定順によって差分出力時の時系列を変更することもできます。
下記のような差分がある二つのコミットを比較する場合の例を見てみましょう。

git log --oneline
bbbbbbbbb コミット2
aaaaaaaaa コミット1

git diff aaaaaaaaa bbbbbbbbb
-コミット1
+コミット2

コミットの時系列的にはコミット1→コミット2なので正しいですね。
次はdiffのコミットIDの指定順を入れ替え

git diff bbbbbbbbb aaaaaaaaa
+コミット1
-コミット2

上記のように削除を表す-と追加を表す+が逆になるという結果となりました。
これは単純にdiffするときにコミットID1からコミットID2への変更点を出力しているからですね。
ちょっと考えればわかるだろ!って感じかもですが、diff取ったときに想定していたものと違う差分が出るとびっくりする時があるから覚えておくとそういう時に幸せになれるかもしれない。