2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Git ブランチの復活

Last updated at Posted at 2019-11-12

「あれ?作ったはずのブランチが見つからない。。。
 間違って消しちゃった!」

そんな経験ありませんか?
「ブランチ管理がいい加減だからそんなことになるんだ!」
そう思ってた僕もとうとうやってしまいました。
結構差分が大きいコミットだったんですが、まだ元に戻せる可能性は残ってるみたいです。

方法

GitにはReflogというのがあって、ローカルリポジトリでのHEADの変遷を全て記録しています。
このReflogを使って戻したい時点のコミットを探せば元に戻すことができます。
Reflogの履歴はgit reflogコマンドで見ることができます。

Terminal
$ 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_addresscheckoutした直後です。

あとはブランチを作成する要領で、

Terminal
$ git switch -c revive HEAD@{3}

これで元に戻すことができました。

Reflogについて

Reflogはかなり便利で、master@{one.week.ago}みたいな指定もできるみたいです。
詳しくは、https://git-scm.com/docs/git-reflogに解説があるので読んでみてください。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?