git reset

コマンドの概要

HEADを指定したコミットに移動させ、そのコミットの内容をモードに従いワーキングツリーおよびインデックスに展開するコマンド。
git commitの取り消し、git addの取り消しなどに利用する。
git reset --soft HEAD だけ移動させる
git reset --mixed HEAD を移動させて"インデックス"をその"コミット"の内容で展開
git reset --hard HEAD を移動させて"ワーキングツリー"と"インデックス"をその"コミット"の内容で展開

コマンドの使い方

モード及び対象とするコミットを指定する。
それぞれ、--mixed HEADがデフォルトで指定されており、省略可。

1$ git reset
2// git reset --mixed HEAD と同じ

とすると、HEADHEADコミットに移動させ(=HEADは動かない)、HEADコミットの内容をインデックスに展開するが、ワーキングツリーはHEADコミット後作業内容を保持したままにする。
すなわち、HEADコミット後のgit add操作を取り消しgit addがなかった状態になる。

1$ git reset --soft
2// git reset --soft HEAD と同じ

では、HEADHEADコミットに移動させ(=HEADは動かない)、ワーキングツリーとインデックスには何もしない。すなわち、何もおこらない。

git add を取り消す

1$ git reset HEAD

特定のファイルのみ取り消す

1$ git reset HEAD <file>

HEADは移動させず、インデックスへHEADコミットの内容を展開するので、インデックスがgit add操作前の状態になる。

コミットをやりなおす

直前のコミットを取り消す = HEADコミットのひとつ前のコミットに戻りつつ、インデックスの作業内容は保持する。 HEADをひとつ前のコミットに移動させればよい。

1$ git reset --soft HEAD^
HEAD~ と HEAD^ の違い
HEAD~HEAD^ はともに HEADコミットの一つ前のコミットを指すが、HEAD~ はブランチ内における世代を指定するもので、HEAD^ は git merge されたときの親ブランチを指定するもの。

コミットと git add を取り消す

直前のコミットとgit addを取り消す = HEADコミットのひとつ前にコミットに戻るとともに、インデックスはHEADコミットの内容とする。ワーキングツリーの内容は保持する--mixedを利用する。

1$ git reset HEAD^
2$ git reset --mixed HEAD^

コミットに戻したいとき

コミット後のワーキングツリーの編集内容とgit add操作をなかったものとしたい = ワーキングツリーとインデックスに HEAD コミットの内容を展開する。

1$ git reset --hard HEAD
git reset と ORIG_HEAD git mergegit reset の実行時に、そのコマンドを実行したコミットが ORIG_HEAD として保持されている。git reset でやってしまった!というときは、git reset --hard ORIG_HEAD でもとに戻れる。

関連するコマンド

git restore : コミット、インデックスから内容を復元する
git checkout : 特定のコミットに移動する