如何配置Git规则阻止未合入dev分支的代码合入main分支
向main分支合入的前置校验落地方案
完全可以通过分支保护规则+轻量CI校验实现你要的拦截效果,不需要额外采购工具,主流代码托管平台(GitLab、GitHub、Gitea等)都原生支持相关配置,具体实现如下:
核心校验逻辑
校验的本质是检查PR里所有要合入main的新提交,是否都已经存在于dev分支的提交历史中,用Git原生命令就能实现,逻辑非常可靠,不会因为commit重命名、变基出现误判:
# 校验前先拉取完整提交历史,禁止使用浅克隆 git fetch origin main dev --unshallow # 提取当前PR相对于main分支的所有新增commit PR_NEW_COMMITS=$(git rev-list origin/main..HEAD) for COMMIT_SHA in $PR_NEW_COMMITS do # 判断当前commit是否已经存在于dev分支历史中 if ! git merge-base --is-ancestor $COMMIT_SHA origin/dev then echo "拦截原因:提交 $COMMIT_SHA 未合入dev分支,请先完成dev分支合入与测试后再提main分支PR" exit 1 fi done echo "提交校验通过,所有变更均已在dev分支存在" exit 0
注意:如果CI任务默认配置了浅克隆,一定要加
--unshallow参数拉全量历史,否则会出现commit追溯不到的误拦截。
平台侧配置步骤
- 先给
main分支配置基础保护规则:关闭所有用户的直接push权限,所有代码变更必须通过PR合入,除管理员外所有角色不允许绕过分支保护规则 - 把上面的校验脚本配置为
main分支PR的必过状态检查:只要PR的目标分支是main就自动触发该校验,校验不通过的PR直接置为不可合入状态,普通用户无法点合并按钮 - 给管理员开放强制合入权限:遇到main、dev存在差异化提交的特殊场景(比如紧急hotfix直接合入main的场景),管理员确认风险后可以手动跳过校验完成合入,满足特殊场景的放行需求
可选优化:PR创建阶段前置拦截
如果想减少无效PR的流转成本,可以配置平台的PR创建webhook,在用户刚发起目标为main的PR时就触发上述校验逻辑,不符合要求的PR直接拒绝创建,返回明确的操作提示,不用等CI运行后再通知用户调整。
这个校验逻辑不会误拦正常的反向合并场景:比如把main分支的hotfix反向合入dev时,相关commit本来就已经在main分支历史中,不会被识别为PR新增提交,不会触发拦截。
内容的提问来源于stack exchange,提问作者Avinash Singh
相关产品推荐
相关产品推荐

