少し前のコミットがブランチから切り離されてしまったときのリカバリー (git-reflog)
メモです。
ブランチ操作を誤って(master
にgit reset --hard
したあとでブランチ削除)、必要なコミットがひとつ、どのブランチにも属さない状態になってしまいました。
これまでは、ローカル履歴などから復元していて事無きを得ることが多かったのですが、今回は、ローカル履歴が無い状態でした。
さてどうしよう。3つ前くらいなら復元できると思うけどどうすれば?
git reflog
を使うと、GCで永遠に失われていないコミットであれば、ブランチからたどれないコミットも参照することができます。
確か、失われたコミットは5回以内には入っているはず。(←コミット以外にも出てくるのを知らない)
$ git reflog -5 45f62fd HEAD@{0}: checkout: moving from tmp to master 0a88d3e HEAD@{1}: commit: Commit tmp 970d2b4 HEAD@{2}: checkout: moving from master to tmp 45f62fd HEAD@{3}: commit: ... 970d2b4 HEAD@{4}: commit: ... $
0a88d3e HEAD@{1}
が復元したいコミット、消してしまったtmp
ブランチのあったところです。(←コミットだけじゃなかったんだ...)
復元したいコミットは、そのままmaster
に新たにコミットすれば良い状態なので、今回はcherry-pick
で。
$ git cherry-pick 0a88d3e [tmp 99af058] Commit tmp 1 files changed, 1 insertions(+), 0 deletions(-) $ git log -1 commit 99af058b5e59c8ae30e16a2eb673cc6867eb0ceb Author: argius <...> Date: Fri Aug 29 23:06:37 2014 +0900 Commit tmp $
これで、失われていたコミットは、master
ブランチにコミットされた状態になりました。
参考URL:
.