git diff は、Gitで「今のファイルが、いつの状態と比べて何が変わったか」を確認する基本コマンドです。「ブランチ間の差分だけ見たい」「git diffで何も表示されない」という悩みも、比較対象を指定するだけで解決します。未ステージの変更・git add 済みの変更・過去のコミットとの差分・ブランチ間の差分まで、幅広いパターンを1つのコマンドで確認できます。
本記事では、目的別の使い分けを早見表で整理したうえで、未ステージ・ステージ済み・コミット間・ブランチ間・特定ファイルの比較方法と、出力される差分記号・行番号の読み方までまとめて解説します。
目的別 git diff 早見表
「何と何を比較したいか」から使うコマンドを逆引きできる早見表です。詳細は各セクションで解説します。
| 確認したいこと | コマンド | 説明 |
|---|---|---|
編集したがまだ git add していない変更 | git diff | ワークツリーとステージングエリアの差分 |
git add 済み(コミット直前)の変更 | git diff --cached | ステージングエリアと直前のコミット(HEAD)の差分 |
| 未ステージ+ステージ済みをまとめて確認 | git diff HEAD | ワークツリーと最新コミット(HEAD)の差分 |
| 過去の特定コミット間の差分 | git diff [コミットA] [コミットB] | 2つのコミット間の差分 |
| ブランチ全体の差分 | git diff main feature | 両ブランチの最新状態を直接比較 |
| ブランチで自分が行った変更だけ | git diff main...feature | 分岐点からfeatureで行った変更のみ表示(PR前確認向け) |
| 特定ファイル/ディレクトリだけ | git diff -- path/to/file.js | パスを指定して比較範囲を絞り込む |
| 変更ファイル名だけ確認 | git diff --name-only | 差分の中身を見ずにファイル名一覧のみ表示 |
| リモートブランチと比較 | git fetch && git diff origin/main feature | フェッチしてリモートの最新状態と比較 |
1. コミット前の差分を確認する(基本中の基本)
ファイルを編集した後、まだ git add していない(ワークツリーにある)変更内容を確認するには、オプションなしの git diff を使用します。
# ワークツリー(作業ディレクトリ)とインデックス(ステージングエリア)の差分
git diff
1-1. 特定のファイルだけの差分を見る
プロジェクト全体の差分ではなく、特定のファイル(例えば index.html)の変更だけを確認したい場合は、ファイルパスを指定します。
git diff index.html
1-2. ステージング(git add)した後の差分を見る
git add を実行してファイルをインデックスに登録した後は、単なる git diff では差分が表示されなくなります。この状態(コミットする直前)の変更を確認するには、--cached(または --staged)オプションが必要です。
# インデックス(ステージングエリア)と最新のコミット(HEAD)の差分
git diff --cached
実務では、「コミットメッセージを書く前に、これからコミットする内容を最終確認する」ために非常に頻繁に使われます。
2. 過去のコミットとの差分を確認する
現在の作業状態と、過去の特定のコミットとの違いを確認したい場合のテクニックです。
2-1. 最新のコミット(HEAD)との差分
「今作業している内容は、最後にコミットした状態からどう変わったか」を全体的に見たい場合は HEAD を指定します。
# ワークツリーと最新コミット(HEAD)の差分
git diff HEAD
2-2. 任意のコミット間の差分
「コミットA」から「コミットB」の間で何が変わったのかを確認するには、2つのコミットID(ハッシュ値)を指定します。
# コミットA と コミットB の差分(Aを基準にBがどう変わったか)
git diff [コミットID_A] [コミットID_B]
# 例:
git diff a1b2c3d e4f5g6h
順番が重要で、「古いコミット」を先に、「新しいコミット」を後に書くのが一般的です。
3. ブランチ間の差分を確認する
PR作成前やマージ前に、ブランチ間の差分を確認するのは必須の作業です。git diff を使えば、ブランチ全体の差分から特定ファイルやディレクトリの比較まで柔軟に確認できます。
3-1. 基本のブランチ比較
2つのブランチを比較する基本コマンドです。
# main ブランチと feature ブランチの差分
git diff main feature
# .. を使った書き方(上と同じ意味)
git diff main..feature
このコマンドは、main ブランチの最新状態と feature ブランチの最新状態を直接比較します。
3-2. .. と ... の違い
git diff では ..(2点)と ...(3点)で比較方法が変わります。
# .. 2点:両ブランチの最新状態を直接比較
git diff main..feature
# ... 3点:mainから分岐した時点を基準に、featureで行った変更のみを表示
git diff main...feature
違いを整理すると次のとおりです。
| 構文 | 比較内容 | 用途 |
|---|---|---|
main..feature | mainの最新とfeatureの最新を直接比較 | 両ブランチの現在の差分を知りたい場合 |
main...feature | mainからの分岐点を基準にfeatureの変更のみ表示 | 自分の変更だけを確認したい場合(PR前確認に最適) |
PR作成前に「自分が feature ブランチで行った変更だけ」を確認したいときは ...(3点)が便利です。main ブランチに他の人の変更が入っていても、それらは表示されません。
3-3. 変更ファイル一覧だけを確認する
差分の中身ではなく「どのファイルが変わったか」だけを手早く確認したい場合は、--name-only や --name-status を組み合わせます。
# 変更されたファイル名のみを表示
git diff --name-only main feature
# ファイル名とステータス(M=変更、A=追加、D=削除)を表示
git diff --name-status main feature
--name-status の出力例:
M src/app.js
A src/utils/helper.js
D src/old-module.js
3-4. 特定ファイルだけを比較する
ブランチ間で特定のファイルだけを比較したい場合は、--(ダブルダッシュ)の後にファイルパスを指定します。
# ブランチ間で特定ファイルだけを比較
git diff main feature -- path/to/file.js
3-5. 特定ディレクトリだけを比較する
特定ディレクトリ配下の変更だけを確認したい場合も、同様に -- の後にディレクトリパスを指定します。
# ブランチ間で特定ディレクトリだけを比較
git diff main feature -- src/components/
# 複数ディレクトリを指定することも可能
git diff main feature -- src/ tests/
3-6. リモートブランチと比較する
リモートリポジトリ(GitHub など)のブランチと差分を確認したい場合は、まず git fetch でリモートの最新状態を取得してから比較します。
# リモートの最新状態を取得
git fetch
# ローカルの feature ブランチと、リモートの origin/main を比較
git diff origin/main feature
# リモートの feature ブランチとローカルの feature ブランチを比較
git diff origin/feature feature
git fetch を忘れると古い状態のリモートブランチと比較してしまうため、必ず先に実行しましょう。
3-7. 現在の作業ブランチと main を比較する
現在チェックアウト中のブランチと main の差分を確認するには、HEAD を使います。
# 現在のブランチ(HEAD)と main の分岐点からの差分
git diff main...HEAD
# 現在のブランチの最新コミットと main を直接比較
git diff main HEAD
git diff main...HEAD は、現在チェックアウト中のブランチで行った変更だけを表示するため、PR作成前の最終確認に特に便利です。
4. 差分の読み方(記号・行番号を理解する)
git diff の出力はUnified diff形式です。記号と行番号の意味がわかると、差分の中身をすばやく把握できます。次のようなコミット前の差分を例に見てみましょう。
diff --git a/src/app.js b/src/app.js
index e69de29..95c6d12 100644
--- a/src/app.js
+++ b/src/app.js
@@ -10,6 +10,8 @@ function greet(name) {
- console.log("Hello " + name);
+ console.log(`Hello, ${name}!`);
+ console.log("Welcome!");
}
各行の意味を整理すると次のとおりです。
| 表示 | 意味 |
|---|---|
diff --git a/file b/file | 比較対象のファイル(a=変更前、b=変更後) |
index e69de29..95c6d12 100644 | Gitオブジェクトのハッシュとファイルのパーミッション |
--- a/file | 変更前のファイルを表す見出し行 |
+++ b/file | 変更後のファイルを表す見出し行 |
@@ -10,6 +10,8 @@ | ハンクヘッダー。変更前は10行目から6行分、変更後は10行目から8行分(差し引き2行追加)を意味する |
行頭の + | 追加された行 |
行頭の - | 削除された行 |
| 行頭の(スペース) | 変更なし。前後の文脈として表示されている行 |
読み方のコツは、まず @@ -旧開始行,旧行数 +新開始行,新行数 @@ の行で「どのあたりが変わったか」を把握し、その下に続く + / - の行を上から順に追って「何が削除され、何が追加されたか」をセットで読むことです。上の例では10行目付近で console.log の1行が書き換わり、さらに1行が追加されたことが分かります。
5. 差分を見やすくするオプション
差分の出力をカスタマイズして、より見やすくするためのオプションです。
5-1. 変更されたファイルの一覧だけを見る(–name-only)
差分の中身を見る前に「どのファイルが変更されたのか」だけをリストアップしたい時に使います。
# 変更されたファイル名のみを出力
git diff --name-only
5-2. 変更の統計情報を見る(–stat / –shortstat)
「どのファイルが、どれくらいの規模で変更されたのか」を俯瞰したい場合に便利なオプションです。
# 変更されたファイルと追加/削除された行数のサマリーを出力
git diff --stat
# 全体の変更量だけを1行で表示
git diff --shortstat
出力例:
# --stat の出力例
src/app.js | 10 +++++++---
src/utils.js | 5 +++++
2 files changed, 12 insertions(+), 3 deletions(-)
# --shortstat の出力例
2 files changed, 12 insertions(+), 3 deletions(-)
5-3. 単語・文字単位での差分を見る(–word-diff / –color-words)
通常の git diff は行単位で差分を表示しますが、文章やコメントの細かな修正では分かりにくいことがあります。--word-diff や --color-words を使うと、行の中の「どの単語が変わったか」を視覚的に確認できます。
# 単語単位で差分をハイライト([- 削除 -]{+ 追加 +} 形式)
git diff --word-diff
# 色だけで変更箇所を表示(ターミナル表示向け)
git diff --color-words
5-4. Gitリポジトリ外や未追跡ファイルを比較する(–no-index)
--no-index を使うと、Gitリポジトリの管理下にない2つのファイルや、まだ git add していない未追跡ファイルどうしでも直接比較できます。設定ファイルの新旧比較や、リポジトリ化していないディレクトリでのファイル比較に便利です。
# Gitの管理外でも2つのファイルを直接比較できる
git diff --no-index old-config.yml new-config.yml
Gitリポジトリの中で実行する場合、比較したいファイルのどちらもGit管理外(未追跡)であれば --no-index は省略可能ですが、片方でもGit管理下にあると通常の git diff と混同しやすいため、明示的に指定するのが安全です。
6. よくある作業フロー
実務でよく使う git diff の作業フローを整理します。
6-1. PR作成前に変更内容を確認する
# 1. まず変更ファイルの一覧を確認
git diff --name-status main...HEAD
# 2. 気になるファイルの詳細な差分を確認
git diff main...HEAD -- src/app.js
# 3. 全体の変更量を確認
git diff --stat main...HEAD
6-2. mainとの差分ファイルだけ確認する
# 現在のブランチで変更したファイルの一覧
git diff --name-only main...HEAD
6-3. 特定ディレクトリの変更だけ確認する
# tests/ ディレクトリだけの変更を確認
git diff main feature -- tests/
6-4. レビュー前に差分量を確認する
# 変更の全体規模を素早く把握する
git diff --shortstat main...feature
7. よくある疑問
.. と ... は何が違うか
..(2点)は両ブランチの最新状態を直接比較します。...(3点)は「分岐点から対象ブランチで加えた変更」だけを表示します。PR作成前には ... を使うと、自分の変更だけを確認できて便利です。
mainと現在のブランチを比較するにはどうするか
git diff main...HEAD を使います。HEAD は現在チェックアウト中のブランチの最新コミットを指します。
リモートブランチとの差分を見るにはどうするか
まず git fetch でリモートの最新状態を取得してから、git diff origin/main feature のように origin/ プレフィックスをつけて比較します。最新の変更をローカルに取り込む手順についてはgit pull|基本の使い方からブランチ指定・fetchとの違いまでも参考にしてください。
変更ファイル名だけを見るにはどうするか
git diff --name-only main feature を使います。ファイルの変更種別(追加・変更・削除)も確認したい場合は --name-status を使います。
特定ファイルだけ比較するにはどうするか
git diff main feature -- path/to/file.js のように、--(ダブルダッシュ)の後にファイルパスを指定します。
出力の + や -、@@ は何を意味するか
行頭の + は追加された行、- は削除された行、スペースは変更なしの文脈行を表します。@@ -旧開始行,旧行数 +新開始行,新行数 @@(ハンクヘッダー)は、変更が発生した行番号の範囲を示します。詳しくは「4. 差分の読み方」で例付きに解説しています。
関連記事
Gitの状態確認については git status – リポジトリの状態を表示するコマンド、コミット履歴の確認には git log – コミット履歴を表示するコマンド(git log -p でコミットごとの差分もまとめて確認できます)も参考にしてください。特定のコミット1件だけの差分をピンポイントで見たい場合は、そのコミットIDを指定する git show [コミットID] が便利です。
コミットを取り消したいときはgit commit 取り消し|git reset の使い方と soft / mixed / hard の違いを参照してください。Gitの基本操作全体を学ぶにはGitとは?初心者向け完全ガイド:基本操作からブランチ・push/pullまで徹底解説もおすすめです。
作業中の変更を一時的に退避してからブランチ間の差分を確認したい場合はgit stash完全ガイド|一時退避から応用・トラブル対策までわかりやすく解説も役立ちます。
まとめ
git diff で何を比較できるかをまとめます。
- コミット前:
git diff(add前の未ステージ)とgit diff --cached(add後)を使い分ける。まとめて見るならgit diff HEAD。 - コミット間:
git diff [コミットA] [コミットB]で任意の2コミット間の差分を確認する。 - 基本のブランチ比較:
git diff main featureまたはgit diff main..featureで直接比較する。 ..と...の使い分け: PR作成前の確認にはgit diff main...feature(3点)が自分の変更だけを表示して便利。- 特定ファイル/ディレクトリ:
--の後にパスを指定して絞り込む。 - 差分の読み方:
@@ -旧開始行,旧行数 +新開始行,新行数 @@で変更箇所の行番号を、+/-の行で追加・削除の内容を読み取る。 - 変更ファイル一覧・統計:
--name-only/--name-status/--stat/--word-diff/--no-indexを目的に応じて使い分ける。 - リモートブランチ:
git fetchしてからgit diff origin/main featureで比較する。
これらのテクニックを活用して、意図しない変更をコミット・マージしてしまうリスクを減らしましょう。
ブランチ間の差分確認はマージ前の最終チェックとして重要ですが、マージ後の初動確認にはデプロイ後の初動チェック|Bashで5分で回す安全確認リストもあわせて確認しておくと安心です。

コメント