解説
git addを取り消すと編集も消える?restore --stagedでステージだけ戻そう
コミット・ステージ・作業ファイルが別内容の例で、addの取り消しを検証。--worktreeとの復元先と既定の復元元の違いを確認。

間違えてgit addしたファイルを、編集内容は残したままコミット対象から外したい。そんなときは、ステージと作業ファイルのどちらを戻すのかを分けよう。
このページはGitのaddとcommitを使ったことがある人向け。restore --stagedで「addした状態だけを戻す」操作を、一時リポジトリで確かめるよ。過去版のファイルを読み出す解説とは、目的を分けている。
三つの場所に別の内容を置く
次はBashのターミナルで、新しく作る練習用フォルダーだけに対して実行する。実作業のファイルでは試さないでね。
practice_dir=$(mktemp -d)
cd "$practice_dir"
git init -q -b main
git config user.name Practice
git config user.email practice@example.invalid
printf 'base\n' > memo.txt
git add memo.txt
git commit -qm base
printf 'staged\n' > memo.txt
git add memo.txt
printf 'working\n' > memo.txt
git show HEAD:memo.txt
git show :memo.txt
cat memo.txt
git restore --staged -- memo.txt
git show :memo.txt
cat memo.txt
git status --short
restore前の三つの表示は、コミットがbase、ステージがstaged、作業ファイルがworking。ステージは次のコミットに入れる内容を控える場所で、作業ファイルと常に同じではないよ。
--stagedが戻すのはステージ
git restore --staged -- memo.txt
この指定では、既定の復元元はHEAD、つまり今のコミットになる。ステージのmemo.txtがbaseへ戻り、作業ファイルのworkingは残るよ。新しいコミットは作らず、ブランチの位置も変えない。
実行後の二つの表示はbaseとworking。status --shortは、左側が空白で右側がMの「 M memo.txt」になる。ステージにはコミットとの差がなく、作業ファイルには差がある状態だね。
| 対象 | 操作前 | --stagedの後 |
|---|---|---|
| HEADの内容 | base | base |
| ステージ | staged | base |
| 作業ファイル | working | working |
--worktreeと同じではない
--worktreeは作業ファイルを復元先にする指定。--stagedを付けない場合、復元元の既定はステージになる。今回の操作後に次を実行すると、練習ファイルのworkingはbaseで上書きされるよ。
git restore --worktree -- memo.txt
cat memo.txt
git status --short
これは練習を戻すための例で、残したい編集がある実作業でそのまま実行しないでね。restoreは未コミットの編集を取り戻すための保険ではない。消したくない変更は、実行前に別の控えなどで守る必要がある。
実作業では差分を先に読む
まずgit status --shortと、git diff --cached -- 対象パスでコミット対象を確認する。そのうえで、addを取り消したいファイルだけを指定しよう。ここでは既存コミットを持つ追跡済みファイルに話を絞っている。
編集部では2026年10月29日にGit公式と照合し、三つの内容・status・最終的な差分なしを一時リポジトリで検証した。三種類のgit diff、過去版からのrestoreで復元元と復元先を整理できるよ。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。