「うっかり全部git addしちゃった…」 「このファイルだけステージングから外したい…」 「git resetとgit restoreの違いがよく分からない…」
大丈夫です!git addは簡単に取り消せます。
実は、Gitには「やり直し」のための便利なコマンドがたくさん用意されています。2019年に登場したgit restore
は、より直感的で安全にファイルの状態を戻せる新しいコマンドです。
この記事では、git addの取り消し方法から、restoreコマンドの使いこなし方まで、実例付きで分かりやすく解説します。もう間違いを恐れる必要はありません!
まず理解しよう!Gitの3つのエリア

📂 Gitの基本構造
Gitには3つの重要なエリアがあります:
作業ディレクトリ → ステージング → リポジトリ
(Working Dir) (Staging) (Repository)
↓ ↓ ↓
編集中のファイル git add後 git commit後
各エリアの役割:
- 作業ディレクトリ:実際にファイルを編集する場所
- ステージング:コミット予定のファイルを置く場所
- リポジトリ:コミット済みの履歴が保存される場所
🎯 git addは何をしているのか
# git addの動作
ファイル編集 → git add → ステージングエリアに移動
↑
この操作を取り消したい!
git addは、ファイルを「ステージングエリア」に移動させる操作です。つまり、取り消し = ステージングから除外ということになります。
【即解決】git addを取り消す3つの方法
🆕 方法1:git restore –staged(推奨・最新)
基本的な使い方
# 特定のファイルをステージングから除外
git restore --staged ファイル名
# 例:index.htmlを取り消し
git restore --staged index.html
# 複数ファイルを指定
git restore --staged file1.txt file2.txt
# すべてのファイルを取り消し
git restore --staged .
なぜrestoreが推奨されるのか
メリット:
- コマンドの意図が明確(restore = 復元)
- 間違えにくい(–stagedオプションで明示的)
- Git 2.23以降の標準的な方法
📝 方法2:git reset HEAD(従来の方法)
使い方
# 特定のファイルを取り消し
git reset HEAD ファイル名
# 例
git reset HEAD index.html
# すべて取り消し
git reset HEAD
# または
git reset
注意点:
- 古いGitバージョンでも使える
- でも、resetは他の用途もあるので混乱しやすい
🔄 方法3:git rm –cached(初回add時のみ)
新規ファイルの場合
# まだ一度もコミットしていないファイル
git rm --cached 新規ファイル名
# 例
git rm --cached newfile.txt
使用場面:
- 新規作成したファイルを間違ってaddした
- .gitignoreに追加し忘れたファイル
git restoreコマンド完全マスター
🎓 restoreの基本構文
git restore [オプション] [ファイル名]
主要オプション:
オプション | 効果 | 使用場面 |
---|---|---|
--staged | ステージングから除外 | add取り消し |
--source=<commit> | 特定コミットから復元 | 過去の状態に戻す |
--worktree | 作業ディレクトリを復元 | 編集を破棄(デフォルト) |
-SW | staged + worktree | 完全にリセット |
💡 実践的な使用例
ケース1:特定のファイルだけ取り消したい
# 状態確認
git status
# Changes to be committed:
# modified: app.js
# modified: style.css
# modified: index.html
# style.cssだけ取り消し
git restore --staged style.css
# 確認
git status
# Changes to be committed:
# modified: app.js
# modified: index.html
# Changes not staged:
# modified: style.css
ケース2:ディレクトリ単位で取り消し
# srcディレクトリ以下をすべて取り消し
git restore --staged src/
# 特定の拡張子だけ取り消し
git restore --staged "*.css"
ケース3:部分的に取り消し(対話モード)
# パッチモードで部分的に取り消し
git restore --staged -p ファイル名
# 各変更に対して選択
# y: この変更を取り消す
# n: この変更は取り消さない
# q: 終了
# a: このファイルの残りすべて取り消す
作業内容も取り消したい場合
⚠️ 注意:データが消える操作
ステージングと作業内容の両方を取り消し
# 警告:編集内容が完全に消えます!
# ステージングから除外 + 編集も破棄
git restore --staged --worktree ファイル名
# 短縮形
git restore -SW ファイル名
# より安全:まずステージングだけ取り消し
git restore --staged ファイル名
# 内容を確認してから
git restore ファイル名
🔐 安全に作業する方法
変更を一時保存してから取り消し
# 現在の変更を一時保存(stash)
git stash
# ステージングをクリア
git restore --staged .
# 必要なら変更を復元
git stash pop
よくあるシナリオと解決法
📁 シナリオ1:間違えてgit add .した
# 全部addしてしまった!
git add .
# 解決法1:全部取り消し
git restore --staged .
# 解決法2:特定ファイルだけ残す
git restore --staged .
git add 必要なファイル.txt
🔒 シナリオ2:.gitignoreすべきファイルをaddした
# .envファイルを間違ってadd
git add .env
# ステップ1:ステージングから除外
git restore --staged .env
# ステップ2:.gitignoreに追加
echo ".env" >> .gitignore
# ステップ3:.gitignoreをコミット
git add .gitignore
git commit -m "Add .env to .gitignore"
📝 シナリオ3:一部の変更だけコミットしたい
# ファイルに複数の変更がある場合
# 方法1:対話的にadd
git add -p ファイル名
# 必要な部分だけ y で選択
# 方法2:一旦全部addして、不要な部分を取り消し
git add ファイル名
git restore --staged -p ファイル名
# 不要な部分を y で取り消し
🔄 シナリオ4:コミット後に気づいた
# すでにコミットしてしまった場合
# 直前のコミットを修正
git reset --soft HEAD~1
# これでコミット前の状態(ステージング済み)に戻る
# 不要なファイルを除外
git restore --staged 不要なファイル
# 再コミット
git commit -m "修正したコミットメッセージ"
git resetとgit restoreの使い分け
🆚 コマンドの比較表
目的 | git restore | git reset | どちらを使う? |
---|---|---|---|
add取り消し | restore --staged | reset HEAD | restore推奨 |
編集を破棄 | restore ファイル | checkout -- ファイル | restore推奨 |
コミット取り消し | できない | reset --soft/mixed/hard | resetのみ |
ブランチ移動 | できない | reset --hard ブランチ | resetのみ |
📚 使い分けの指針
git restoreを使う場合:
- ファイル単位の操作
- ステージングの操作
- 作業ディレクトリの復元
git resetを使う場合:
- コミットの取り消し
- ブランチの位置を変更
- より複雑な履歴操作
エイリアス設定で効率化
⚡ よく使うコマンドを短縮
# エイリアス設定例
# "unstage"でadd取り消し
git config --global alias.unstage 'restore --staged'
# 使い方: git unstage ファイル名
# "discard"で変更破棄
git config --global alias.discard 'restore'
# 使い方: git discard ファイル名
# "unstage-all"で全取り消し
git config --global alias.unstage-all 'restore --staged .'
# 使い方: git unstage-all
# 設定確認
git config --global --list | grep alias
GUI/IDEでの取り消し方法

🖥️ Visual Studio Code
- サイドバーの「ソース管理」タブを開く
- ステージされた変更セクションでファイルを確認
- ファイル名の横の「-」ボタンをクリック
- または右クリック → 「ステージングを解除」
🔧 その他のツール
GitHub Desktop:
- ファイルのチェックボックスを外す
SourceTree:
- ステージングエリアからファイルをドラッグ
Git Extensions:
- ファイルを選択 → 「Unstage」ボタン
トラブルシューティング
❓ よくある問題と解決法
問題1:restoreコマンドが使えない
# エラー: git: 'restore' is not a git command
# 原因: Gitバージョンが古い(2.23未満)
# バージョン確認
git --version
# 解決法1:Gitをアップデート
# Mac
brew upgrade git
# Windows
# Git公式サイトから最新版をダウンロード
# 解決法2:代替コマンドを使用
git reset HEAD ファイル名 # addの取り消し
git checkout -- ファイル名 # 変更の破棄
問題2:間違えて変更を破棄してしまった
# git restore で編集内容を消してしまった!
# 可能性1:まだエディタが開いている
# → エディタのUndo機能(Ctrl+Z)を試す
# 可能性2:IDEの自動保存機能
# → IDEのLocal History機能を確認
# 可能性3:git reflogから復元を試みる
git reflog
# 以前の状態が残っていれば復元可能
ベストプラクティス
✅ 安全な作業フロー
- こまめにコミット
- 小さな単位でコミット
- 取り消しやすくなる
- ステータス確認を習慣化
git status # 現在の状態を確認 git diff --staged # ステージングされた変更を確認
- 重要な変更は事前にバックアップ
git stash # 一時保存 git branch backup-branch # バックアップブランチ作成
- エイリアスで事故防止
# 破壊的操作に確認を追加 git config --global alias.restore-all '!echo "本当に全て復元しますか?[y/N]" && read ans && [ "$ans" = "y" ] && git restore .'
よくある質問と回答
Q:git restore –stagedとgit reset HEADの違いは?
A: 機能的にはほぼ同じですが、git restoreの方が意図が明確です。restoreは「復元」専用のコマンドとして設計されており、間違いにくいです。Git 2.23以降なら、restoreを使うことが推奨されています。
Q:誤って重要なファイルの変更を破棄してしまった
A: まずエディタのUndo機能を確認してください。次に、git reflogで過去の状態を確認し、可能なら復元します。今後はgit stash
で変更を保存してから操作することをおすすめします。
Q:コミット済みのファイルをgit addの前の状態に戻したい
A: git restore --source=HEAD~1 ファイル名
で、1つ前のコミットの状態に戻せます。または、git show HEAD~1:ファイル名 > ファイル名
でも可能です。
Q:git add -Aとgit add .の違いは?
A: git add .
は現在のディレクトリ以下、git add -A
はリポジトリ全体が対象です。また、git add -A
は削除されたファイルも含みます。
Q:ステージングエリアを完全にクリアしたい
A: git restore --staged .
またはgit reset
で、すべてのステージングを取り消せます。作業内容は保持されます。
まとめ:もうgit addの取り消しで悩まない!
git addの取り消しは、適切なコマンドを知っていればとても簡単です。
覚えておくべき3つのコマンド:
git restore --staged ファイル名
(推奨・最新)git reset HEAD ファイル名
(従来の方法)git status
(常に状態を確認)
黄金ルール:
- 迷ったら
git status
で確認 - 破壊的操作の前は
git stash
でバックアップ - 小さくこまめにコミットする
これらのコマンドを使いこなせば、Gitでの作業がもっと快適になります。間違いを恐れず、どんどんコードを書いていきましょう!
安心してGitを使いこなしてください! 🚀✨
コメント