解説
消えたリモートブランチが残る?git fetch --pruneとローカルの枝を分けよう
ローカルだけの二つの作業コピーとbareリポジトリで検証。pruneがorigin/topicを整理しても、ローカルのtopicは残ることを確認。
共有先でブランチを削除したのに、手元ではorigin/topicがまだ見える。リモート追跡ブランチは、取得した共有先の情報を手元に持つための参照だよ。
今回はGitが使えるBashなどの環境で、新しい一時フォルダー内のリポジトリだけを使う。インターネットへpushせず、仕事用の接続先にも触れない練習だよ。
topicとorigin/topicは別の参照
| 名前の例 | 今回の役割 |
|---|---|
| 共有先のtopic | 共有先にあるブランチ |
| 手元のorigin/topic | その共有先を取得して追跡する参照 |
| 手元のtopic | 自分のローカルブランチ |
git fetch --pruneは、通常の取得設定では、共有先でなくなったリモート追跡参照を整理する。手元のローカルブランチまで、同じ名前だから削除する操作ではないよ。
一時フォルダーで、三つの場所を作る
次の例ではremote.gitを共有先、authorとreaderを作業用コピーにする。カッコ内で動くため、元の作業ディレクトリは変えない。練習フォルダーは自動削除しないよ。
(
set -e
task_prune_dir=$(mktemp -d)
git init --bare -q -b main "$task_prune_dir/remote.git"
git clone -q "$task_prune_dir/remote.git" "$task_prune_dir/author"
cd "$task_prune_dir/author"
printf 'base\n' > note.txt
git add note.txt
git -c user.name=Practice -c user.email=practice@example.invalid commit -qm base
git push -q origin main
git switch -q -c topic
printf 'topic\n' >> note.txt
git add note.txt
git -c user.name=Practice -c user.email=practice@example.invalid commit -qm topic
git push -q -u origin topic
git clone -q "$task_prune_dir/remote.git" "$task_prune_dir/reader"
git -C "$task_prune_dir/reader" branch --track topic origin/topic
git -C "$task_prune_dir/reader" branch -r --list origin/topic
git switch -q main
git push -q origin --delete topic
git -C "$task_prune_dir/reader" fetch -q --prune origin
git -C "$task_prune_dir/reader" branch -r --list origin/topic
git -C "$task_prune_dir/reader" branch --list topic
)
最初のcloneでは、まだ空の共有先であることを知らせる警告が出る。ここでは想定した状態。ユーザー名とメールアドレスは練習のコミットにだけ指定し、グローバル設定は変更しないよ。
二つの一覧を見比べる
削除前のreaderにはorigin/topicが表示される。authorから、この練習専用の共有先のtopicを削除し、readerでprune付きのfetchをしたあとは、origin/topicの一覧が空になる。
最後のローカルブランチの一覧にはtopicが残る。共有先の削除、追跡参照の整理、自分のブランチの削除は別の操作なんだ。
実際の設定では削除対象を確認する
pruneの対象は取得のrefspecなどの設定に関係する。タグを取得・整理する設定や独自の参照指定がある場合まで、今回と同じ範囲だと決めないようにしよう。
普段の環境で使う前は、接続先と取得設定、残したいローカルの作業を確認する。ローカルブランチを消す必要があるかは、取り込まれたコミットや用途を見て別に判断したいね。
編集部では練習用の共有先と二つのコピーで、追跡参照の削除、ローカルブランチと作業ファイルの保持を確認した。取得と統合はfetchとpull、コミットの所在はbranch --containsも参考になるよ。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。