
Gitを使用していると「あ!間違ったファイルをインデックスに上げてしまった!」ということ、ありますよね?
(わたしはよくあります)
本投稿ではそんな git addの取り消し方法 についてまとめさせていただきます。
Gitを使い始めたばかりの方から、Gitコマンドについて学び直したいという方まで、開発の際に参考にしていただければ幸いです。
弊社テックブログの関連記事として、Gitの入門記事が以下にもございますのでよろしければ合わせてご一読ください。
目次
git addとは?
まずはコマンド自体のおさらいです。
git addとは、作業中のディレクトリで行った修正をインデックスに追加するコマンドのことです。
(作業中ディレクトリは「ワークツリー」とも呼ばれます)
インデックスに追加することで、変更を加えたファイルをコミット対象とすることができます。
git addを取り消したい!
続いて、さっそく本題のgit addの取り消し方法についてです。
git addを取り消す際は、「git init直後(コミットの無い状態)」と「コミットを打った以降」でコマンドが異なるので、それぞれの方法をご紹介します。
git init直後のgit addの取り消し
Gitでバージョン管理をする手始めとして、まずはgit initコマンドで対象リポジトリをGit管理下に置くための初期化を行います。
下記に、
git initsample.txtファイルを作成(サンプル用の空ファイル)sample.txtをインデックスに追加
の流れを記載します。
$ git init
Initialized empty Git repository in [初期化リポジトリのパス]/.git/
$ touch sample.txt
$ git status
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
sample.txt
$ git add sample.txt
$ git status
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: sample.txt
コミットの無い状態で、sample.txtファイルをインデックスに追加しました。
この状態からgit addを取り消すには、git rmコマンドを使用します。
$ git rm --cached [ファイル名]
git rmコマンドはGit管理下にあるファイルを削除するためのコマンドです。
--cachedオプションを使用することで、指定したファイルをインデックスから削除することができます。
(上述のgit status実行後にも(use "git rm --cached <file>..." to unstage)と記載されていますね)
この--cachedオプションを使用せずにgit rmを実行してしまうと、ファイル自体が削除されてしまうので気をつけてください。
下記に実行例を記します。
$ git rm --cached sample.txt
rm 'sample.txt'
$ git status
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
sample.txt
無事にファイルをインデックスから削除することができました。
-rオプションを使用することで、ディレクトリを削除対象にすることもできます。
$ git rm --cached -r [ディレクトリ]
また、インデックスに追加した全ての修正を取り消す場合は、ファイル名やディレクトリ名無しでも実行可能です。
$ git rm --cached -r .
前回のコミット後のgit addの取り消し
続いて、既にコミットが打たれている場合の取り消し方法をご紹介します。
(こちらの方が使用頻度としては高いと思われます)
現在のローカルブランチの状態を以下とします。
$ git log --oneline 6f099b1 (HEAD -> main) first commit
この状態から以下手順でファイルをインデックスに追加します。
sample.txtファイルを修正(既に該当ファイルに対してコミットが打たれている状態)- 修正後の
sample.txtをインデックスに追加
$ echo 'modify' > sample.txt
$ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: sample.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ git add sample.txt
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: sample.txt
コミットが存在する状態で、修正を加えたsample.txtファイルをインデックスに追加しました。
この状態からgit addを取り消すには、git restore、もしくはgit resetコマンドを使用します。
$ git restore --staged [ファイル名]
$ git reset HEAD [ファイル名]
git restoreを使用する方法
git restoreコマンドは特定の時点まで変更を元に戻すコマンドです。
--stagedオプションを使用することで、指定したファイルをインデックスから削除することができます。(インデックスの復元)
(上述のgit status実行後にも(use "git restore --staged <file>..." to unstage)と記載されています)
この--stagedオプションを使用せずにgit restoreを実行した場合、ワークツリー内の変更も失われてしまうので注意してください。
(インデックスにファイルがある場合は問題ありません)
下記に実行例を記します。
$ git restore --staged sample.txt
$ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: sample.txt
無事にインデックスから削除できました。
全ファイルを対象とする場合は下記のように実行してください。
$ git restore --staged .
git resetを使用する方法
もう一つの手段として、git resetコマンドを使用して取り消すことも可能です。
resetコマンドもrestore同様に、特定の時点まで変更を元に戻すコマンドです。
(restoreの方がより新しいコマンドです)
下記に実行例を記します。
$ git reset HEAD sample.txt
Unstaged changes after reset:
M sample.txt
$ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: sample.txt
無事にインデックスから削除できました。
こちらも先ほどまでと同様に、全ファイルを対象とする場合はファイル名無しで動作します。
$ git reset HEAD
また、補足ですが今回使用したgit resetは内部のオプションとして--mixedを実行した際と同じ動きとなっています。
(デフォルトで--mixedオプションが動作しています)
$ git reset --mixed HEAD [ファイル名]
まとめ
Git入門ということで、git addの取り消し方法についてご紹介しました。
Gitは異なるコマンドでもオプションによって同じ動きをするコマンドが多くあるので、ぜひ今回の記事も開発の際の参考にしていただければと思います。
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。

https://career-recruit.rakus.co.jp/career_engineer/
カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.com
ラクスDevelopers登録フォーム

https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/
イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com