誤った修正ファイルをステージに追加してしまった
ワークツリー内で作業をしてステージに追加(add)した後に、その変更を取り消したい場合があります。
そんな時にはgit resetコマンドを利用することで修正前の状態に戻すことができます。
resetコマンドの種類
よく利用されるgit resetコマンドの種類についてご紹介していきます。
git reset HEAD ファイル名
ステージに追加されている指定したファイルの変更を取り消す
git reset HEAD index.html
git reset HEAD ディレクトリ名
ステージに追加されている指定したディレクトリの変更を取り消す
git reset HEAD dir
git reset HEAD .
ステージに追加されているすべての変更を取り消す
git reset HEAD .
git resetコマンドはステージから指定した変更内容を削除するだけなのでワークツリー内のファイルには変更ありません。
ワークツリー内のファイルに対しても変更を取り消したい場合はgit checkoutコマンドを使用する必要があります。
ワークツリー内の変更を取り消したい場合は下記を参照
ステージの変更を取り消す
実際にワークツリー内のindex.htmlファイルを変更してステージに追加(add)してから取り消す作業を行っていきます。
ファイルを変更したらgit statusコマンドで変更があることを確認します。
$ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed: //詳細①
(use "git restore --staged <file>..." to unstage)
modified: index.html
詳細①
コミットできる変更がステージに追加されていることがわかる。
$ git reset HEAD index.html
Unstaged changes after reset: //詳細①
M index.html
詳細①
ステージから指定したファイルindex.htmlの変更が取り消されたことがわかる。
$ git status
On branch main
Your branch is up to date with 'origin/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: index.html //詳細②
no changes added to commit (use "git add" and/or "git commit -a")
詳細②
ワークツリー内にステージに追加可能な変更されているファイルindex.htmlがあることがわかる。
ワークツリー内の変更も取り消す場合はcheckoutコマンドも使用して変更を取り消す必要がある。
既にリポジトリにコミット(commit)している場合は取り消し不可
git resetコマンドはローカルリポジトリの状態に戻すコマンドです。
ローカルリポジトリに既にリポジトリにコミット(commit)していない状態であればステージ内にローカルリポジトリの状態をコピーしてくることができるので、結果的に追加した内容を取り消すことができます。
そのため、既にローカルリポジトリにステージ内の変更をコミット(commit)してしまった場合は今回ご紹介するコマンドではで修正することはできません。
HEADについて
ところでHEADってなに?
HEADとは、現在自分がいるブランチの最新のコミットの状態を指しています。
その為、下記のコマンドは最新のコミットの状態にリセットするという意味になります。
git reset HEAD index.html