argius note

プログラミング関連

少し前のコミットがブランチから切り離されてしまったときのリカバリー (git-reflog)

メモです。


ブランチ操作を誤って(mastergit 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:


.