Gitで不要になったリモートブランチを削除したのに、ローカル環境でgit branch -r
を実行するとまだ残っている——そんな経験はありませんか。
これはリモートブランチが本当に存在しているのではなく、ローカルに古い参照(リモート追跡ブランチ)が残っていることが原因です。
本記事では、この現象が起きる仕組みと解決方法、再発防止のための設定までを解説します。
現象の原因
git push origin --delete branch-name
でリモートブランチを削除すると、リモートリポジトリ上からは確かに消えます。
しかし、ローカルのリモート追跡ブランチ(origin/branch-name
)は自動的には消えません。
これはGitがローカルの参照情報を更新するタイミングが限られており、削除通知を受け取っていない場合、古い情報が残るためです。
つまり、リモート上には存在しないブランチへの参照が、ローカルの.git/refs/remotes/origin
配下に残ってしまっているのです。
解決方法1:fetch時に不要な参照を削除する
最も一般的な解決方法は、git fetch
に--prune
オプションを付けて不要な参照を削除することです。
# リモートで削除されたブランチの参照をローカルから削除
git fetch --prune
実行後、git branch -r
で確認すると不要なブランチは表示されなくなります。
解決方法2:デフォルトで–pruneを有効化する
毎回--prune
を付けるのが面倒な場合は、Gitの設定でデフォルト動作として有効にできます。
# fetch時に常にpruneを有効化
git config --global fetch.prune true
これでgit fetch
を実行するたびに、自動で不要な参照が削除されます。
解決方法3:明示的に参照を削除する
特定のリモート追跡ブランチだけを削除したい場合は、git branch -dr
を使って手動で削除できます。
# origin/feature-old を削除
git branch -dr origin/feature-old
これは即座にローカルの参照を消すため、fetchを待たずにクリーンアップできます。
解決方法4:古いタグや参照もまとめて整理する
大規模なリポジトリでは、不要なタグや参照も残りやすいため、定期的に整理するとよいでしょう。
# タグも含めてリモートの状態に同期
git fetch --prune --prune-tags
再発防止のための運用
リモートブランチ削除後の参照残りは、基本的には自動同期の設定で防げます。
さらにチーム運用では、不要なブランチは定期的に棚卸しし、削除と同時に周知することでローカルの混乱を防止できます。
# おすすめ設定(fetch時に自動削除)
git config --global fetch.prune true
まとめ
リモートブランチを削除してもローカルで残る原因は、古いリモート追跡ブランチが自動では消えないためです。
git fetch --prune
で不要な参照を整理し、fetch.prune
を有効化することで再発を防げます。
チーム運用では定期的なクリーンアップと周知を行い、履歴や参照の管理を整えておくことが重要です。