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
| 記号 | 意味 |
|---|---|
| M | Modified(変更) |
| A | Added(追加) |
| D | Deleted(削除) |
| R | Renamed(名前変更) |
コミット間の差分を確認
特定のコミットとの比較
# 特定のコミットとの差分
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..B | Aと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 |
| ステージング ↔ HEAD | git diff --staged |
| 作業ディレクトリ ↔ HEAD | git diff HEAD |
| ブランチ間 | git diff ブランチA ブランチB |
git diffとgit diff --stagedの違いを理解する--name-onlyや--statで概要を把握できる...を使うとブランチで追加された変更のみを確認できる-wで空白の変更を無視できる
コミット前やプルリクエスト作成前に差分を確認する習慣をつけると、意図しない変更を防げます。diff出力の読み方に慣れると、コードレビューもスムーズに行えるようになります。
編集部