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 と同じ
とすると、HEADをHEADコミットに移動させ(=HEADは動かない)、HEADコミットの内容をインデックスに展開するが、ワーキングツリーはHEADコミット後作業内容を保持したままにする。
すなわち、HEADコミット後のgit add操作を取り消しgit addがなかった状態になる。
1$ git reset --soft
2// git reset --soft HEAD と同じ
では、HEADをHEADコミットに移動させ(=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^ は 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 merge や git reset の実行時に、そのコマンドを実行したコミットが ORIG_HEAD として保持されている。git reset でやってしまった!というときは、git reset --hard ORIG_HEAD でもとに戻れる。関連するコマンド
git restore : コミット、インデックスから内容を復元する
git checkout : 特定のコミットに移動する