DESIGN / CODE / INFRA / AI

解説

消えたリモートブランチが残る?git fetch --pruneとローカルの枝を分けよう

ローカルだけの二つの作業コピーとbareリポジトリで検証。pruneがorigin/topicを整理しても、ローカルのtopicは残ることを確認。

消えたリモートブランチが残る?git fetch --pruneとローカルの枝を分けよう
保存リストを見る →
この記事の道しるべ 4項目

共有先でブランチを削除したのに、手元では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

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。