GitHub -- защита веток (branch protection)
Branch protection rules — правила на GitHub, запрещающие прямой push в защищённую ветку и требующие прохождения проверок (code review, CI) перед слиянием.
Зачем нужно
Без защиты любой разработчик с доступом может случайно запушить сломанный код напрямую в main. Branch protection требует: минимум один ревью перед merge, прохождение CI-тестов, запрет force push. Это страховка от человеческих ошибок и гарантия качества в продакшн-ветке.
Где используется
- Защита
main/masterв любом командном проекте - Защита
developв Git Flow - Корпоративные требования: обязательный аппрув от тимлида
- Open source: мейнтейнеры контролируют что попадает в проект
Основной контент
Настройка Branch Protection
GitHub → репозиторий → Settings → Branches → Add branch protection rule
Поле «Branch name pattern»: main (или * для всех веток, release/* для паттерна).
Основные опции
Require a pull request before merging
- Запрещает прямой push в ветку
- Код может попасть только через Pull Request
Required number of approvals: 1 (или больше)
- PR можно смержить только после N одобрений
- «Dismiss stale pull request approvals» — сбрасывать одобрение при новых коммитах
Require status checks to pass before merging
- CI-тесты должны пройти перед мержем
- Указываешь конкретные проверки:
build,test,lint
Require branches to be up to date before merging
- Ветка должна быть актуальна с base-веткой (нет отставания)
Do not allow bypassing the above settings
- Даже администраторы подчиняются правилам
Allow force pushes — обычно выключено для main
Allow deletions — обычно выключено для main
Пример минимальной конфигурации для команды
Branch: main
✅ Require pull request before merging
✅ Required approvals: 1
✅ Dismiss stale pull request approvals when new commits are pushed
✅ Require status checks to pass before merging
✅ Require branches to be up to date before merging
Required checks: [build, test]
✅ Do not allow bypassing the above settings
❌ Allow force pushes
❌ Allow deletions
Результат при попытке прямого push
git push origin main
# remote: error: GH006: Protected branch update failed for refs/heads/main.
# 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)
Частые ошибки
- Не добавлены required checks — правило есть, но CI-статусы не проверяются; merge разрешён без тестов
- Администратор обходит правила — если не включён «Do not allow bypassing», owner может пушить напрямую в main
- Не синхронизировать ветку перед merge — без «Require branches to be up to date» можно смержить устаревший код