「あれ?作ったはずのブランチが見つからない。。。
間違って消しちゃった!」
そんな経験ありませんか?
「ブランチ管理がいい加減だからそんなことになるんだ!」
そう思ってた僕もとうとうやってしまいました。
結構差分が大きいコミットだったんですが、まだ元に戻せる可能性は残ってるみたいです。
方法
GitにはReflogというのがあって、ローカルリポジトリでのHEADの変遷を全て記録しています。
このReflogを使って戻したい時点のコミットを探せば元に戻すことができます。
Reflogの履歴はgit reflog
コマンドで見ることができます。
$ git reflog
f5fd3ef39 (HEAD -> feature/switch_enabled_address) HEAD@{0}: rebase finished: returning to refs/heads/feature/switch_enabled_address
f5fd3ef39 (HEAD -> feature/switch_enabled_address) HEAD@{1}: rebase: mail有効化の切り替えを非同期通信に変更
2f1138f9b (origin/master, origin/HEAD, master) HEAD@{2}: rebase: checkout master
b3946b35a HEAD@{3}: checkout: moving from master to feature/switch_enabled_address
2f1138f9b (origin/master, origin/HEAD, master) HEAD@{4}: merge origin/master: Fast-forward
c8ae0c424 HEAD@{5}: checkout: moving from feature/switch_enabled_address to master
b3946b35a HEAD@{6}: rebase -i (finish): returning to refs/heads/feature/switch_enabled_address
b3946b35a HEAD@{7}: rebase -i (squash): mail有効化の切り替えを非同期通信に変更
57080d0bf HEAD@{8}: rebase -i (start): checkout HEAD~9
a9a5a5894 (fork/feature/switch_enabled_address, test/switch_enabled_address_circle) HEAD@{9}: checkout: moving from test/switch_enabled_address_circle to feature/switch_enabled_address
a9a5a5894 (fork/feature/switch_enabled_address, test/switch_enabled_address_circle) HEAD@{10}: Branch: renamed refs/heads/feature/switch_enabled_address to refs/heads/test/switch_enabled_address_circle
例えばこれは僕のReflogなんですが、大まかにいって下記のような形式をしてます。
HEAD{n}
のnはHEADが変わった回数を記録していて、0が今のHEADで数が大きくなるほど過去のHEADを表します。
僕の例でいうと、現在のHEAD、HEAD{0}
のコミット番号はf5fd3ef39
でrebaseをした直後であることがわかります。
rebase前にコミットを戻してみましょう。
僕の例では3回前のHEAD、HEAD@{3}
が、rebase前のHEAD
になります。Reflog
から、master
ブランチからfeature/switch_enabled_address
にcheckout
した直後です。
あとはブランチを作成する要領で、
$ git switch -c revive HEAD@{3}
これで元に戻すことができました。
Reflogについて
Reflogはかなり便利で、master@{one.week.ago}
みたいな指定もできるみたいです。
詳しくは、https://git-scm.com/docs/git-reflogに解説があるので読んでみてください。