必须先切换到其他分支才能删除当前分支;本地用 git branch -d(安全)或 -D(强制),远程用 git push origin --delete 分支名,删后需 git fetch --prune 清理缓存。

合并后删分支前必须切换到目标分支
Git 不允许你删除当前所在分支,这是最常卡住的第一步。比如你要删 feature/login,就得先确保不在它上面——否则 git branch -d feature/login 会直接报错:error: Cannot delete branch 'feature/login' checked out.
正确做法是先切到目标分支(通常是 main 或 master):
git checkout main
或者用更现代的写法:
git switch main
- 别依赖
git merge feature/login后自动留在main—— 如果你之前就在feature/login上执行了git merge main,那当前分支还是它 - 用
git branch看一眼星号*在哪,比凭记忆可靠 - Fork / Sourcetree 等 GUI 工具也遵循同一规则:右键删分支前,得先点一下别的分支激活它
本地分支用 git branch -d 还是 git branch -D
-d 是安全删除,只删已合并的;-D 是强制删除,不管合没合并。别图省事全用 -D,容易丢未推送或未合并的提交。
推荐流程:
- 先试
git branch -d feature/login—— 如果提示not fully merged,说明还有未合并的提交,这时才考虑是否真要丢弃 - 确认无误后再用
git branch -D feature/login - 批量删已合并分支可这样:
git branch --merged | grep -v "main\|master" | xargs git branch -d
注意:--merged 默认检查的是当前分支的上游,不是绝对“合并进 main”,所以最好先 git checkout main 再跑。
远程分支删除命令容易写错
删远程分支不是 git branch -d -r origin/feature/login —— 那只是删本地对它的引用,远程仓库根本没动。真正删远程分支要用 git push 推一个空引用过去:
git push origin --delete feature/login
等价写法(Git 1.7.0+):
git push origin -d feature/login
旧版本 Git(1.5.0–1.6.x)只能用:
git push origin :feature/login
- 冒号
:前不能有空格,origin:feature/login是错的 -
origin要和你实际 remote 名一致,比如公司私有仓库可能是upstream或gitlab - 删完后,其他协作者本地仍能看到
origin/feature/login,需各自运行git fetch --prune或git fetch -p清理过时跟踪分支
删完分支后 GitHub/GitLab 上还能看到 PR 记录吗
能。PR(Pull Request)或 MR(Merge Request)是平台级对象,和分支生命周期解耦。即使你删了 feature/login 分支,只要 PR 已合并,它的讨论、审查记录、CI 结果都保留在网页上。
但要注意:
- 如果 PR 还没合并就删了源分支,GitHub 会自动关闭该 PR,并标记为 “closed without merging”
- 某些团队策略要求 PR 关闭后才删分支,避免误关活跃开发中的 PR
- GitHub 的 “Delete branch after merge” 选项(创建 PR 时勾选)会自动帮你删远程分支,但不删本地分支 —— 本地还得手动清理
真正容易被忽略的是:删完本地 + 远程分支后,没人再主动 git fetch -p,久而久之本地 git branch -r 列表里还躺着一堆 origin/xxx —— 它们早已不存在,只是本地缓存没更新。


















