1. 介绍
Pull Request(PR) 是我们在 GitHub 上协作开发的核心机制。它允许我们提出变更、进行代码评审,并在合并新功能或修复 bug 到主分支前确保一切无误。
然而,有些时候我们需要阻止某些 PR 被提前合并。无论是为了确保代码质量、要求通过测试,还是必须获得特定人员的评审意见,阻止 PR 合并是维护代码库完整性的关键手段。
在本教程中,我们将一步步讲解如何使用 GitHub 内建的功能,如分支保护规则、状态检查和强制评审,来阻止 PR 合并。同时,我们也会讨论如何根据团队的协作流程来定制这些设置。
2. 为什么需要阻止 PR 合并
在介绍具体操作之前,先来看几个常见的需要阻止 PR 合并的场景:
✅ 确保代码质量:在合并代码前,我们可能需要确保其满足一定的标准,例如通过代码评审、自动化测试、风格检查等。
✅ 防止未完成的代码被合并:有时 PR 是提前打开的,尚未准备好合并。阻止合并可以确保代码在合并前已经完整并通过评审。
✅ 减少冲突风险:通过限制合并,确保 PR 在合并前经过充分测试和评审,降低与主分支产生冲突的可能性。
在大型团队或开源项目中,这种机制尤其重要,有助于维护代码库的稳定性和质量。
3. 设置分支保护规则
GitHub 的分支保护规则(Branch Protection Rules)允许我们控制哪些条件满足后,分支才可以被合并。通过这些规则,我们可以设定多种合并前提条件。
3.1. 进入分支保护设置
首先,进入你要设置规则的仓库页面,点击右上角的 “Settings” 标签,然后在左侧菜单中找到 “Branches” 并点击 “Branch protection rules”:
进入后你会看到类似如下界面:
3.2. 创建分支保护规则
点击 “Add branch ruleset” 按钮,添加一条新规则。在 “Targets” 中填写你要保护的分支名,支持通配符,比如 main
或 feature/*
:
接着,你可以启用一些关键选项:
- ✅ Require pull request reviews before merging:强制 PR 必须有评审后才能合并
- ✅ Require status checks to pass before merging:必须通过指定状态检查(如 CI 测试)
- ✅ Require branches to be up to date before merging:合并前必须更新到最新版本,避免冲突
如下图所示:
启用状态检查后,界面类似如下:
设置完成后点击 “Create” 或 “Save changes” 即可生效。
4. 强制执行特定检查
除了基础的分支保护外,我们还可以设置一些必须通过的检查项,比如测试通过、代码扫描等。
4.1. 示例:强制测试通过
假设我们使用 GitHub Actions 做 CI,可以创建一个工作流来自动运行测试,并在测试失败时阻止合并。
在仓库的 .github/workflows
目录下创建一个 YAML 文件,例如 ci.yml
,内容如下:
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '14'
- run: npm install
- run: npm test
当 PR 被打开时,GitHub Actions 会自动运行该工作流。如果测试失败,则 PR 无法合并。我们需要确保分支保护规则中启用了该状态检查:
这样就能确保只有测试通过的 PR 才能被合并。
5. 强制特定人员审批
有时我们希望在合并 PR 前,必须获得某些特定人员或团队的审批,这在涉及关键模块或领域知识时非常有用。
在分支保护规则中,可以启用 “Require pull request reviews before merging” 选项:
如果你的仓库中设置了 CODEOWNERS 文件,还可以勾选 “Require review from Code Owners”,确保相关负责人必须审批。
这样可以确保关键代码变更必须由有经验的人员审核通过。
6. 处理例外情况和规则覆盖
虽然阻止 PR 合并是维护代码质量的重要手段,但在某些特殊情况下我们也需要临时绕过规则。
⚠️ 只有仓库管理员才有权限覆盖分支保护规则。如果你是管理员,在合并时会看到如下选项:
你可以选择 “Dismiss stale pull request approvals” 或者 “Bypass branch protection rules”。
✅ 建议: 每次覆盖规则时最好在 PR 中留言说明原因,以保持透明和可追溯。
你也可以在分支保护规则中启用 “Require conversation resolution before merging”,确保所有讨论都解决后再合并:
7. 总结
在本教程中,我们介绍了如何在 GitHub 中通过分支保护规则、状态检查和强制评审来阻止 PR 合并,从而确保代码质量、规范流程、防止低质量代码进入主分支。
这些机制是维护代码完整性的重要工具,但在某些特殊情况下也应保留一定的灵活性。管理员可以临时绕过规则,但应谨慎操作,并做好记录。
如果你发现自己频繁需要绕过规则,建议回头检查你的分支保护设置,看是否过于严格或缺乏灵活性。必要时调整规则后,记得及时恢复原有设置,以保持代码保护水平。