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 による比較
さて、それでは早速、よく使うオプションの紹介です。
[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に関してです。