git diff の基本動作のまとめと、便利オプションベスト5

最終更新:2017-07-23 by Joe

git diffコマンドの動作仕様と、よく使う便利オプションベスト5です。

ブランチ管理に必須コマンド「git diff」ですが、だいたいよく使うオプションは決まってきます。かいつまんで紹介しますね。

git diffの動作の基本を理解する

git diff のオプションの前に、git diffの基本動作のおさらいです。

git diffは、基本は作業ツリー(自分が作業しているファイル群)を調べますすなわち、「比較元 → 作業ツリー」と比べた時、何が変わったか?を表示します。

「比較対象」の指定を省略すると、デフォルトで「比較元=インデックス」となり「インデックス→作業ツリー」という比較動作をします。

// [インデックス] → [作業ツリー]
git diff

そこにコミットを指定してやると、インデックスでなく、コミットを比較元にします。// [コミット] → [作業ツリー] git diff <commit>

そこにコミットをもう一つ指定してやると、作業ツリーでなく、コミット同士を比較します。

// [コミット1] → [コミット2]
git diff <commit1> <commit2>

また、--cachedオプションにより、作業ツリーへ対する比較でなく、インデックスへ対する比較にすることもできます。このときのデフォルトは、比較元が、HEADとなります。

// [HEAD] → [インデックス]
git diff --cached

// 同義
git diff --cached HEAD

git diff による比較

git diff の基本動作

 

さて、それでは早速、よく使うオプションの紹介です。

[Best 1] 差分が生じたファイル名だけを表示するgit diffオプション

ワークツリー内の変更があったファイルの「ファイル名だけ」を表示します。

// git diffで、ファイル名だけを表示するオプション
git diff --name-only

diffの比較対象はインデックスとなります。

通常の開発作業では、以下のようなステップがかなり多いと思います。いろいろガチャガチャとファイルに変更を加えてしまって「あれ・・、どれとどれ変更したっけな・・?」という時によく使います。

// HEADをチェックアウトして・・・(=インデックスがHEADと同じなる)
git checkout HEAD

// ファイルの変更を行う・・がちゃがちゃ・・

// 比較対象を指定しない場合、インデックスとの差分を表示する仕様です
// インデックス → ワークツリー の差分を表示
git diff 

[Best 2] ステージに上げたファイルを比較するgit diffオプション

これも開発中によくありますが、git addしてインデックスにファイルをあげたあと、コミットする直前に「何がコミットされるか?」を確認するためによく使うオプションです。

上述の通り、いつもは「ワーキングツリーへの差分」を見ていたのですが、それを--cachedオプションを付ける事により、「インデックスへの差分」を調べることができます。

// HEAD → インデックス の差分を比較するオプション
git diff --cached

// ちなみに、比較対象を省略すると、デフォルトでは「HEAD」と比較する仕様です。
// よって、これは上記と同義。
git diff --cached HEAD

commit を実行する直前に、念のため・・といった最終確認の目的で、非常によく使いますね。

[Best 3] スペースの差分を無視するgit diffオプション

「-w」「-b」は、スペース(whitespace)だけの違いを、変更とみなさず、無視するオプションです。整形のため整えただけなので、それは差分として表示しないでほしい時、ありますね。この2つは微妙に違うのでご注意下さい。だいたい私は「w」を使っている気がします。

// スペースを完全に無視するオプション
git diff -w
git diff --ignore-all-space

// 1つ以上のスペースが存在する時、スペースの数の違いを無視するオプション
// 行の末尾のスペースも無視
git diff -b

 

[Best 4] 文字レベルで違いを表示するgit diffオプション

git diff は、通常は行の差分を表示するのですが、「--word-diff」オプションを付けることにより、文字レベルで違いを表示してくれます。これは便利ですね。

// 文字レベルで差分を表示するオプション
git diff --word-diff

// 表示形式が違う。こっちのほうが見やすいかも・・。
git diff --word-diff=color
git diff --color-words

後者は--word-diff=colorオプションと同じですが、こちらは文字の色が変わるだけになるので、こちらのほうが差分が見やすい場合があるかもしれません。

[Best 5] 比較するファイルを限定するgit diffオプション

比較範囲を限定するオプションというか、方法です。

git diff -- <パス>

//(例)「一個前のコミット→最新コミット」の差分で、index.phpだけに表示を限定
git diff HEAD^ HEAD -- index.php

パスには、ファイル名やディレクトリ名を指定できます。

よく似たオプションに、git オブジェクトの限定方法があります。

// コロンによって対象となるgitオブジェクトを限定する
git diff <コミット>:<パス> <コミット>:<パス>

「ーー」の使い方や、「:」の使い方はgit で一貫しているようですので、覚えておくとほかのgitコマンドでも、応用がききそうです。

 

git diff オプションの参考サイト

git diffに関してです。