gitlab中需手动设置protected branches保护main分支:在settings→repository→protected branches中添加main分支,allowed to push留空或选no one,allowed to merge仅限maintainer及以上,并启用code owners审批;develop分支应允许developer推送但强制mr合并且要求ci通过和至少1个批准;feature/*通配符分支需设developer可推、maintainer或code owners可合并,并强制pipeline通过;mr必须启用至少1个批准、状态检查通过(如test/lint)及必要评论,硬性规则优于模板提示。

GitLab里怎么设置main分支禁止直接推送?
直接推送到main是多数线上事故的起点。GitLab默认不保护任何分支,必须手动开启Protected Branches才能拦截git push origin main这类操作。
操作路径:项目 Settings → Repository → Protected Branches → Add a protected branch
- Branch name:填
main(或master,取决于你初始化时用的名字) - Allowed to merge:勾选
Maintainer及以上角色(别开Developer,否则等于没设) - Allowed to push:留空或选
No one——这是关键,留空即禁止所有人直接推送 - Require approval from code owners:建议勾上,强制指定文件变更需对应Owner批准
注意:push权限和merge权限是独立控制的。即使某人能合并MR,也不代表他能直接推;反之亦然。很多团队误以为“能合并=能推”,结果绕过审查直接提交。
为什么develop分支要允许Developer推送但强制MR合并?
develop不是生产分支,但它是集成入口。允许Developer推送是为了支持快速迭代,但必须通过MR(Merge Request)合并,否则无法触发CI检查、无法留痕、无法回溯谁合了什么。
典型配置:
- Branch name:
develop - Allowed to push:
Developer(仅限该角色) - Allowed to merge:
Developer(同上,但必须走MR流程) - Require all status checks to pass:勾选CI/CD pipeline成功才允许合并
- Require at least 1 approval:避免单人自审自合
坑点:如果只开了Allowed to push却没开Require MR,开发者仍可git push origin develop直推,MR形同虚设。GitLab不会自动阻止——它只管权限,不管流程意识。
feature/*分支怎么避免命名混乱和权限失控?
用通配符feature/*保护一类分支,比逐个保护更可持续,但容易忽略两个细节:
- 通配符匹配的是远程分支名,不是本地分支名。你在本地建
git switch -c feature/login没问题,但git push origin feature/login时,GitLab才按feature/*规则校验 -
feature/*的Allowed to push必须设为Developer,否则新人连分支都推不上去;但Allowed to merge建议设为Maintainer或启用Code Owners,防止低权限者合并到develop - 别忘了配
Require pipelines to pass——否则feature分支合入前可能跳过单元测试
真实案例:有团队把feature/*的merge权限也放开给Developer,结果有人在MR里偷偷删了CI脚本,合入后整个develop构建失败两小时。
代码审查(MR)里哪些检查项不能跳过?
MR不是形式主义,是最后一道人工防线。以下三项在GitLab MR界面必须显式启用,且不能被“Approve anyway”绕过:
-
Require at least 1 approval:哪怕团队只有两人,也得有人看。没人review的MR就是裸奔 -
Require status checks to pass:至少包含test和lint两类检查。CI失败就锁死合并按钮 -
Require comments on changes(可选但强烈建议):强制Reviewer对diff区域打标记,避免“LGTM”式敷衍
容易被忽略的点:MR模板里的Checklist只是提示,不阻断合并;真正起作用的是Settings里配置的硬性规则。模板写十遍“请确认数据库迁移已测试”,不如一条Require pipeline with job name 'migrate-test' to pass来得实在。











