安全批量合并需在基线分支运行,用 git merge --no-commit --no-ff + 显式错误判断中断冲突,硬编码黑名单拦截 protected 分支,禁止自动 push,依赖 git status --porcelain 检查状态,不切换分支、不调 api、不吞错误。

不能直接用 git merge 循环跑,否则分支不存在、冲突未处理、误合 protected 分支(如 main)会立刻出事。
怎么安全地批量合并指定分支到当前分支
脚本必须在目标基线分支(比如 main)上运行,只做“合入”,不切换分支。核心动作是:git merge --no-commit --no-ff,它不自动提交,留给你检查冲突或暂存状态。
- 先用
git branch --format='%(refname:short)'获取本地所有分支名,再用grep过滤目标模式(如feature/或fix/) - 对每个候选分支执行
git merge --no-commit --no-ff $branch - 合并后立刻跑
git status --porcelain:输出为空表示干净;有内容说明有冲突或未暂存变更,必须中断 - 不要用
git checkout切换主干——这会让脚本逻辑变复杂,且容易污染当前上下文
如何防止合并时覆盖他人提交或跳过保护分支
Git 默认允许往 main 合并,但生产环境必须拦截。硬编码黑名单比调 API 更可靠。
- 在循环里加判断:
[[ $branch =~ ^(main|release/.*|hotfix/.*)$ ]] && echo "SKIP: $branch protected" && continue - 不依赖
.git/config或远程 protected rules——Shell 解析配置不可靠,GitHub/GitLab API 也不该由脚本直连 - 合并后禁止自动
git push:留给人走 PR 流程或等 CI 通过后再推,这是协作底线
遇到冲突时怎么让脚本停下来而不是强行继续
git merge 冲突时返回非零退出码,但默认不终止循环。后续分支会在已冲突工作区反复操作,导致状态混乱。
- 必须显式判断:
if ! git merge --no-commit --no-ff $branch; then echo "CONFLICT on $branch"; exit 1; fi - 别用
|| true吞错误,也别设set -e——它会在git status --porcelain返回 1(有未提交变更)时误杀脚本 - 冲突发生后,工作区处于
merging状态,git merge --abort可恢复,但是否中止整个批次应由人决定,脚本只负责报错和退出
真正麻烦的不是写几行 git merge,而是分支命名不规范、本地没 fetch 最新远端记录、或者有人偷偷改了 protected 分支规则——这些都会让脚本在第 3 个分支就卡死,而你还在等第 12 个。











