GitHubやGitLabなどのプルリクエスト(PR)経由で開発を進めていると、マージされたあとの不要なブランチはリモートリポジトリ側で自動的、もしくは手動で削除されます。
しかし、自分のローカルPCのターミナルで git branch -a(すべてのブランチを表示)を実行すると、「リモート側ですでに削除されたはずの古いブランチ(例: remotes/origin/feature-xxx)」がいつまでも一覧に残り続ける問題に遭遇します。
これは、Gitがリモートのブランチリストの変更履歴を自動的に同期・削除(クリーンアップ)しない仕様になっているためです。
本記事では、このゴミとなって残ってしまったリモート追跡ブランチを安全に一括削除し、ローカル環境をクリーンにする方法を解説します。
1. なぜ古いリモート追跡ブランチが残るのか?
Gitが持つリモート情報の追跡メカニズムでは、git fetch や git pull を実行した際、「新しくリモートに追加されたブランチ」の情報は自動で取得されますが、「リモート側で削除されたブランチ」の情報をローカルのリモート追跡ブランチから自動で引き算(削除)する処理は標準では行われません。
この「すでに消滅したリモートブランチへのリンク」をクリーンアップする操作を Prune(刈り込み) と呼びます。
2. git fetch --prune コマンドの使い方
最も手軽で安全な方法は、fetch コマンド実行時に --prune(または短縮形の -p)フラグを付与することです。
# リモート情報を同期しつつ、削除済みの古いブランチの追跡情報をローカルから消去する
git fetch --prune
# または
git fetch -p
実行すると、ターミナルの出力に以下のような内容が表示されます。
From github.com:user/repository
- [deleted] (none) -> origin/feature-login
- [deleted] (none) -> origin/feature-auth
これにより、ローカルの git branch -r や git branch -a の一覧から、すでにリモートに存在しないブランチ情報が綺麗さっぱり消去されます。
3. 設定で自動化する(推奨)
毎回 --prune オプションをタイピングするのは面倒です。Gitの設定ファイルを書き換えて、git fetch や git pull を行うたびに自動で prune が走るように設定しておきましょう。
以下のコマンドを実行します。
# グローバル設定(すべてのリポジトリ)で自動pruneを有効にする
git config --global fetch.prune true
この設定を行っておけば、今後は単に git fetch や git pull を叩くだけで、バックグラウンドで常にリモート追跡ブランチのクリーンアップが自動実行されます。
4. ローカルブランチのクリーンアップ(git branch -d)
注意点として、git fetch --prune が削除するのはあくまで「リモート追跡ブランチ(origin/xxx)」の情報です。あなたがローカルで作成した本物の作業ブランチ(xxx)自体は削除されずに残ります。
マージが完了したローカルの作業ブランチを安全に消去するには、通常通り以下のコマンドを使用します。
# マージ済みのローカルブランチを安全に削除する
git branch -d feature-login
# まだマージされていないが強制的に削除する場合
git branch -D feature-login
まとめ
ローカルリポジトリを長く運用していると、不要になったブランチ情報が数百本近く溜まり、タブ補完やブランチ検索の大きな障害になります。
git fetch -pでリモートで削除済みのブランチ情報をローカルから刈り込むgit config --global fetch.prune trueで自動化しておくのがベストプラクティス- ローカルの作業ブランチ自体は
git branch -dで手動クリーンアップする
常にリポジトリを整理整頓し、快適なコマンドライン環境を保ちましょう。
