Featured image of post ローカルに残った古いリモート追跡ブランチを一括削除する(git fetch --prune) Featured image of post ローカルに残った古いリモート追跡ブランチを一括削除する(git fetch --prune)

ローカルに残った古いリモート追跡ブランチを一括削除する(git fetch --prune)

git fetch --pruneを使ってローカルに残った古いリモート追跡ブランチを一括削除する方法を解説。GitHubでマージ・削除されたブランチがローカル環境に残り続ける問題を解決し、クリーンなブランチ一覧を維持するメンテナンス手順を紹介します。

GitHubやGitLabなどのプルリクエスト(PR)経由で開発を進めていると、マージされたあとの不要なブランチはリモートリポジトリ側で自動的、もしくは手動で削除されます。

しかし、自分のローカルPCのターミナルで git branch -a(すべてのブランチを表示)を実行すると、「リモート側ですでに削除されたはずの古いブランチ(例: remotes/origin/feature-xxx)」がいつまでも一覧に残り続ける問題に遭遇します。

これは、Gitがリモートのブランチリストの変更履歴を自動的に同期・削除(クリーンアップ)しない仕様になっているためです。

本記事では、このゴミとなって残ってしまったリモート追跡ブランチを安全に一括削除し、ローカル環境をクリーンにする方法を解説します。


1. なぜ古いリモート追跡ブランチが残るのか?

Gitが持つリモート情報の追跡メカニズムでは、git fetchgit 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 -rgit branch -a の一覧から、すでにリモートに存在しないブランチ情報が綺麗さっぱり消去されます。


3. 設定で自動化する(推奨)

毎回 --prune オプションをタイピングするのは面倒です。Gitの設定ファイルを書き換えて、git fetchgit pull を行うたびに自動で prune が走るように設定しておきましょう。

以下のコマンドを実行します。

# グローバル設定(すべてのリポジトリ)で自動pruneを有効にする
git config --global fetch.prune true

この設定を行っておけば、今後は単に git fetchgit 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 で手動クリーンアップする

常にリポジトリを整理整頓し、快適なコマンドライン環境を保ちましょう。