テック技報最新号へ →
コード

Git: git branch -D で消したブランチは、表示されたハッシュから git branch で戻せる

ブランチを消してもコミット自体はしばらく残っている。削除時に表示される (was 51c03cd) のハッシュを使って git branch <名前> <ハッシュ> で作り直せば元どおり。

@tane_log · 投稿 2026-11-02
#git#branch#reflog#復元

やり方

削除すると、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 ならマージされていないブランチは削除を拒否してくれる。

出典

X の元の投稿を開く