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を取り消す変更がある状態になりました。