Gitでバージョン管理を行う上で、「どこがどう変更されたのか」を正確に把握することは非常に重要です。そのための基本コマンドが git diff です。
特にブランチ間の差分確認は、PR作成前・マージ前に欠かせない操作です。本記事では、ブランチ間の差分確認を中心に、変更ファイル一覧の取得・特定ファイル/ディレクトリの比較・リモートブランチとの比較まで、実務でそのまま使えるコマンドを整理します。
ブランチ間の差分確認でよく使うコマンド一覧
まず、ブランチ間の差分確認でよく使うコマンドを一覧で確認しましょう。詳細は各セクションで解説します。
# 基本のブランチ比較
git diff main feature
# 分岐点からの変更のみ確認(PR前確認に最適)
git diff main...feature
# 変更ファイル一覧のみ確認
git diff --name-only main feature
# 変更ファイルとステータス確認
git diff --name-status main feature
# 特定ファイルだけ比較
git diff main feature -- path/to/file.js
# 特定ディレクトリだけ比較
git diff main feature -- path/to/dir/
# リモートブランチと比較
git fetch
git diff origin/main feature
# 現在のブランチとmainを比較
git diff main...HEAD
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. 差分を見やすくするオプション
差分の出力をカスタマイズして、より見やすくするためのオプションです。
4-1. 変更されたファイルの一覧だけを見る(–name-only)
差分の中身を見る前に「どのファイルが変更されたのか」だけをリストアップしたい時に使います。
# 変更されたファイル名のみを出力
git diff --name-only
4-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(-)
4-3. 単語・文字単位での差分を見る(–word-diff / –color-words)
通常の git diff は行単位で差分を表示しますが、文章やコメントの細かな修正では分かりにくいことがあります。--word-diff や --color-words を使うと、行の中の「どの単語が変わったか」を視覚的に確認できます。
# 単語単位で差分をハイライト([- 削除 -]{+ 追加 +} 形式)
git diff --word-diff
# 色だけで変更箇所を表示(ターミナル表示向け)
git diff --color-words
5. よくある作業フロー
実務でよく使う git diff の作業フローを整理します。
5-1. PR作成前に変更内容を確認する
# 1. まず変更ファイルの一覧を確認
git diff --name-status main...HEAD
# 2. 気になるファイルの詳細な差分を確認
git diff main...HEAD -- src/app.js
# 3. 全体の変更量を確認
git diff --stat main...HEAD
5-2. mainとの差分ファイルだけ確認する
# 現在のブランチで変更したファイルの一覧
git diff --name-only main...HEAD
5-3. 特定ディレクトリの変更だけ確認する
# tests/ ディレクトリだけの変更を確認
git diff main feature -- tests/
5-4. レビュー前に差分量を確認する
# 変更の全体規模を素早く把握する
git diff --shortstat main...feature
6. よくある疑問
.. と ... は何が違うか
..(2点)は両ブランチの最新状態を直接比較します。...(3点)は「分岐点から対象ブランチで加えた変更」だけを表示します。PR作成前には ... を使うと、自分の変更だけを確認できて便利です。
mainと現在のブランチを比較するにはどうするか
git diff main...HEAD を使います。HEAD は現在チェックアウト中のブランチの最新コミットを指します。
リモートブランチとの差分を見るにはどうするか
まず git fetch でリモートの最新状態を取得してから、git diff origin/main feature のように origin/ プレフィックスをつけて比較します。
変更ファイル名だけを見るにはどうするか
git diff --name-only main feature を使います。ファイルの変更種別(追加・変更・削除)も確認したい場合は --name-status を使います。
特定ファイルだけ比較するにはどうするか
git diff main feature -- path/to/file.js のように、--(ダブルダッシュ)の後にファイルパスを指定します。
関連記事
Gitの状態確認については git status – リポジトリの状態を表示するコマンド も参考にしてください。
まとめ
git diff を使ったブランチ間の差分確認をまとめます。
- 基本のブランチ比較:
git diff main featureまたはgit diff main..featureで直接比較する。 ..と...の使い分け: PR作成前の確認にはgit diff main...feature(3点)が自分の変更だけを表示して便利。- 変更ファイル一覧:
--name-onlyや--name-statusで変更されたファイルを素早く確認できる。 - 特定ファイル/ディレクトリ:
--の後にパスを指定して絞り込む。 - リモートブランチ:
git fetchしてからgit diff origin/main featureで比較する。 - コミット前:
git diff(add前)とgit diff --cached(add後)を使い分ける。
これらのテクニックを活用して、意図しない変更をコミット・マージしてしまうリスクを減らしましょう。

コメント