要在 macOS 上检查本地 Git 分支是否可以安全删除,请检查工作区、将该分支的提交与要保留的分支进行比较,并检查它是否在另一个工作树中被使用。打开终端,切换到仓库目录,并将 Git 的已合并分支检查作为参考依据——而不是该分支已毫无价值的绝对保证。如果不确定,请保留该分支,直到确认其工作内容已被妥善保留。
1. 打开仓库并检查未完成的更改
从“应用程序”>“实用工具”中打开“终端”,或使用“聚焦搜索”(Spotlight)找到它。Apple 文档说明 zsh 是终端的默认 shell,以下命令均可在标准 macOS 环境下运行。在终端中切换到仓库目录;如果路径包含空格,请加上引号:
cd "/path/to/your/repository"
git status --short --branch
状态输出会显示当前检出的分支以及文件是否有更改。在切换分支之前,请提交或以其他方式保留所需的文件更改。这项检查与分支历史记录无关:干净的工作区并不意味着该分支的提交已被合并。同样,即使你使用 Git 的常规安全删除选项来删除分支,未提交的更改也不会受到保护。
2. 检查分支是否已合并到正确的目标分支
首先确定你打算保留的分支,通常是 main 或 develop。如果你当前正处于候选分支上,在删除任何内容之前请先切换到目标分支。将下面的 feature/example 和 main 替换为你实际的分支名称:
git switch main
git branch --merged main
git branch --no-merged main
第一个列表包含顶端提交可从 main 可达的本地分支;第二个列表包含顶端提交不可达的分支。Git 将 git branch --merged 描述为列出已合并到指定提交(若未提供则为 HEAD)的分支。这是一项提交历史测试,因此仅在 main 确实应该是包含这些工作的分支时才有用。已合并到其他发布或集成分支的分支,在针对 main 检查时仍可能显示为未合并。Git branch 文档
如果候选分支出现在 --merged main 中,这有力地表明其提交已经可以从 main 可达。请确认相关功能或修复已按预期存在,特别是如果你的团队使用拉取请求(pull request)、发布分支或不同的合并目标分支。如果它出现在 --no-merged 下,在检查清楚它包含哪些独有提交之前,切勿将其删除。
3. 检查提交和上游跟踪
要将候选分支与目标分支进行比较,请使用:
git log --oneline main..feature/example
这会显示从 feature/example 可达但从 main 不可达的提交。如果有输出提交记录,请仔细检查它们,并决定是否需要将它们合并、挑拣(cherry-pick)或保留。空结果意味着在此次比较中候选分支没有超出 main 的提交;但这并不能证明该分支名称或其用途已不再需要。
分支也可能跟踪一个远程分支。使用以下命令检查其跟踪信息:
git branch -vv
上游分支是 Git 用于拉取(pull)和推送(push)等操作的已配置引用。缺少或失效(gone)的上游并不证明本地分支可以安全移除:它的提交可能仍然是独有的。此外,在执行 fetch 之前,远程跟踪引用可能已经过时。如果你想刷新远程跟踪数据,git fetch --prune origin 会从 origin 获取更新,并根据该远程仓库的 refspec 清除过期的远程跟踪引用;它不会删除你的本地分支。Git fetch 文档
4. 检查工作树,然后安全删除
分支可能会在另一个关联的工作树(worktree)中被检出。Git 会拒绝删除处于检出状态的分支,因此如果删除被拒绝,请在采取进一步操作之前运行 git worktree list 并检查列出的目录。另外,请确认候选分支不是你当前所在的分支;请先切换到目标分支。Git branch 文档
当你确认工作内容已被保留且不再需要该分支时,请使用 Git 的安全保护选项将其删除:
git branch -d feature/example
只有当分支已完全合并到其配置的上游分支,或者在没有配置上游时合并到 HEAD,Git 才允许使用 -d。如果 Git 拒绝,请将其视为需要进一步核查的提示。-D 会强制删除而不考虑合并状态;它会绕过此项保护机制,不应作为常规的应对手段。Git branch 文档
做出谨慎决定的流程很简单:只有在候选分支的工作内容已存在于预期目标中、独有提交已完成审查且没有工作树仍在使用该分支之后,才使用 -d 进行删除。如果其中任何一项检查尚不明确,请先保留该分支并确认其最终目标。
参考来源
- Git - git-branch 文档 — Git
- Git - git-fetch 文档 — Git
- 在 Mac 上的“终端”中更改默认 shell — Apple