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 init
sample.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