ひとことで言うと

# 作業ツリーとステージングエリアの差分
git diff

# ステージング済みの差分(コミット前確認)
git diff --staged

# 特定のコミット同士を比較
git diff <commit1> <commit2>

やりたかったこと / 現象

コミットする前に「実際に何を変更したのか」を確認したい。 git status はファイル名しか教えてくれないため、行単位でどこがどう変わったのかを見るには git diff が必要になる。

ステージングした変更とまだステージングしていない変更の違いが分からず混乱することも多い。


環境

  • Git 2.30 以上
  • OS: Linux / macOS / Windows(WSL2 含む)

解決策

基本: 作業ツリーの変更を確認する

git diff

これは「最後にステージング(git add)した状態」と「現在の作業ツリー」の差分を表示する。git add する前の変更を確認するときに使う。

ステージング済みの差分を確認する(—staged / —cached)

git diff --staged
# または
git diff --cached

git add した後、コミットする前に「これから何がコミットされるか」を確認できる。

特定のファイルだけ差分を見る

git diff src/app.js

# 複数ファイル
git diff src/app.js src/index.js

コミット同士を比較する

# 直前のコミットとの差分
git diff HEAD~1 HEAD

# 特定の2つのコミットを比較
git diff a1b2c3d e4f5g6h

ブランチ間の差分を確認する

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

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

変更行数のサマリーだけ見る(—stat)

git diff --stat

出力例:

 src/app.js   | 12 +++++++-----
 src/index.js |  4 ++--
 2 files changed, 10 insertions(+), 6 deletions(-)

ファイルが多いときに、まずどのファイルが変わったかを俯瞰するのに便利。

単語単位で差分を見る(—word-diff)

git diff --word-diff

行全体ではなく変更された単語だけをハイライトするので、文章ファイル(Markdownなど)の差分確認に向いている。

リモートとの差分を確認する

git fetch origin
git diff origin/main

git fetch してからでないとリモートの最新状態と比較できない点に注意。


よくあるエラーと対処

差分が何も表示されない

git diff
# 何も出力されない

すでに git add 済みの場合、git diff は空になる(ステージング済みとの差分がないため)。--staged を付けて確認する。

git diff --staged

バイナリファイルで Binary files differ としか出ない

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

画像やコンパイル済みファイルなどのバイナリはテキスト差分を表示できない。必要なら --text オプションで強制的にテキストとして扱えるが、文字化けする可能性が高い。

改行コード(CRLF/LF)の違いだけで差分だらけになる

Windows と Linux/macOS の混在環境でよく起きる。

git config core.autocrlf input   # Linux/macOS
git config core.autocrlf true    # Windows

を設定して、以後の改行コードを統一する。

ページャーが開いて操作しづらい

git diff はデフォルトで less などのページャーに出力される。

# ページャーを使わず標準出力にそのまま出す
git --no-pager diff

# 常に無効化したい場合
git config --global core.pager cat

よくある質問

Q: git diffgit status の違いは何ですか? git status は変更されたファイルの一覧のみを表示します。git diff は行単位で具体的にどこがどう変わったかを表示します。

Q: ステージング前後の全ての差分をまとめて見たいです。 HEAD と作業ツリーを直接比較すると、ステージング済み・未ステージング両方の差分をまとめて確認できます。

git diff HEAD

Q: 削除された行だけ、追加された行だけを見ることはできますか? git diff の出力では - が削除行、+ が追加行です。grep と組み合わせて絞り込むこともできます。

git diff | grep "^-"

Q: 特定のディレクトリ配下だけ差分を見たいです。 パスを指定すればディレクトリ単位で絞り込めます。

git diff src/components/

Q: git diff の出力を別のツールで見やすくできますか? difftool を設定すると VSCode などの GUI ツールで差分を確認できます。

git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'
git difftool

関連記事

おすすめのVPS/ドメイン/スクール

VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。