【Git】git branch -a に残る削除済みリモートブランチの正体と解消方法

Git を使って開発していると、
GitHub 上では消えているはずのブランチが、ローカルでは残って見える
という現象に遭遇することがあります。

error: unable to delete 'feat/base': remote ref does not exist
error: failed to push some refs

発生した状況

以下のような流れで問題が起きました。

  1. git branch -a を実行
  2. remotes/origin/feat/base が表示される
  3. GitHub の Web サイトを見ると、そのブランチはすでに削除済み
  4. 削除しようとして以下を実行
git push origin :feat/base

エラーが出る

結論:原因は「ローカルのリモート追跡情報が古い」

この問題の原因はとてもシンプルです。

GitHub 上の状態と、ローカルに保存されている origin/* 情報がズレている

git branch -a で表示される
remotes/origin/*実体ではなくキャッシュ情報 です。

つまり、

  • GitHub:すでに削除済み
  • ローカル:まだ「あることになっている」

という状態になっていました。


正しい解決方法(これだけでOK)

git fetch --prune を実行する

git fetch --prune

このコマンドを実行すると、

  • リモート(GitHub)に存在しないブランチを
  • ローカルの remotes/origin/* から自動削除

してくれます。

実行後に確認:

git branch -a

remotes/origin/feat/base が消えていれば解消完了です


なぜ git push origin :branch は失敗したのか?

git push origin :feat/base

このコマンドは、

「リモートに存在する feat/base を削除せよ」

という意味です。

しかし今回は、

  • すでに GitHub 側にブランチが存在しない
  • 削除対象が見つからない

ため、

remote ref does not exist

というエラーになりました。

操作自体は間違っていません。
単に「もう消えていた」だけです。


今後ズレを防ぐおすすめ設定

毎回 --prune を付けるのが面倒な場合は、
以下を設定しておくと便利です。

git config --global fetch.prune true

これにより、

  • git fetch
  • git pull

を実行するたびに、
不要なリモート追跡ブランチを自動で削除 してくれます。


よくある勘違いポイント

  • git branch -a に出ている = GitHub に存在する
  • ⭕ 実際は「ローカルに残っている情報」なだけ

Git は「安全側」に倒れる設計のため、
勝手にブランチを消さない のが仕様です。


まとめ

  • GitHub で消したブランチが git branch -a に残ることがある
  • 原因はローカルのリモート追跡情報のズレ
  • 解決方法はこれだけ👇
git fetch --prune
  • 定期的にズレを防ぐなら fetch.prune = true を設定

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA