トラブルシューティング
リモートで削除済みのブランチをローカルからも消す
git fetch --prune でリモートに存在しなくなったブランチの追跡参照をローカルから安全に削除する方法
こんなとき
チーム開発で Pull Request をマージした後、GitHub 上でブランチを削除するのは一般的な運用です。
しかしローカルには origin/feature/xxx というリモート追跡参照が残り続けます。
git branch -r を実行すると、既に存在しないブランチが大量に表示されていませんか? これが「ゴミブランチ」の正体です。
bash
# リモート追跡ブランチの一覧を確認
git branch -r
# origin/feature/login ← もうリモートにはない
# origin/feature/signup ← もうリモートにはない
# origin/maingit fetch --prune で解決
git fetch --prune を実行すると、リモートに存在しなくなったブランチの追跡参照がローカルから自動的に削除されます。
git remote prune origin でも同じ結果になります。
bash
# リモートで削除済みの追跡参照をまとめて削除
git fetch --prune
# 同じ効果(prune だけ実行)
git remote prune origin毎回 --prune を付けるのが面倒な場合
fetch.prune を true に設定すると、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
Git Ready