Git diffとは?差分を確認する方法とオプションを初心者向けに完全解説

Git diffの基本的な使い方から実践的な活用方法まで初心者向けに解説します。作業ディレクトリ・ステージング・コミット間の差分確認、ブランチ比較、特定ファイルの差分表示など、diff出力の読み方も詳しく説明します。

Git diffとは

Git diffは、ファイルの差分(変更内容)を確認するためのコマンドです。どの行が追加・削除・変更されたかを表示し、コミット前の確認やコードレビューで欠かせないツールです。

diffは「difference(違い)」の略で、2つの状態を比較して違いを表示します。引数なしで実行すると、作業ディレクトリの変更を表示し、オプションを使うことでさまざまな比較が可能です。

差分を確認できる場面

Git diffは、以下のようなさまざまな場面で差分を確認できます。

比較対象コマンド
作業ディレクトリ ↔ ステージングgit diff
ステージング ↔ 最新コミットgit diff --staged
作業ディレクトリ ↔ 最新コミットgit diff HEAD
コミット間git diff コミット1 コミット2
ブランチ間git diff ブランチ1 ブランチ2

基本的な使い方

作業ディレクトリの変更を確認

git addする前の変更を確認します。

# 作業ディレクトリの変更を表示
git diff

出力例:

diff --git a/src/index.js b/src/index.js
index abc1234..def5678 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,5 +1,6 @@
 function hello() {
-  console.log("Hello");
+  console.log("Hello, World!");
+  return true;
 }

ステージング済みの変更を確認

git addした後、コミット前に内容を確認します。

# ステージング済みの変更を表示
git diff --staged

# --cachedも同じ意味
git diff --cached

これは次のコミットに含まれる変更内容を確認するのに便利です。

作業ディレクトリとHEADの差分を確認

ステージング状態に関係なく、最新コミットからの全変更を確認します。

# HEADからの全変更を表示
git diff HEAD

diff出力の読み方

diff出力には複数の情報が含まれています。理解しておくと、変更内容をすばやく把握できます。

diff --git a/src/index.js b/src/index.js
index abc1234..def5678 100644
--- a/src/index.js
+++ b/src/index.js
@@ -10,7 +10,8 @@ function calculate(x) {
   const result = x * 2;
-  return result;
+  const adjusted = result + 1;
+  return adjusted;
 }
意味
diff --git a/... b/...比較対象のファイル
index abc1234..def5678変更前後のBlobハッシュ
--- a/src/index.js変更前のファイル
+++ b/src/index.js変更後のファイル
@@ -10,7 +10,8 @@変更箇所(10行目から7行 → 8行)
-で始まる行削除された行(赤で表示)
+で始まる行追加された行(緑で表示)
スペースで始まる行変更なしの行(コンテキスト)

@@行(ハンク)の読み方

@@ -10,7 +10,8 @@は「ハンク(hunk)」と呼ばれ、変更の位置を示します。

部分意味
-10,7変更前:10行目から7行分
+10,8変更後:10行目から8行分

この例では、変更前は7行だった部分が、変更後は8行になっている(1行増えた)ことがわかります。

特定のファイルの差分を確認

ファイルを指定して差分を表示

# 特定のファイルの差分
git diff src/index.js

# 複数ファイルを指定
git diff src/index.js src/utils.js

# ディレクトリを指定
git diff src/

ファイル名だけを表示

変更されたファイルの一覧だけを確認したい場合:

# 変更されたファイル名のみ表示
git diff --name-only

# ステータス(追加/変更/削除)も表示
git diff --name-status

--name-statusの出力例:

M       src/index.js
A       src/new-file.js
D       src/old-file.js
記号意味
MModified(変更)
AAdded(追加)
DDeleted(削除)
RRenamed(名前変更)

コミット間の差分を確認

特定のコミットとの比較

# 特定のコミットとの差分
git diff abc1234

# 2つのコミット間の差分
git diff abc1234 def5678

# HEADの1つ前との差分
git diff HEAD~1

# HEADの3つ前との差分
git diff HEAD~3

HEADの意味については別記事で詳しく解説しています。

コミット範囲を指定

# コミットAからBまでの変更
git diff コミットA..コミットB

# コミットAとBの共通祖先からBまでの変更
git diff コミットA...コミットB

...(ドット3つ)は、2つのブランチの分岐点からの変更を確認するのに便利です。

ブランチ間の差分を確認

ブランチを比較

# mainとfeatureブランチの差分
git diff main feature

# 現在のブランチとmainの差分
git diff main

# リモートブランチとの差分
git diff origin/main

マージ前の変更を確認

プルリクエストを作成する前に、変更内容を確認できます。

# mainからfeatureで追加された変更のみ表示
git diff main...feature

# 変更されたファイル一覧
git diff main...feature --name-only

この例でgit diff main...featureを実行すると、コミットBからの分岐点を基準に、featureブランチで追加されたC、Dの変更のみが表示されます。

よく使うオプション

オプション説明
--staged / --cachedステージング済みの変更を表示
--name-only変更されたファイル名のみ表示
--name-statusファイル名と変更種類を表示
--stat変更の統計情報を表示
--shortstat簡潔な統計情報を表示
-w / --ignore-all-space空白の変更を無視
--color-words単語単位で差分をハイライト
--word-diff単語単位で差分を表示

統計情報を表示

git diff --stat

出力例:

 src/index.js   | 10 +++++-----
 src/utils.js   |  5 +++++
 src/old.js     | 20 --------------------
 3 files changed, 10 insertions(+), 25 deletions(-)

変更されたファイル、追加・削除された行数がひと目でわかります。

空白の変更を無視

インデントの変更だけを無視して、実質的な変更のみを確認できます。

# すべての空白変更を無視
git diff -w

# 行末の空白変更を無視
git diff --ignore-space-at-eol

# 連続する空白を1つとして扱う
git diff --ignore-space-change

コードフォーマッターを適用した後など、空白の変更が大量にある場合に便利です。

単語単位で差分を表示

長い行の一部だけが変わった場合に見やすくなります。

# 単語単位で色分け
git diff --color-words

# 単語単位で差分表示({-削除-}{+追加+}形式)
git diff --word-diff

--color-wordsの出力例:

-console.log("Hello");
+console.log("Hello, World!");

通常のdiffでは行全体が赤/緑になりますが、--color-wordsでは変更された部分("Hello"→"Hello, World!")だけがハイライトされます。

実践的な活用シーン

コミット前の最終確認

# 1. 作業ディレクトリの変更を確認
git diff

# 2. ステージングする
git add -p  # 対話的に選択

# 3. ステージング内容を確認
git diff --staged

# 4. 問題なければコミット
git commit -m "変更内容"

ステージングエリアの仕組みを理解しておくと、この流れがより明確になります。

プルリクエスト作成前の確認

# mainとの差分を確認
git diff main...HEAD

# 変更ファイル一覧
git diff main...HEAD --name-only

# 統計情報
git diff main...HEAD --stat

特定の期間の変更を確認

# 昨日からの変更
git diff HEAD@{yesterday}

# 1週間前からの変更
git diff HEAD@{1.week.ago}

# 特定の日時からの変更
git diff HEAD@{"2026-01-01"}

初心者が混乱しやすいポイント

git diffとgit diff --stagedの違い

最もよくある混乱ポイントです。

コマンド比較対象
git diff作業ディレクトリ ↔ ステージング
git diff --stagedステージング ↔ HEAD(最新コミット)
git diff HEAD作業ディレクトリ ↔ HEAD

git addした後にgit diffで何も表示されないのは、変更がステージングエリアに移動したからです。ステージング済みの変更を見るにはgit diff --stagedを使います。

..と...の違い

# A..B: AからBまでの差分(AとBを直接比較)
git diff main..feature

# A...B: AとBの共通祖先からBまでの差分
git diff main...feature
記法意味用途
A..BAとBの直接比較2つの状態の違いを見たい
A...B共通祖先からBの変更ブランチで追加された変更を見たい

プルリクエストの変更を確認する場合は...を使うと、ブランチ作成後に追加された変更のみが表示されます。

引数の順序で結果が変わる

# mainから見たfeatureの変更
git diff main feature

# featureから見たmainの変更(逆になる)
git diff feature main

最初の引数が「基準」、2番目が「比較対象」です。追加と削除が逆に表示されるので注意してください。

バイナリファイルの差分は表示されない

画像やPDFなどのバイナリファイルは、内容の差分が表示されません。

Binary files a/image.png and b/image.png differ

バイナリファイルが変更されたことはわかりますが、具体的な内容は確認できません。

便利な設定

diffの表示色をカスタマイズ

# 追加行を緑に
git config --global color.diff.new green

# 削除行を赤に
git config --global color.diff.old red

外部diffツールを使う

VSCodeなどのツールでdiffを表示できます。

# VSCodeをdiffツールに設定
git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'

# difftoolを起動
git difftool

よく使うコマンド一覧

操作コマンド
作業ディレクトリの差分git diff
ステージング済みの差分git diff --staged
HEADからの全差分git diff HEAD
特定ファイルの差分git diff ファイル名
ブランチ間の差分git diff ブランチA ブランチB
コミット間の差分git diff コミットA コミットB
変更ファイル一覧git diff --name-only
統計情報git diff --stat
空白を無視git diff -w

まとめ

Git diffは、ファイルの差分を確認するためのコマンドです。

比較対象コマンド
作業ディレクトリ ↔ ステージングgit diff
ステージング ↔ HEADgit diff --staged
作業ディレクトリ ↔ HEADgit diff HEAD
ブランチ間git diff ブランチA ブランチB
  • git diffgit diff --stagedの違いを理解する
  • --name-only--statで概要を把握できる
  • ...を使うとブランチで追加された変更のみを確認できる
  • -wで空白の変更を無視できる

コミット前やプルリクエスト作成前に差分を確認する習慣をつけると、意図しない変更を防げます。diff出力の読み方に慣れると、コードレビューもスムーズに行えるようになります。

編集部

編集部