Follow twitter

Git reset 過去に戻る

今回はGitのresetについて述べます。
前回述べた、過去のコミットを打ち消すrevertとは異なり、
過去のコミット状態に戻るときはresetコマンドを使用します。

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!