小王刚接手公司新项目,发现主分支 main 被保护起来了——自己 push 不上去,连合并请求(PR)都得经过两人审批才能合入。他一愣:这权限不是管理员后台点几下就完事了?其实真没那么简单,不同平台、不同角色、不同分支策略,设置方式差别挺大。
先搞清:谁在管分支权限?
Git 本身不带权限系统,真正的分支权限控制,靠的是代码托管平台实现的。主流平台有 GitHub、GitLab、Gitee、腾讯工蜂等,它们在仓库设置里提供「分支保护规则」或「受保护分支」功能。比如你在 GitHub 上点进仓库 → Settings → Branches → Branch protection rules,就是干这个的。
GitHub 上怎么设?举个真实例子
假设你们约定:main 分支只允许通过 PR 合并,且必须有至少 1 人批准、CI 测试通过、禁止强制推送。操作路径如下:
1. 进入仓库 Settings → Branches
2. 点击 "Add rule"
3. 在 "Branch name pattern" 填:main
4. 勾选:
□ Require pull request reviews before merging
□ Require status checks to pass before merging(勾选你的 CI 任务名,如 build, test)
□ Include administrators(可选,让管理员也遵守规则)
□ Require linear history
□ Prevent force pushes
5. 点击 "Create"这样,哪怕你是仓库管理员,想直接 git push --force origin main,也会被拒绝。
GitLab 设置更细:还能按角色分权
GitLab 支持按用户组、角色(Maintainer、Developer)、甚至具体用户名来设置分支权限。比如:只允许 dev-team 组向 develop 推送,但 release/* 分支只允许 ops-group 合并。
路径是:Settings → Repository → Protected branches,选分支 → 设置「Allowed to merge」和「Allowed to push」的权限级别。
Gitee(码云)怎么弄?
国内用得多,界面更直白。进仓库 → 管理 → 分支保护 → 新建规则。支持设置:是否允许强制推送、是否需 PR、是否需指定人员审核、是否需通过 CI 检查。还支持正则匹配分支名,比如 feature/.* 批量保护所有 feature 分支。
别漏了本地配置:权限不是万能的
分支保护再严,也防不住本地误操作。比如你切到 main 分支改了两行代码,直接 git commit -am "fix" 再 git push —— 如果没开保护规则,就真上去了。所以建议团队统一加个 pre-commit 钩子,防止在敏感分支上提交:
#!/bin/bash
# .git/hooks/pre-commit
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [[ "$CURRENT_BRANCH" == "main" || "$CURRENT_BRANCH" == "master" ]]; then
echo "⚠️ 禁止在 $CURRENT_BRANCH 分支直接提交,请使用 PR 方式!"
exit 1
fi保存后加执行权限:chmod +x .git/hooks/pre-commit,下次就在本地卡住了,省得推上去再被拒。
最后提醒一句
权限不是设完就高枕无忧。定期检查规则是否还适用:比如新来了外包同学,要不要限制他们只能向 feature/ 分支推送?测试环境分支 staging 是否该开启自动部署触发条件?这些细节,往往比“怎么设置”更重要。