Git: git branch -D で消したブランチは、表示されたハッシュから git branch で戻せる
ブランチを消してもコミット自体はしばらく残っている。削除時に表示される (was 51c03cd) のハッシュを使って git branch <名前> <ハッシュ> で作り直せば元どおり。
やり方
削除すると、Git は消したブランチが指していたコミットを表示する。
console
$ git branch -D feat
Deleted branch feat (was 51c03cd).
$ git branch feat 51c03cd # 同じ名前で作り直す
$ git switch featターミナルを閉じてしまいハッシュがわからないときは reflog から探す。
bash
# HEAD の移動履歴から、そのブランチにいたときのコミットを探す
git reflog | grep -i feat
# 例: 51c03cd HEAD@{3}: checkout: moving from feat to main
git branch feat 51c03cd- ブランチの reflog(
git reflog show feat)はブランチ削除と一緒に消えるので、HEAD の reflog(git reflog)を見る。 - 一度もチェックアウトしていないブランチ(fetch しただけなど)は HEAD の reflog に出ない。その場合は
git fsck --lost-foundで行き先のないコミットを探す。
注意点
- 戻せるのは、そのコミットがガベージコレクションで消されるまで。reflog の既定の保持期間は、到達できなくなったコミットで 30 日(
gc.reflogExpireUnreachable)。 - 手元で
git gc --prune=nowを実行していると戻せないことがある。 - リモートのブランチを
git push origin --delete featで消した場合も、手元にorigin/featか上の方法でハッシュが残っていればgit push origin 51c03cd:refs/heads/featで復元できる。 - 消す前に未マージのブランチを確認する方法は git for-each-ref でマージされていない放置ブランチを棚卸しする。小文字の
-dならマージされていないブランチは削除を拒否してくれる。