DESIGN / CODE / INFRA / AI

解説

git diffに変更が出ないときは?追加前・追加後・直近コミットとの差を分けよう

git addの前後でgit diffの結果が変わる理由を、架空のテキスト一つで確認。--stagedとHEADを使い、コミットに入る内容を見分けよう。

git diffに変更が出ないときは?追加前・追加後・直近コミットとの差を分けよう

ファイルを変更してgit diffでは差が見えたのに、git addを実行すると何も出なくなった。変更が消えたとは限らないよ。比較する二つの場所が違うために、出力が変わるんだ。

この記事では、既存コミットのある小さなGitリポジトリで、同じファイルの「作業中」「次にコミットする内容」「直近のコミット」を分けて確認する。Gitがインストール済みの端末を使う。実際の仕事用リポジトリではなく、新しい練習用フォルダで試そう。

三つの場所を先に分ける

  • 作業ツリー:いま編集しているファイル。
  • インデックス:git addで選んだ、次のコミットの準備内容。ステージとも呼ぶ。
  • HEAD:ここでは現在チェックアウトしている直近のコミット。

git diffは通常、作業ツリーとインデックスを比較する。git diff --stagedはインデックスとHEAD、git diff HEADは作業ツリーとHEADを比較する。--cachedは--stagedと同じ意味で使えるよ。

まず一度コミットした状態を作る

以下はPOSIX系シェルの例。mktempで新しい練習用フォルダを作り、その中だけで操作する。

practice_dir=$(mktemp -d)
cd "$practice_dir"
git init -q
printf 'title=first
' > note.txt
git add note.txt
git -c user.name=Practice -c user.email=practice@example.invalid commit -qm 'Start practice'

user.nameとuser.emailはこのコマンドだけの設定で、普段のGit設定を書き換えない。ここでエラーが出たら、後続へ進まずGitの導入や作業フォルダを確認してね。

addの前後で比較対象が変わる

printf 'title=second
' > note.txt
git diff -- note.txt
git add note.txt
git diff -- note.txt
git diff --staged -- note.txt

最初のdiffには-title=firstと+title=secondが出る。add後の通常のdiffは空。作業ツリーとインデックスが両方secondになったためだよ。最後の--stagedにはfirstからsecondへの差が出る。コミットする準備内容は、まだ残っている。

--は、ここから先がファイル名であることを区切る記号。対象ファイルを明確にして確認しよう。

addした後に、もう一度編集したら?

printf 'title=third
' > note.txt
git diff -- note.txt
git diff --staged -- note.txt
git diff HEAD -- note.txt
git status --short

この状態の結果は次のとおり。

コマンド 見える差
git diff second → third
git diff --staged first → second
git diff HEAD first → third
git status --short MM note.txt

MMは、インデックスにも作業ツリーにも変更がある状態。このままコミットすれば、準備済みのsecondが対象になる。thirdまで入れたいときだけ、内容を読み直して再度addしよう。編集した最新内容が自動ですべてコミットされるわけではないよ。

編集部では、一時リポジトリで上記の差分とMMを確認した。実行例はGitの出力全体ではなく、確認すべき行と意味を抜き出している。

新規ファイルはstatusも見る

まだ一度もaddしていない新規ファイルは、通常のgit diffには出ない。git status --shortの??で未追跡ファイルを確認し、必要なファイルだけaddする。パスワードや秘密鍵を練習に使わないでね。

この記事のコマンドは練習ファイルを書き換えるが、既存コミットを戻したり削除したりしない。作業を終えるときは元のディレクトリへ移動し、練習用フォルダだと確認してから片付けよう。変更を一時退避する目的なら、stashのapplyとpopの違いが別の選択肢になるよ。

参考・出典

みんなのコメント 0

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。