前回述べた、過去のコミットを打ち消すrevertとは異なり、
過去のコミット状態に戻るときはresetコマンドを使用します。
Contents / 目次
resetコマンドで過去に遡る
上記の通り、resetコミットはrevertコミットと異なり、過去のコミットに
戻るためのコマンドです。
例えば下図で説明すると、現状Eという最新コミットにいますが、
過去のCのコミットまで遡り、D、Eのコミットを無かったことにします。
参考)revertの場合(過去のコミットCを打ち消したい場合)は下図のイメージです。
resetには種類がある
resetには種類があります。上で説明した例でEのコミットをCに戻すとしても、
HEADだけを戻すのか、Index、Work treeとも全て戻すのか、ということです。
Reminderですが、Index, Work treeの概念は下図です。
HEADはリポジトリの最新コミット位置を示すポインタです。
種類は3つあります。
種類 | 戻す対象範囲 | ||
HEAD(Commit) | Index(add) | Work tree | |
–hard | ○ | ○ | ○ |
–soft | ○ | × | × |
–mixed | ○ | ○ | × |
–hardで HEAD(Commit), Index(add), Work tree全て戻す
–softで HEAD(Commit)だけ戻す
–mixedで HEAD(Commit)とIndex(add)を戻す
ちなみにデフォルトは–mixedです。
コミットを消す場合、HEADを何個前に戻るかを指定する
resetコマンドを使用するとき、上記の通りHEADを移動させることになります。
いくつ戻すか指定する必要があります。戻す個数を^の数か~{n}で指定します。
例で説明します。
$ git reset --hard HEAD^^
$ git reset –hardまではresetをhardオプションで実行するという意味です。
HEAD^^は^が2つ付いてるので、HEADを2つ前のコミットまで遡ることになります。
下図のケースが当てはまります。現在Eにいるところ、Cのコミットの状態まで戻すことになります。今回の例ですとhardオプションですので、全てCの状態まで戻ります。
~{n}の表記ですと下記のようになります。
$ git reset --hard HEAD~{2}
ちなみに、HEADの代わりに@を使うこともできます。
$ git reset --hard HEAD^^
$ git reset --hard HEAD~{2}
$ git reset --hard @^^
$ git reset --hard @~{2}
上記コマンドは全て同じ内容になります。
addを取り消す(HEADは移動させない)
コミットした内容を消して戻る場合について、今まで述べてきましたが、
単純に、addしてIndexにStagingした内容を取り消したい場合もresetを使用します。
下図の場合ですとEのコミットのあと、新たにWork treeからaddして
IndexにStagingしたとします。このaddを取り消す場合は下記にとおりです。
$ git reset --mixed HEAD
もしくは–mixedはデフォルトなので省略できます。
$ git reset HEAD
HEADは移動させる必要がないので^や~{n}を付ける必要はないです。
終わりに
今回、resetについて述べました。
・コミットを消して過去に戻る場合
$ git reset <オプション> HEAD(戻るコミット数指定)
・コミット前のaddした内容(Staging)を消したい場合
$ git reset HEAD
ちなみに上記でWork treeの内容も含め全てリセットしたい場合
$ git reset --hard HEAD
resetは消せるコマンドですので使用前にはよくご確認を。
Have a nice Git life!