删除本地分支用 git branch -d(安全删除,拒绝未合并分支)或 git branch -d(强制删除,慎用);删远程分支需 git push origin --delete branch-name 后执行 git fetch --prune 清理本地缓存。

删除本地分支用 git branch -d 还是 git branch -D
区别在于是否强制:如果分支已合并到当前分支(比如 main),git branch -d 会安全删除;如果还有未合并的提交,它会拒绝操作并提示错误 error: The branch 'xxx' is not fully merged.。这时必须用 git branch -D 强制删除——但请先确认你真不需要那些提交,否则数据就丢了。
实操建议:
- 日常清理推荐先试
git branch -d branch-name,失败再看提示决定是否强删 - CI/CD 脚本或自动化场景常用
-D,避免交互中断 - 删除前可用
git log --oneline --graph --all快速扫一眼分支关系,避免误删活跃开发分支
怎么删远程分支:不是 git push origin --delete 就完事了
正确命令是 git push origin --delete branch-name,等价于 git push origin :branch-name(冒号前空格,这是旧语法,现在不推荐)。但很多人删完发现 git branch -r 里还显示那个远程分支名——这是因为本地的远程跟踪引用没更新。
所以完整流程是:
- 执行
git push origin --delete branch-name - 运行
git fetch --prune或git remote prune origin清理本地缓存的远程分支引用 - 验证:再次运行
git branch -r,确认origin/branch-name不再出现
注意:如果团队多人共用一个远程仓库,别人本地的 origin/branch-name 不会自动消失,得各自执行 fetch --prune。
删完远程分支,为什么别人 git pull 还会试图合并?
因为 git pull 默认等价于 git fetch && git merge,而 git merge 会参考 branch.<name>.merge</name> 配置项。如果某个本地分支(比如 feature/login)曾被设置为追踪 origin/feature/login,即使远程分支已被删,这个追踪配置仍存在。下次在该分支上 git pull,Git 仍会尝试合并已不存在的远程分支,报错 fatal: couldn't find remote ref refs/heads/feature/login。
解决方法:
- 删掉本地分支的上游配置:
git branch --unset-upstream feature/login - 或者直接删本地分支(如果不再需要):
git branch -d feature/login - 如果想保留本地分支但换追踪目标,用
git branch --set-upstream-to=origin/main feature/login
批量删本地分支:别手敲每个名字
比如 CI 构建后要清理所有 ci- 开头的临时分支,手动删太慢。可以用 shell 管道组合:
git branch --format='%(refname:short)' | grep '^ci-' | xargs git branch -D
说明:
-
git branch --format='%(refname:short)'只输出分支名(不含refs/heads/) -
grep '^ci-'匹配开头为ci-的行 -
xargs git branch -D对每行执行强删 - 安全起见,首次运行可把最后的
git branch -D换成echo先预览要删哪些
Windows PowerShell 用户注意:xargs 不可用,改用 ForEach-Object 或写个简单循环。











