【Git】ブランチ名を変更したらpushできなくなったときの対処法

【Git】ブランチ名を変更したらpushできなくなったときの対処法 Git

ブランチ名をローカルで変更した直後にgit pushがエラーで拒否されるのは、追跡先(upstream)が古いブランチ名のまま残っている、リモート側に同名ブランチが存在する、あるいは保護設定で書き込みが禁止されていることが主な原因です。
まず現在の参照関係を確認し、追跡先の付け替えとリモートの整理を行うことで解消できます。

現在の状態を確認する

どのブランチをどのリモートに追跡させているか、リモートにそのブランチが存在するかを把握します。

# 追跡先(upstream)を確認
git rev-parse --abbrev-ref --symbolic-full-name @{u}

# ローカルと追跡先の対応関係を一覧
git branch -vv

# リモートに存在するブランチを取得・掃除して確認
git fetch --prune
git ls-remote --heads origin

ケースA:ローカルだけブランチ名を変更した(pushで拒否される)

ローカルの名前変更はgit branch -mで完了しますが、追跡先は古いままです。新しい名前で上流設定を付け替えてからpushします。

# 例:現在のブランチ名を new-name に変更(旧名は old-name だった)
git branch -m new-name

# 新しいブランチ名で上流を設定して初回push
git push --set-upstream origin new-name

旧ブランチ名がリモートに不要であれば削除します(チーム合意のうえで実行)。

# リモートの旧ブランチを削除
git push origin :old-name

ケースB:リモート側のブランチ名も変更したい(履歴はそのまま継承)

既存のリモートを「改名」する手順は、実質的には「新名で公開 → 旧名を削除」です。既存のPRやCI設定に影響があるため、事前に告知してから行います。

# ローカルの改名と上流設定(Aの手順)
git branch -m new-name
git push --set-upstream origin new-name

# 問題なければ旧名をリモートから削除
git push origin :old-name

# 参照を掃除
git fetch --prune

ホスティング(GitHub/GitLab)で「デフォルトブランチ」に設定している場合は、新しいブランチ名に切り替えます。保護ルール(branch protection)やCIの対象ブランチも併せて更新します。

ケースC:リモートに同名ブランチが既に存在してpushできない

リモートのnew-nameが自分の履歴と異なる場合、fast-forwardできずに拒否されます。統合すべきか上書きすべきかを判断します。

# 統合して直線化(推奨)
git fetch --prune
git rebase origin/new-name
git push

# どうしても自分の履歴で置き換える(要チーム合意)
git push --force-with-lease origin new-name

強制pushは他者の履歴を失わせる可能性があるため、保護ブランチでは通常禁止されています。原則はPRで統合します。

ケースD:ブランチ保護や権限でpushが拒否される

エラーメッセージに「protected branch」「required status check」などが含まれている場合は、ブランチ保護が原因です。レビュー必須やCI必須のルールを満たすか、管理者に設定変更を依頼します。強制pushは無効化されていることが一般的です。

ケースE:追跡設定が壊れている/別リモートに向いている

追跡先が存在しないブランチ名を指しているときは、上流を再設定します。複数のリモートがある場合、push先を明示します。

# 上流を新しい名前に付け替え
git branch --set-upstream-to=origin/new-name

# リモートを明示してpush
git push origin HEAD

ケースF:リモートで「名前だけ」変わった(サーバー側で改名された)

管理画面でリモートのブランチ名が変更された場合、ローカルの追跡先は古い名前のまま残ります。fetchで参照を更新し、ローカルも改名して紐付けを直します。

# リモートの変更を反映
git fetch --prune

# ローカルのブランチ名を合わせる
git branch -m old-name new-name

# 新しい上流を設定
git branch --set-upstream-to=origin/new-name

# 念のため動作確認
git pull --ff-only
git push

よくある落とし穴と対策

リモートの旧名を消し忘れてクライアントに古い参照が残り続けることがあります。定期的にfetch --pruneを実行し、不要参照を掃除します。また、CI/CD設定やブランチ保護、デフォルトブランチ、PRのベースブランチなど、周辺設定のブランチ名も忘れずに更新します。

# 参照掃除を常時有効化(再発防止)
git config --global fetch.prune true

まとめ

ブランチ名の変更後にpushできない主因は、上流の付け替え漏れ・リモートの旧名残存・保護設定の未更新です。
新名で--set-upstreamを付けて初回pushし、不要になった旧名を削除、必要に応じて保護ルールやデフォルトブランチ、CI設定を更新すれば解決します。
競合する同名ブランチがある場合は、リベース統合を基本とし、強制pushは合意のうえ最終手段に限定しましょう。