git合并前不自动运行测试是默认行为,需依赖ci平台(如gitlab ci或github actions)在mr/pr触发时执行测试并强制拦截未通过的合并,本地hook不可靠且无法替代远端强制门禁。

Git 合并前不自动跑测试,是默认行为
Git 本身不带测试执行能力,git merge 命令只做代码整合,不会调用 pytest、npm test 或任何测试命令。所谓“合并时自动跑测试”,本质是靠外部系统在合并动作触发前后介入——比如 CI 平台监听 merge_request 事件,或本地 pre-merge hook 拦截操作。
GitLab CI 中让 MR 合并前必须通过测试
这是最常用、也最可靠的落地方式。关键不是改 Git,而是配置 .gitlab-ci.yml:
- 把测试任务定义为
testjob,并设rules:匹配merge_requests事件 - 在 MR 页面的 “Pipelines” 标签页里,会显示该 job 状态;未通过时,Merge 按钮被禁用(需开启
Only allow merge requests to be merged if the pipeline succeeds设置) - 注意:MR 的 pipeline 默认基于源分支 HEAD 运行,不是合并后的结果。如需测“合并后效果”,得加
include: template: Merge-Request-Pipelines.gitlab-ci.yml或手动git merge $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
GitHub Actions 中拦截 PR 合并
类似 GitLab,但配置文件是 .github/workflows/test.yml:
- 用
on: pull_request触发,而非push,确保每次 PR 更新都重跑 - 务必加上
if: github.event_name == 'pull_request' && github.event.action == 'opened'避免重复触发 - 测试失败时,PR 页面会显示 ❌,且无法点击 “Merge pull request” —— 前提是仓库 Settings → Branches → Require status checks to pass before merging 已勾选对应 workflow 名称
本地 pre-merge hook 只能辅助,不能替代 CI
有人想用 .git/hooks/pre-merge-commit 跑测试,但有硬伤:
- hook 不会上传到远程,团队成员各自维护,极易失效
- Git 不会在
git merge时默认调用它,得手动git merge --no-ff --no-commit才触发 - 即使跑通,也无法阻止别人跳过 hook 直接 push,对协作无实质约束力
- 若测试耗时长(比如端到端),会拖慢本地开发节奏,反而促使开发者绕过它
真正起作用的永远是远端 CI 的强制门禁,而不是本地脚本。本地 hook 最多当个提醒器,别把它当防线。











