git の Discard all changes を復元する(取り消す)方法

最近はGitKrakenを使ってgit操作をしています。
GitKrakenにはcommit前の変更を全て取り消す Discard all changes という機能があります。
内部的にはgit checkoutを実行しているのでしょうか。

詳しく調べていませんが、GitKraken以外のGUIアプリでも実装されてるものは多いと思います。

で、たまに(よく)単一ファイルを Discard change しようとした時に、誤って Discard all changes してしまい、全ての変更を取り消してしまうことがあります。

その時の復元方法について紹介します。

1. git reflog でログ確認

 $ git reflog
104352f HEAD@{0}: discard: [8d1024be820c042cef4fe17432dc438d59189526]
104352f HEAD@{1}: commit: fix bug.
c263df1 HEAD@{2}: Fast forward branch feature/menu to branch develop

discard のログが残っていることを確認します。

2. git reset で復元

 $ git reset --hard 8d1024be820c042cef4fe17432dc438d59189526
HEAD is now at 8d1024b saved UNDO information for reset changes and discarded files

これで復元されます。
git reset --hardの右側の値はgit reflogで確認した discard の右側の値です。
discard した内容のcommitが出来上がるので必要に応じてcommit logの修正します。

注意点1. git reset --hard HEAD@{0} では復元されない

上記 reglog の状態でgit reset --hard HEAD@{0}を実行すると、HEAD@{1}の位置にHEADが移動するだけで discard した内容は復元されません。

注意点2. git reset --soft 8d1024 でも commit は作られる

git reset --softでもやってみましたが、commitが作られました。 softの場合はcommitに加えて、そのcommitを取り消す変更がある状態になりました。