Защита ветки main на GitHub
| Введение | |
| Ruleset: запрет прямых коммитов в main | |
| Bypass: кому разрешить обход проверок | |
| Классика: Branch protection rule | |
| Проверка | |
| Другие статьи про Git |
Введение
По умолчанию любой участник репозитория с правом записи может сделать push напрямую в main — один неверный коммит, и прод лежит. Защита ветки решает это на стороне сервера: GitHub отклоняет прямые пуши, а изменения попадают в main только через pull request с проверками. Исключения для automation и дежурных настраиваются через bypass — ниже оба механизма. (English version.)
Автор: Артур Исаев
Ruleset: запрет прямых коммитов в main
Актуальный механизм — rulesets (репозиторий или организация):
1. Откройте Settings репозитория → Rules →
Rulesets → New ruleset → New branch ruleset.
2. Дайте имя (например protect-main), Enforcement status
поставьте Active.
3. В Target branches добавьте Include default branch
(покрывает main, даже если его переименуют) или явный шаблон
main.
4. Включите правила:
Restrict deletions
Require a pull request before merging
Require status checks to pass
Block force pushes
У Require a pull request before merging задайте минимум
(например 1 approval), при желании — Dismiss stale pull request
approvals и Require conversation resolution.
5. Нажмите Create. С этого момента git push origin
main отклоняется сервером, а merge кнопки в pull request
требует выполнения правил.
Bypass: кому разрешить обход проверок
Полный запрет неудобен для automation (deploy-боты, release-please) и дежурных на пожаре. В том же ruleset есть секция Bypass list → Add bypass: выберите актора — роль (Repository admin, Maintain, Write), команду, deploy key или приложение — и режим:
Always — актор обходит все правила ruleset
Pull request — актор обходит только требование pull request
Практика: ботам — Always (им некому аппрувить), живым людям — максимум Pull request, и только тем, кто реально тушит пожары. Bypass виден в истории правил, поэтому злоупотребления находятся за минуту. Права на редактирование самого ruleset остаются у администраторов — bypass не даёт менять правила.
Классика: Branch protection rule
Старый механизм (Settings → Branches → Add classic branch protection rule, шаблон main) делает то же самое для одной ветки: Require a pull request before merging + Allow specified actors to bypass required pull requests — список людей и приложений, которым разрешён прямой пуш. Если rulesets уже настроены, классика не нужна: два механизма поверх друг друга только путают.
Проверка
Обычный участник после настройки получает отказ:
$ git push origin main
remote: error: GH006: Protected branch update failed
remote: error: Changes must be made through a pull request.
To https://github.com/USER/REPO.git
! [remote rejected] main -> main (protected branch hook declined)
Актор из bypass list пушит как раньше. Документация GitHub: about protected branches, about rulesets.
Article author: Andrei Olegovich
| Git remote | |
| Git | |
| GitHub | |
| Защита ветки main | |
| Actions | |
| Переход с https аутентификации на ssh | |
| GitLab |