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 : 特定のコミットに移動する