Gitにおけるreset(リセット)とは?
コミットする前の状態までGit上には履歴を残さずに戻すということ.
revert(リバート)との違い
どちらもコミット前の状態に戻す時に用いられますが,revertでは,Git上に戻したことについての履歴が残ります.
これはあくまでも間違えてしてしまった時の処理です.
出るだけ使わないように正しくcommitしましょう!
特にresetはresetしたことも履歴に残らないので注意しましょう!!
resetの種類
では,次にresetの種類について見ていきましょう.
resetには以下の3種類があります.
- Soft
- Mixed
- Hard
それぞれについて詳しく説明していきます
Soft reset
最新のコミットを保持したまま,ステージングエリア(インデックス)に変更を戻す場合に使用します.これにより,最後のコミットが取り消され,その変更がステージングエリアに戻されます.
簡単にいうと,現在のローカル上にある情報を持っておきながら,commitしたということをなかったことにします.再度commitすれば,まったく同じ状態まで戻せるというゆる〜いresetです.
addしたものの中身を変えることはできなく,追加でaddする(ステージエリアに入れる)ことができます.
git reset --soft HEAD^
Mixed reset
最新のコミットを取り除きながら,そのコミットに含まれていた変更をワーキングディレクトリに保持します.
commitとindexの2つを戻すということです.適当にaddしてしまったものを取り除きたい時に使えます.
softとの違いはステージングエリアを消去することです.
git reset --mixed HEAD^
git reset
Hard reset
最新のcommitを完全に取り消し,ワーキングディレクトリの変更も破棄したい場合に使用します.これにより,最後のcommitが取り消され,ワーキングディレクトリも以前のcommitの状態に戻されます.
つまり,commitしてから今までの情報を全て消し去り,commit前まで戻すという作業です.
今までの努力なんてどうでもいいから,どうしても,commit前まで戻したいという時に使う非常に強いresetです.
commit,index,file全てがなくなってしまうので,使う時は注意が必要です.
git reset --hard HEAD^
ここまで聞いた人ならそれぞれの違いについてだいぶ理解したと思います.それでも,SoftとMixedの違いはかなりややこしいと思いますので,わかりやすい例を一つ挙げておきます!
SoftとMixedの違い例
現在のコミット履歴が以下のようになっているとします。
(HEAD -> master) Commit 4
Commit 3
Commit 2
Commit 1
--soft:
git reset --soft HEAD~3を実行すると、以下のようになります。
HEADがCommit 1を指すように移動します。
インデックス(ステージングエリア)は変更されません。つまり、Commit 2、Commit 3、Commit 4の変更はすべてステージングされたままです。
ワーキングディレクトリも変更されません。Commit 2、Commit 3、Commit 4の変更はすべて保持されます。
$ git status
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: file1.txt
modified: file2.txt
new file: file3.txt
modified: file4.txt
--mixed
git reset --mixed HEAD~3を実行すると、以下のようになります。
HEADがCommit 1を指すように移動します。
インデックス(ステージングエリア)がHEADと同じ状態にリセットされます。つまり、Commit 2、Commit 3、Commit 4の変更はすべてステージングが解除されます。
ワーキングディレクトリは変更されません。Commit 2、Commit 3、Commit 4の変更はすべて保持されます。
$ git status
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: file1.txt
modified: file2.txt
modified: file4.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
file3.txt
--softオプションは、HEADを移動しても、インデックスとワーキングディレクトリを保持します。つまり、Commit 2、Commit 3、Commit 4の変更はすべてステージングされた状態で残ります。これにより、3つのコミットを1つにまとめたり、変更を調整したりすることが容易になります。
--mixedオプションは、HEADを移動し、インデックスをHEADと同じ状態にリセットしますが、ワーキングディレクトリは保持します。つまり、Commit 2、Commit 3、Commit 4の変更はすべてステージングが解除されますが、ワーキングディレクトリには残ります。これにより、過去のコミットに戻った後、変更を選択的にステージングし、新しいコミットを作成できます。
資料
参考にさせてもらった
resetとrevertについて詳しく