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 → репозиторий → SettingsBranchesAdd 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» можно смержить устаревший код

Связанные темы

Ресурсы