リモート追跡ブランチのクリーンアップ

目的

リモートリポジトリで削除されたブランチが、ローカルの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.prunetrueにすることで、すべてのリポジトリで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