git diff コマンドは、Git リポジトリにおける変更内容を比較して表示するためのコマンドです。
ワークツリーとステージングエリア、またはコミット間の差分を確認するのに利用されます。
構文(Syntax)
git diff [オプション] [比較対象]
よく使うオプション(クイックリファレンス)
git diff: 編集中のファイルとステージングエリアの差分を確認するgit diff --staged/--cached: ステージング済みの変更と直前のコミットの差分を確認するgit diff HEAD: 編集中のファイルと最新コミットの差分をまとめて確認するgit diff HEAD~1: 1つ前のコミットとの差分を確認するgit diff --stat: 変更されたファイル名と追加・削除行数の統計だけを確認するgit diff main..feature: ブランチ間の差分を確認する
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
| (なし) | ワークツリーとステージングエリアの差分を表示 | git diff |
--staged / --cached | ステージングエリアと直前のコミットの差分 | git diff --staged |
HEAD | 現在の作業ツリーと最新コミットの差分 | git diff HEAD |
HEAD~1 | 1つ前のコミットとの差分 | git diff HEAD~1 |
<commit1> <commit2> | 2つのコミット間の差分 | git diff abc123 def456 |
<branch1>..<branch2> | ブランチ間の差分 | git diff main..develop |
--stat | 差分の統計のみ表示 | git diff --stat |
--name-only | 変更されたファイル名のみ表示 | git diff --name-only |
--color-words | 単語単位で差分を表示 | git diff --color-words |
実行例
ワークツリーとステージの差分を表示
git diff
出力例:
diff --git a/app.py b/app.py
index e69de29..95c6d12 100644
--- a/app.py
+++ b/app.py
@@ -0,0 +1,2 @@
+print("Hello World")
+print("New line")
ステージング済みの変更を確認
git diff --staged
最新コミットとの差分を表示
git diff HEAD
2つのコミットを比較
git diff abc123 def456
ブランチ間の差分を表示
git diff main..develop
統計のみ確認
git diff --stat
出力例:
app.py | 2 ++
1 file changed, 2 insertions(+)
変更されたファイル名のみ表示
git diff --name-only
出力例:
app.py
README.md
エラー例(Gitリポジトリ外で実行)
git diff
出力例:
fatal: not a git repository (or any of the parent directories): .git
出力の読み方
git diff の出力はUnified diff形式で表示されます。各行の意味を理解しておくと、差分をすばやく把握できます。
diff --git a/app.py b/app.py # 比較対象のファイル(a=変更前 b=変更後)
index e69de29..95c6d12 100644 # Gitオブジェクトのハッシュとファイルのパーミッション
--- a/app.py # 変更前のファイル
+++ b/app.py # 変更後のファイル
@@ -0,0 +1,2 @@ # ハンクヘッダー
+print("Hello World") # 追加された行(+)
+print("New line") # 追加された行(+)
ハンクヘッダー(@@ … @@)の読み方
@@ -旧開始行,旧行数 +新開始行,新行数 @@ という形式で表示されます。
| 表示 | 意味 |
|---|---|
@@ -10,5 +10,7 @@ | 変更前は10行目から5行、変更後は10行目から7行(2行追加) |
@@ -1,3 +1,0 @@ | 変更前は1行目から3行、変更後は0行(3行削除) |
行頭の記号の意味
| 記号 | 意味 |
|---|---|
+ | 追加された行 |
- | 削除された行 |
| (スペース) | 変更なし(前後のコンテキスト行として表示) |
よくある質問(FAQ)
git diff を実行しても何も表示されない
ワークツリーとステージングエリアに差分がない状態です。git add 済みの変更を確認したい場合は git diff --staged を使います。コミット前のすべての変更を確認したい場合は git diff HEAD が便利です。
–cached と –staged の違いは?
まったく同じ意味です。--staged は Git 1.6.1 で追加された読みやすいエイリアスで、どちらを使っても動作は変わりません。
特定のファイルだけ差分を確認したい
ファイルパスを末尾に指定します。--(ダブルダッシュ)を挟むとファイル名とオプションを明確に区別できます。
git diff -- path/to/file.py
git diff HEAD -- src/main.js
ブランチ間の差分で .. と … の違いは?
2点(..)と3点(...)で比較の起点が異なります。
git diff main..feature: main と feature それぞれの最新コミットを直接比較するgit diff main...feature: main と feature の分岐点(共通の祖先)から feature の最新コミットまでの差分を比較する
プルリクエストのレビューなど「ブランチで行った変更だけを見たい」場合は ... が便利です。
コミット前に変更内容をまとめて確認したい
git diff HEAD を使うと、ステージ済み・未ステージ両方を含む最新コミットとの全差分を一度に確認できます。コミット前の最終チェックに最適です。
差分をファイルに保存してパッチとして使いたい
リダイレクトでパッチファイルを作成できます。作成したパッチは git apply で適用できます。
git diff > changes.patch
git apply changes.patch
関連コマンド
git status: 変更されたファイルの状態を確認する。git log: コミット履歴を一覧表示する。git log -pでコミットごとの差分も表示できる。git merge: ブランチを統合する。マージ前にgit diff main..featureで差分を確認しておくと安全。git show: 特定のコミットの差分を表示する。
備考
git diffは まだステージングしていない変更 を確認するのに便利。git diff --stagedを組み合わせると、次のコミットに含まれる内容を確認できる。- 差分はパッチ形式で出力され、
git applyで適用可能。
参考
- Git公式ドキュメント: https://git-scm.com/docs/git-diff

コメント