Git を使って開発していると、
GitHub 上では消えているはずのブランチが、ローカルでは残って見える
という現象に遭遇することがあります。
error: unable to delete 'feat/base': remote ref does not exist error: failed to push some refs
発生した状況
以下のような流れで問題が起きました。
git branch -aを実行remotes/origin/feat/baseが表示される- GitHub の Web サイトを見ると、そのブランチはすでに削除済み
- 削除しようとして以下を実行
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 fetchgit pull
を実行するたびに、
不要なリモート追跡ブランチを自動で削除 してくれます。
よくある勘違いポイント
- ❌
git branch -aに出ている = GitHub に存在する - ⭕ 実際は「ローカルに残っている情報」なだけ
Git は「安全側」に倒れる設計のため、
勝手にブランチを消さない のが仕様です。
まとめ
- GitHub で消したブランチが
git branch -aに残ることがある - 原因はローカルのリモート追跡情報のズレ
- 解決方法はこれだけ👇
git fetch --prune
- 定期的にズレを防ぐなら
fetch.prune = trueを設定






