跳到主要内容

Git 分支清理:本地与远程的定期大扫除

git branch 打出几十页,全是几个月前合过的分支。补丁式的清理很容易出错,这篇讲一套安全的分批做法。

一、先看清现状​

git fetch --prune # 同步远程,并清掉已删除的远程跟踪分支
git branch # 本地分支
git branch -r # 远程分支
git branch -vv # 本地分支 + 对应的上游 + 最后一条提交

-vv 是重点:[origin/xxx: gone] 表示上游已经没了,这种分支基本可以直接删。

二、删本地已合并的​

git branch --merged main # 列出已合进 main 的
git branch -d <name> # 删除(会检查是否已合并)

批量删(先干跑一遍确认):

git branch --merged main | grep -v -E "^\*|main|develop" | xargs -r git branch -d

-d 只删已合并的,是安全的那把刀。-D 是强制,删之前一定先 git log <name> --not main 看一眼有没有独有提交。

三、删远程分支​

git push origin --delete feature/old

远程分支在网页上删掉之后,本地用 git fetch --prune 或 git remote prune origin 同步。

批量删远程也可以脚本化,但建议先列出候选:

git for-each-ref --format='%(refname:short) %(committerdate:short)' refs/remotes/origin | sort -k2

按最后提交时间筛出超过半年的,逐个人工确认——远程分支往往关联着别人的 PR 或部署环境,误删有实际影响。

四、清理引用过期分支​

git remote prune origin 只删远程跟踪分支。工作区里残留的:

git worktree prune # worktree 记录
git gc --prune=now # 打包对象、回收不可达提交(谨慎)

gc --prune=now 会立刻丢弃不可达对象,reflog 里的东西就救不回来了,确认没有问题再执行。

五、误删之后​

git reflog # 找最后一次提交
git branch <name> <sha>

远程分支被删且本地没有记录,只能找同事的仓库或者平台的回收站。

六、建一套自动化规则​

分支多了靠自觉清是不现实的,定规则更靠谱:

  • 合入主干后,PR 平台自动删源分支(多数平台支持)
  • 本地做别名,每周跑一次 git fetch --prune + 列出 gone 的分支
  • 长期不动的实验分支,改成 tag 或归档到一个 attic/ 前缀下
  • 分支命名带用途前缀:feat/、fix/、chore/,清理时好筛

七、小结​

清理的核心不是命令,是纪律:先列候选、再干跑、最后删。-d 优先于 -D,--prune 优于手动删跟踪分支,删远程前一定有人确认。