Git

【Git】reset –hardで間違った履歴を消してしまった!→ reflogコマンドで解決

Github

 

今回はreset –hardコマンドで間違ったコミット履歴を削除してしまった時の対処法について解説したいと思います。reset –hardコマンドは履歴自体をなかったことにしてしまうため、復元不可能では?と思う方もいるとは思いますが、結論復元可能です。

この機会に対処法を理解し、実際にも使いこなせるようにしておきましょう。

reset –hardコマンドの取り消し

誤ってreset –hardコマンドを打ってしまった場合は、reflogコマンドとreset –hardコマンドを併用することで簡単にコミット履歴を復元することができます。

具体的には、reset –hardで取り消してしまった過去をさらにreset –hardで取り消す処理を行います。

reflogコマンドは、過去のあらゆるコミット履歴を確認することができるコマンドです。

対処法(簡略的に解説)

ここでは対処法がすぐに使えるよう、簡略的に解説していきます。

間違って2つ前のコミット履歴を取り消してしまった!
(本当は直前のコミット履歴だけ取り消したかった)
% git reset --hard HEAD^^

reflogコマンドでコミット履歴を確認すると、先ほどの履歴が出てくる
% git reflog
f5cb888 HEAD@{0}: head^^: updating HEAD
b0b8073 HEAD@{1}: merge @{-1}: Merge made by the 'recursive' strategy.
fe3972d HEAD@{2}: checkout: moving from fix/some-bug to master

reset --hardで消してしまった過去を、さらにreset --hardすることで打ち消す
% git reset --hard HEAD@{1}

改めて正しいコマンドを打ち直す
% git reset --hard HEAD^
たった4行で復元、修正することができたね。

対処法(より具体的に解説)

ここでは、先ほど紹介したコマンドについてもう少し深掘りながら解説していきます。

今回は「reflog_test」という名前のアプリケーションを使用します。下準備として既に3回ほどコミットをしています。(first commitを含めると4回)

コミット履歴 コミット履歴

 

ここで「fourth time commit」のみを取り消したいと思ったのにも関わらず、誤って以下のコマンドを入力してしまいました。

% git reset --hard HEAD^^
直前のコミット履歴を取り消すコマンドは「git reset –hard HEAD^」となります。

 

すると、2つ分のコミット履歴が消えてしまいました。

コミット履歴

 

ではreflogコマンドで過去のコミットを確認しましょう。

% git reflog
52ad4f6 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^^
adc8230 (origin/master) HEAD@{1}: commit: fourth time commit
2c53639 HEAD@{2}: commit: third commit
52ad4f6 (HEAD -> master) HEAD@{3}: commit: second commit
96e80d3 HEAD@{4}: commit (initial): first commit

 

続いて、reset –hardコマンドで消してしまった過去を打ち消しましょう。

% git reset --hard HEAD@{1}

 

すると、消えてしまった2つ分のコミット履歴が復元されます。

コミット履歴の復元

 

改めて「fourth time commit」のみを取り消しましょう。

% git reset --hard HEAD^

 

ここまでがreset –hardコマンドで取り消してしまった過去を復元する方法です。

参考記事

RIP Tutorial:
https://riptutorial.com/git/example/12915/reflog-references—refname—-n–

いざという時のためのgit reflog:
https://qiita.com/yaotti/items/e37c707938847aee671b

 

 

今回はreset –hardコマンドで間違ったコミット履歴を削除してしまった時の対処法について解説しました。reflogとreset –hardコマンドを併用することで簡単に復元可能なので、焦らず対処していただけたらと思います。