git addを取り消す:編集内容を残してステージから外す手順

git restore --stagedで1ファイルのステージを解除し、作業ファイルが残ることを確認します。追加後の再編集と、新規ファイルを外す例も掲載。

目次
  1. 編集を残すなら --staged を指定する
  2. 練習用フォルダーを作り、そこへ移動する
  3. コミット済みの1行を用意する
  4. add後にもう一度編集してから、ステージを解除する
  5. 新規ファイルは未追跡に戻り、ファイル本体は残る
  6. 外した内容をコミットする場合は、選び直してaddする
  7. 参考資料

編集を残すなら --staged を指定する

少なくとも1回コミット済みのリポジトリで、note.txtを今回のコミットから外すなら、git restore --staged -- note.txtを使います。変更するのは次のコミットに使うインデックス(ステージ)で、手元の作業ファイルは書き換えません。Git公式のrestoreの説明に基づく操作です。

実行前にgit diff --cached -- note.txtでステージ済みの内容を読み、実行後はgit diff -- note.txtとファイル本体を確認します。他にもステージ済みのファイルがあれば、それらは残ります。ここではファイル名を1つ指定し、全体を一括で外す操作は扱いません。

--stagedを省いたgit restore -- note.txtは、作業ファイルをインデックスの内容に戻す別の操作です。編集を残したい場面では置き換えて実行しないでください。コミットそのものの取り消しや、競合中のファイル処理もこの記事の対象外です。

git diff --cached -- note.txt
git restore --staged -- note.txt
git status --short
git diff -- note.txt

練習用フォルダーを作り、そこへ移動する

以下はGitが使えるBash(WSLやGit Bashなど)用です。PowerShellへそのまま貼る例ではありません。実務のリポジトリではなく、まだ存在しないgit-unstage-practiceというフォルダーで試します。次の2行は1行ずつ実行し、エラーが出たらそこで止めてください。既に同名フォルダーがある場合は、別の新しい名前を選びます。

mkdirとcdの両方が成功したことを確かめてから、次の「コミット済みの1行を用意する」へ進みます。

mkdir git-unstage-practice
cd git-unstage-practice

コミット済みの1行を用意する

初期内容はbaseの1行だけです。コミットの名前とメールアドレスは、この練習リポジトリ内だけに設定する例示値です。リモートへの接続や送信は行いません。

git init
git config user.name 'Practice'
git config user.email 'practice@example.invalid'
printf 'base\n' > note.txt
git add -- note.txt
git commit -m 'Base file'

add後にもう一度編集してから、ステージを解除する

stagedの行を追加してaddし、その後でworkingの行を追加します。この時点では、作業ファイルは3行、インデックスは2行、直近コミットは1行です。

解除前の短縮statusはMM note.txtとなります。左のMはステージ済み変更、右のMはadd後の変更です。ここで解除すると、作業ファイルの3行を保ったまま、インデックスが直近コミットの1行へ戻ります。

printf 'staged\n' >> note.txt
git add -- note.txt
printf 'working\n' >> note.txt
git status --short
git restore --staged -- note.txt
cat note.txt
git diff --cached -- note.txt
git diff -- note.txt

表は横にスクロールできます →

解除後に見るものこの練習での結果
cat note.txtbase・staged・workingの3行が残る
git diff --cached -- note.txt出力なし。note.txtのステージ済み変更はない
git diff -- note.txtstagedとworkingの2行が追加として出る
git status --shortnote.txtの左列は空白、右列はM。未ステージの変更だけが残る

新規ファイルは未追跡に戻り、ファイル本体は残る

同じ練習フォルダーでnew.txtを作り、addしてから外します。今回は直近コミットにnew.txtがないため、インデックスから外れます。catでnew fileの行が読め、短縮statusには?? new.txtと表示されます。

これは最初のコミットがあるリポジトリでの新規ファイルの例です。git init直後でまだコミットがない状態ではHEADがないため、この手順の対象にしません。

printf 'new file\n' > new.txt
git add -- new.txt
git restore --staged -- new.txt
cat new.txt
git status --short --untracked-files=all

外した内容をコミットする場合は、選び直してaddする

note.txtの3行をコミットしたくなったら、git add -- note.txtを再実行し、git diff --cached -- note.txtを読みます。解除前にステージした2行版へ自動的に戻るわけではなく、その時点の作業ファイルが登録されます。new.txtは個別にaddしない限り未追跡のままです。

ステージ解除はコミット履歴を書き換えません。すでにコミット・送信した秘密情報を履歴から消す処理にもなりません。差分の比較対象を詳しく読み分けたい場合は、関連記事「git diffが空でも変更は残る:ステージ済み・未追跡ファイルの確認手順」を参照してください。

2026年9月25日、WSLのLinux・Git 2.53.0・非rootユーザーで掲載例を実行しました。解除後の作業ファイル、再add後のインデックス、変更していない直近コミット、新規ファイルの未追跡表示を照合しています。ホスティングサービスへの送信や実務リポジトリでの動作は、この検証に含みません。

git add -- note.txt
git diff --cached -- note.txt
git status --short --untracked-files=all

参考資料