status・diff で現在地を読む

《 Git & GitHub 完全ガイド 目次へ 》

このページで分かること

  • 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
git status の3つの見出しが指すエリアと、git diff はワークツリーとステージ、git diff --staged はステージとリポジトリを比べることを示す図
git status の3つの見出しが指すエリアと、git diff はワークツリーとステージ、git diff –staged はステージとリポジトリを比べることを示す図

見出しは、ファイルが今どのエリアにあるかを表しています。ステージにある 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月

タイトルとURLをコピーしました