【Git】git diffの使い方|差分確認と便利なオプションまとめ

Git

git diffは、作業中のファイルの変更内容やコミット間の変更差分を確認できるGitコマンドです。

システム開発において、コミット前の修正確認はもちろん、
ソースレビューで修正差分を確認するときなど、さまざまな場面で使用されます。

かけりゅー
かけりゅー

筆者が実際にシステム開発でよく使用している git diff のオプションを整理しています。
git diff の使い方に困っている方は、参考にしてみてください。

git diff の基本の使い方

git diff は、修正したファイルやステージング済みのファイルの変更差分や、
コミット間における変更差分などを確認するコマンドです。

用途に応じてオプションを指定することで、差分の出力方式を使い分けることができます。

作業中のファイルの変更内容を確認

作業ブランチ内で変更したが、まだステージングエリアへ追加していない
全ファイルの変更内容を確認
できます。

ファイル名を指定しない場合は全ファイル、
指定した場合はそのファイルのみの差分が表示されます。

$ git diff
diff --git a/sample.txt b/sample.txt
index e69de29..a1b2c3d 100644
--- a/sample.txt
+++ b/sample.txt
@@ -0,0 +1,2 @@
+追加行1
+追加行2

また、特定のファイルのみ確認したい場合は、ファイル名を指定します。

$ git diff sample.txt
diff --git a/sample.txt b/sample.txt
index a1b2c3d..d4e5f6g 100644
--- a/sample.txt
+++ b/sample.txt
@@ -1 +1,2 @@
-元の行
+元の行
+追加行

なお、出力の1行目はファイルパス(diff対象)、2行目の index は
Gitが内部で管理しているファイルの識別子(blobオブジェクトのハッシュ値)とパーミッション、
3〜4行目は変更前後のファイルパス、5行目は変更箇所の行番号情報です。

実際に追加・削除された内容を確認したいだけであれば、
6行目以降の「+」「-」で始まる行だけを見れば問題ありません。

本記事でも、以降は「+」「-」で始まる行を中心に解説します。

ステージングエリアに追加したファイルの変更差分の確認

–cached をつけることで、ステージングエリアに追加したファイルの変更差分を確認します。

$ git diff --cached
diff --git a/sample.txt b/sample.txt
index e69de29..f4g5h6i 100644
--- a/sample.txt
+++ b/sample.txt
@@ -0,0 +1,2 @@
+追加行1
+追加行2

上記コマンドを実行すると、ステージングエリアに追加された全ファイルの変更差分が表示されます。

また、特定のファイルのみ確認したい場合は、次のようにファイル名も指定してコマンドを実行します。

$ git diff --cached sample.txt

コミット間における変更差分の確認

コミットSHA値を2つ指定することで、指定した2つのコミット間における変更差分を確認できます。

$ git diff <コミットSHA値1> <コミットSHA値2>

指定に必要なコミットのSHA値は、git log コマンドで確認できます。

次のようにコミットSHA値を2つ指定すると、指定したコミット間で行われた変更差分が表示されます。

$ git diff b2c3d4e c3d4e5f
diff --git a/sample.txt b/sample.txt
index b2c3d4e..c3d4e5f 100644
--- a/sample.txt
+++ b/sample.txt
@@ -1 +1,2 @@
-元の行
+元の行
+追加行
かけりゅー
かけりゅー

筆者は、初回のソースレビュー時のほか、前回のソースレビューからの修正内容
単体試験・結合試験で検出したバグの修正内容などを
確認するときによく使用しています。

また、次のように、コミットSHA値のあとに「^」を付与すると、
指定したコミットの1つ前のコミットと見なして指定することもできます。

$ git diff b2c3d4e^ b2c3d4e
diff --git a/sample.txt b/sample.txt
index e69de29..b2c3d4e 100644
--- a/sample.txt
+++ b/sample.txt
@@ -0,0 +1 @@
+元の行

「^」を2つ3つと増やすことで、2つ前3つ前…のコミットと遡る世代数が増えていきます。

ファイル毎の変更量の確認

–stat をつけることで、ファイルの変更内容ではなくファイル毎の変更行数を確認できます。

$ git diff --stat
 sample.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

筆者は、主に修正規模が大きめな問題を対応したときなどに、
変更予定のないファイルに意図しない変更が含まれていないかをパッと確認したいときに使用しています。

なお、変更行数の情報が不要で変更されたファイル名だけを確認したい場合は、
–name-only を使用することで、ファイルパスのみのシンプルな一覧を取得できます。

ヒストグラム方式による差分表示

–histogram とつけることで、差分検出の方式をヒストグラム方式に変更します。

$ git diff --histogram <コミットSHA値1> <コミットSHA値2>

通常の git diff では、Myers方式と呼ばれるアルゴリズムによる差分検出で変更差分が表示されますが、
これをヒストグラム方式と呼ばれる別のアルゴリズムで変更差分を検出します。

行の追加・削除やコードの並び替えが多い場合、Myers方式よりも差分が見やすいことがあります。

かけりゅー
かけりゅー

筆者も修正規模が大きい差分を表示するときに使用しています。

差分を関数(メソッド)単位で表示

-W をつけることで、変更差分を関数(メソッド)単位のまとまりで表示します。

$ git diff <コミットSHA値1> <コミットSHA値2> -W

実際には次のようにコマンドを実行します。

$ git diff -W a1b2c3d d4e5f6g
diff --git a/main.c b/main.c
index a1b2c3d..d4e5f6g 100644
--- a/main.c
+++ b/main.c
@@ -8,7 +8,9 @@ void example() {
 void example() {
     int x = 5;
-    int y = 0;
+    int y = 1;
+    printf("追加処理\n");
     return;
 }

通常の git diff では変更した行の前後数行しか表示されませんが、
-W をつけることで、変更していない行を含めた関数全体が表示されます。

修正箇所のみではなく、関数全体の処理の流れと合わせて変更差分を確認したい場合に使用します。

かけりゅー
かけりゅー

筆者は、複数人でソースレビューを行う際などで、
修正意図や周辺処理への影響も画面共有しながら説明したい場合に使用しています。

空白・改行の変更を無視して差分を確認

-w をつけることで、空白文字(インデントや行末の空白、改行コードの違いなど)
のみの変更を無視して差分を確認
できます。

例えば、行末に空白が追加されただけの場合、
通常の git diff では以下のように変更ありと表示されます。

$ git diff
diff --git a/sample.txt b/sample.txt
index a1b2c3d..d4e5f6g 100644
--- a/sample.txt
+++ b/sample.txt
@@ -1 +1 @@
-サンプル行
+サンプル行 

ここで -w をつけて実行すると、
空白のみの変更として無視され、差分なしと判定されます。

$ git diff -w    // ★コードブロック
(差分なしのため出力なし)

インデントの調整や行末の空白など、
処理内容には影響しない空白文字だけの変更を除いた差分を確認したい場合は、
-w をつけることで実質的なコードの変更のみを確認できます。

git diff実行時によくあるトラブルと対処法

差分確認中に画面が固まったときの対処法

git diff を実行した際、差分の内容が長いと画面下部に「:」と表示されたまま、
操作を受け付けなくなることがあります。

これは less というページャーが差分を表示している状態であり、故障やフリーズではありません。

以下のキー操作で元のコマンド入力画面に戻ることができます。

  • q キー:ページャーを終了して元の画面に戻る
  • スペースキー:次のページを表示する
  • b キー:前のページに戻る

まとめ

git diffは、作業中のファイルやステージングエリアに追加したファイルの変更内容や、
コミット間での変更差分を確認
できるコマンドです。

オプションを使い分けることで、差分の出力形式を変えることもできるため、
状況に応じて効率よく変更差分を確認できます。

かけりゅー
かけりゅー

筆者もコミット前やソースレビュー時など、
そのときの状況に応じてオプションを使い分けています。

また、git diff以外のコマンドについては、次の記事でまとめています。
【Git初心者向け】システム開発でよく使うGitコマンドまとめ|使い方を解説

参考リンク

Git公式ドキュメント:git diffコマンド

コメント