目的
リモートリポジトリで削除されたブランチが、ローカルのgit branch -r
の一覧に残り続ける問題を解決する。これにより、ローカルのリモート追跡ブランチをリモートリポジトリの最新の状態と正確に同期させることが可能になる。
結論 (TL;DR)
一時的に実行する場合は以下のコマンドを使用する。
$ git fetch --prune
恒久的に設定し、git fetch
時に常にクリーンアップを有効にする場合はこちらが推奨である。
$ git config --global fetch.prune true
ワークフロー
1. 現状確認
リモートで削除済みのorigin/feature/old-task
がローカルに残っている状態を確認する。
$ git branch -r
origin/main
origin/feature/new-task
origin/feature/old-task <-- これを消したい
2. コマンド実行
--prune
オプションを付けてfetchを実行する。
$ git fetch --prune
From github.com:your/repo
x [deleted] (none) -> origin/feature/old-task
3. 結果確認
不要なリモート追跡ブランチが削除されたことを確認する。
$ git branch -r
origin/main
origin/feature/new-task
詳細
自動化設定
グローバル設定でfetch.prune
をtrue
にすることで、すべてのリポジトリでgit fetch
が自動的にpruneを実行するようになる。
# 設定
$ git config --global fetch.prune true
# 確認
$ git config --get fetch.prune
true
# 解除
$ git config --global --unset fetch.prune
git remote prune
との違い
git fetch --prune
: リモートの最新情報を取得し、その後不要な追跡ブランチを削除する。git remote prune <remote-name>
: リモートの最新情報を取得せず、単に不要な追跡ブランチの削除のみを行う。
通常はfetchと同時に行う方が効率的であるため、git fetch --prune
またはその設定が推奨される。
タグのprune
リモートで削除されたタグも合わせてローカルから削除したい場合は--prune-tags
オプションを使用する。これはfetch.prune
の設定とは独立している。
$ git fetch --prune --prune-tags
これをデフォルトの挙動にしたい場合は、別途エイリアスを設定するのが一般的である。
# .gitconfig に追記
[alias]
fp = fetch --prune --prune-tags