このページで分かること
git statusの3つの見出しが、どのエリアの話かが分かるgit status -sの2文字の記号を読めるgit diffとgit diff --stagedを使い分けられる- 差分の出力で、どの行が増えて、どの行が消えたかを読める
第2部の09までで、変更を選んで記録できるようになりました。ただ、記録する前に「今どのファイルの、どこが変わっているのか」が分からないと、何を載せればよいかも決められません。このページでは、その現在地を自分で読む2つのコマンドを扱います。
3つの変更が混ざった状態を作る
~/git-practice で、性質の違う変更を3つ作ります。memo.txt は1行を書き換えてステージに載せ、todo.txt は1行足すだけにして、新しいファイル draft.txt も作ります。
cd ~/git-practice
sed -i.bak 's/牛乳/豆乳/' memo.txt && rm memo.txt.bak
git add memo.txt
echo "銀行に行く" >> todo.txt
echo "下書き" > draft.txt
1行目の sed は、ファイルの中の「牛乳」を「豆乳」に置き換えるコマンドです。エディタで書き換えても同じです。
git status:どのファイルが、どのエリアにあるか
git status
# 出力:
# On branch main
# Changes to be committed:
# (use "git restore --staged <file>..." to unstage)
# modified: memo.txt
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git restore <file>..." to discard changes in working directory)
# modified: todo.txt
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# draft.txt

見出しは、ファイルが今どのエリアにあるかを表しています。ステージにある memo.txt は次のコミットに入り、ワークツリーにある todo.txt と draft.txt は入りません。
見出しの下の (use "…") は、その状態から次に打てるコマンドのヒントです。迷ったら、ここに書かれている操作を選べば大きく外れません。
短く表示する:git status -s
git status -s
# 出力:
# M memo.txt
# M todo.txt
# ?? draft.txt
行頭の2文字は、左の文字がステージ、右の文字がワークツリーの状態です。
| 表示 | 左(ステージ) | 右(ワークツリー) | 意味 |
|---|---|---|---|
M |
変更あり | なし | 変更をステージに載せた |
M |
なし | 変更あり | 変更したが、まだ載せていない |
MM |
変更あり | 変更あり | 載せたあと、さらに編集した |
A |
追加 | なし | 新しいファイルを載せた |
?? |
— | — | 一度も記録していないファイル |
ファイルが増えてくると、通常の表示では1画面に収まりません。慣れてきたら -s を常用すると見通しがよくなります。
git diff:どこが変わったか
git status で分かるのは「どのファイルが変わったか」までです。ファイルの中のどの行が変わったかは git diff で見ます。
ステージに載せていない変更を見る
git diff
# 出力:
# diff --git a/todo.txt b/todo.txt
# index 520f940..d3038db 100644
# --- a/todo.txt
# +++ b/todo.txt
# @@ -1 +1,2 @@
# 歯医者を予約する
# +銀行に行く
引数なしの git diff は、ワークツリーとステージを比べます。表示されたのは todo.txt だけで、memo.txt は出てきません。memo.txt の変更はすでにステージに載っていて、ステージとワークツリーの間には差がないためです。draft.txt も出てきません。一度も記録していないファイルは、比べる相手がないからです。
ステージに載せた変更を見る
git diff --staged
# 出力:
# diff --git a/memo.txt b/memo.txt
# index 5be9f6d..dc6dcc3 100644
# --- a/memo.txt
# +++ b/memo.txt
# @@ -1,2 +1,2 @@
# -牛乳を買う
# +豆乳を買う
# 卵を買う
--staged を付けると、ステージと最後のコミットを比べます。つまり「今 git commit したら何が記録されるか」です。コミットする直前に git diff --staged を見る習慣を付けると、意図しない変更の混入をほぼ防げます。
補足
--staged と --cached は同じ意味です。古い資料では git diff --cached と書かれていることがあります。
差分の読み方
| 行 | 意味 |
|---|---|
--- a/memo.txt |
変更前のファイル |
+++ b/memo.txt |
変更後のファイル |
@@ -1,2 +1,2 @@ |
変更前の1行目から2行分が、変更後の1行目から2行分になった |
先頭が - の行 |
消えた行 |
先頭が + の行 |
増えた行 |
| 先頭が空白の行 | 変わっていない行(前後の文脈として表示される) |
Git は「1行を書き換えた」とは表現しません。古い行を消して、新しい行を足したと表現します。牛乳から豆乳への書き換えが - と + の2行で表示されているのはそのためです。
index 5be9f6d..dc6dcc3 の部分は、変更前と変更後のファイルの中身を指すIDです。仕組みは第3部の17で扱うので、今は読み飛ばして構いません。
変わったファイルの一覧だけを見る
差分が長いときは、--stat を付けると、ファイルごとの増減だけが表示されます。
git diff --staged --stat
# 出力:
# memo.txt | 2 +-
# 1 file changed, 1 insertion(+), 1 deletion(-)
よくある疑問
Q. git diff を打っても何も表示されません。
A. ワークツリーとステージに差がない状態です。変更をすべて git add 済みなら正常です。載せた変更を見たいときは git diff --staged を使います。
Q. 差分の表示が長くて、元の画面に戻れません。
A. 長い出力は、ページ送りの画面で表示されます。q キーで終了します。space で次のページ、b で前のページに移れます。
Q. ステージとワークツリーの変更を、まとめて最後のコミットと比べられますか?
A. git diff HEAD で比べられます。HEAD は「今いる位置の最新のコミット」を指す名前で、第3部の18で詳しく扱います。
まとめ
git statusの見出しは、ファイルが今どのエリアにあるかを表すgit status -sの2文字は、左がステージ、右がワークツリーの状態git diffはワークツリーとステージを、git diff --stagedはステージと最後のコミットを比べる- 一度も記録していないファイルは
git diffに出てこない - コミットする直前に
git diff --stagedを見ると、意図しない変更の混入を防げる
次のページ
11. log で履歴を読む ── 積み重ねたコミットを一覧し、条件で絞り込み、必要な記録を探し出す方法を見ます。
この記事の最終確認日: 2026年10月