ブランチの歴史を書き換える git reset。間違って閉まっても、取り消して、元に戻す方法が存在します。
目次
間違った git reset --hard の実行を取り消したい
「git reset --hard 」を覚えると、便利でバシバシ実行していると・・・、調子に乗って、間違ったリセットを行ってしまいます。
やべ・・、となっても大丈夫、Git レポジトリにはすべてのコミットオブジェクト記録されていて、削除されることはありません。つまり、あらゆるすべての状態に戻すことが出来ます。(条件:その状態がコミットされていれば)
git reset を取り消すためには、どの参照(≒ブランチ)をどのコミットオブジェクトに戻してやれかが、わかればよいのです。
git reflog を使った、git reset --hard の取り消し
gitは、ブランチの先頭HEADや、それ以外のすべての参照の更新を記録しています。
git reflog コマンドを使えば、その名の通り、Reference、すなわち参照のログを一覧できます。そして、望めばその時点に戻る事ができるです。まるでタイムマシンみたいです。
1git reflog HEADの移動記録を閲覧する
あなたか間違ってgit reset して、ブランチの状態を誤って強制変更してしまっても大丈夫です。
気軽に「git reflog」を実行してみて下さい。引数なしで実行すれば、HEAD の移動がすべてリストされます。
$ git reflog // 実行後の出力 38466d2 HEAD@{1}: commit: Fix the bug in the gallery. 81b5ede HEAD@{2}: commit: Update the gallery. bba431a HEAD@{3}: commit (merge): Merge branch 'feature/review' 77ebd0b HEAD@{4}: checkout: moving from feature/review to master 7a37309 HEAD@{5}: reset: moving to HEAD@{13} fdb6ff0 HEAD@{6}: commit: Fix the function names.
なお、git reflog --allとすると、HEADだけでなく、すべての参照の移動を閲覧できます。
2任意のコミットに git reset --hard して、ブランチを過去の状態に強制的に戻す
過去の状態を取り戻すには、git reset -i を利用します。reflogで見つけた、戻りたい状態を指定して下さい。
git reset を実行したHEAD@{5}の直前HEAD@{6}に戻ります。
$ git rebase -i HEAD@{6}
これで晴れて git reset は取り消されて、元通りです。
git reset --hard の取り消しに関する参考情報
以外にわかりにくい、git reset の仕様を詳しくまとめています。
git reflog についてです: