トラブルシューティング

リモートで削除済みのブランチをローカルからも消す

git fetch --prune でリモートに存在しなくなったブランチの追跡参照をローカルから安全に削除する方法

リモートで削除済みのブランチをローカルからも消す diagram

こんなとき

こんなとき diagram

チーム開発で Pull Request をマージした後、GitHub 上でブランチを削除するのは一般的な運用です。

しかしローカルには origin/feature/xxx というリモート追跡参照が残り続けます。

git branch -r を実行すると、既に存在しないブランチが大量に表示されていませんか? これが「ゴミブランチ」の正体です。

bash
# リモート追跡ブランチの一覧を確認
git branch -r
# origin/feature/login   ← もうリモートにはない
# origin/feature/signup  ← もうリモートにはない
# origin/main

git fetch --prune で解決

git fetch --prune を実行すると、リモートに存在しなくなったブランチの追跡参照がローカルから自動的に削除されます。

git remote prune origin でも同じ結果になります。

bash
# リモートで削除済みの追跡参照をまとめて削除
git fetch --prune

# 同じ効果(prune だけ実行)
git remote prune origin

毎回 --prune を付けるのが面倒な場合

fetch.prunetrue に設定すると、git fetch するたびに自動で prune が実行されます。

一度設定すれば以降は意識する必要がありません。

bash
# グローバル設定(全リポジトリで有効)
git config --global fetch.prune true

# このリポジトリだけ有効にする場合
git config fetch.prune true

自分のローカルブランチは消えない

「自分が作業中のブランチまで消えてしまうのでは?」と不安になるかもしれませんが、心配ありません。

git fetch --prune で消えるのは remotes/origin/xxx というリモート追跡参照だけです。

ブランチの種類 prune で消える?
ローカルブランチ(作業中) feature/login 消えない
まだ push していないローカルブランチ feature/new 消えない
push 済みだがリモートで削除された ローカルの feature/old 消えない
リモート追跡参照(リモートで削除済み) origin/feature/old 消える
リモート追跡参照(リモートに存在する) origin/main 消えない

ローカルブランチとリモート追跡参照は完全に別物です。

安心して実行してください。

ローカルブランチもまとめて整理したい場合

prune で追跡参照を消した後、対応するローカルブランチも不要なら git branch -d で削除できます。

マージ済みブランチのまとめて削除については 不要になったブランチを整理する を参照してください。

bash
# prune + マージ済みローカルブランチの一括削除
git fetch --prune
git branch --merged main | grep -v "main" | xargs git branch -d

関連コマンド