DESIGN / CODE / INFRA / AI

解説

git addを取り消すと編集も消える?restore --stagedでステージだけ戻そう

コミット・ステージ・作業ファイルが別内容の例で、addの取り消しを検証。--worktreeとの復元先と既定の復元元の違いを確認。

git addを取り消すと編集も消える?restore --stagedでステージだけ戻そう
保存リストを見る →
この記事の道しるべ 4項目

間違えて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

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

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