git branch -m 仅重命名本地分支,远程需三步同步:删旧分支、推新分支、用 git push -u 设置上游,否则远程残留旧分支导致 PR 错乱、CI 双跑、协作者拉取失败。

git branch -m 只改本地,远程完全无感知
执行 git branch -m old-name new-name 后,你只是把 .git/refs/heads/old-name 文件删了、建了个 .git/refs/heads/new-name,内容还是同一个 commit hash。远程仓库里 origin/old-name 依然存在,且你的本地分支不会自动关联到 origin/new-name。此时运行 git status,大概率看到提示:Your branch is based on 'origin/old-name', but the upstream is gone. —— 这不是警告,是上游已断裂的明确信号。
远程必须删旧 + 推新 + -u 设置上游
Git 不支持原子性重命名远程分支,只能靠三步组合完成:
- 先确认旧分支是否还存在:
git ls-remote --heads origin old-name(有输出才需删) - 删远程旧分支(推荐写法):
git push origin --delete old-name(别用git push origin :old-name,CI 工具可能不识别) - 推新分支并设置上游:
git push -u origin new-name(-u会写入branch.new-name.merge和branch.new-name.remote)
漏掉任何一步,都会导致远程同时存在 old-name 和 new-name,PR 关联错乱、CI 双跑、权限策略失效。
协作者同步时必须手动清理本地残留
其他开发者不能只 git pull 就完事。他们需要:
-
git fetch --prune(或git fetch -p):清理本地对origin/old-name的远程追踪引用 - 如果本地还有
old-name分支,需人工决定是否保留;若要切换到新分支,得先git checkout new-name或git switch new-name - 若本地
old-name分支仍存在且有未推送提交,而远程old-name已被删,这些提交将无法通过常规 fetch 恢复
最易被忽略的是:重命名前没确认所有协作者是否已推送完变更。一旦远程旧分支被删,那些未推送的提交就彻底丢失。
VSCode 和 IDE 的 Rename Branch 不解决同步问题
VSCode 1.90+ 内置的 Git: Rename Branch 命令,底层就是调用 git branch -m,不做任何远程操作,也不修复上游配置。它在分离 HEAD 状态下(比如刚 rebase 完)还会报错:fatal: You are on a branch yet to be born。IDE 显示的分支名更新了,但 git push 仍往 origin/old-name 推——因为 branch.old-name.merge 配置项还在。


















