git reset –hard を取り消す、git reflog の使い方

最終更新:2018-07-13 by Joe

ブランチの歴史を書き換える 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 についてです: