Auto-merge - функция GitHub, при которой PR помечается «слить, когда все условия выполнены». Полезно, когда:
- Ты получил review с правками, ответил пушем, и теперь ждёшь зелёного CI. Вместо ожидания у компьютера ставишь auto-merge и идёшь делать другую задачу.
- У тебя open PR на котором нужен approve от занятого reviewer'а. Включаешь auto-merge, когда reviewer apprоve'ит - PR сольётся автоматически.
Включение
Через CLI:
gh pr merge 123 --auto --squash --delete-branch
Флаги стратегии (--squash, --rebase, --merge) обязательны:
auto-merge должен знать, какой стратегией сливать.
Через UI: на странице PR кнопка «Enable auto-merge» (рядом с обычной merge-кнопкой). Появляется dropdown стратегии, выбираешь.
Условия слияния
Auto-merge срабатывает, когда все выполнены:
- Required reviews получены (если в branch-protection стоит «Require approvals»).
- Required status checks зелёные (если стоит «Require status checks to pass»).
- Если стоит «Require branches to be up to date» -ветка обновлена относительно target'а.
- Все conversation resolved (если стоит «Require conversation resolution»).
- Для CODEOWNERS-paths получен approve от owner'а (если стоит «Require review from Code Owners»).
Если хоть одно условие не выполнено, auto-merge ждёт.
Отмена
Auto-merge можно снять:
gh pr merge 123 --disable-auto
Или кнопка «Disable auto-merge» в UI.
Также auto-merge автоматически отменяется, если:
- Кто-то поставил Request Changes review.
- Кто-то запушил force-push на ветку PR (теряется approve).
- Required check failed.
Подводные камни
- Auto-merge должен быть включён в Settings репо. Settings -> General -> Pull Requests -> «Allow auto-merge». По умолчанию отключено.
- Без required conditions auto-merge срабатывает мгновенно. Это, по сути, обычный merge. Полезно только когда есть что ждать.
- На public-репо автору auto-merge может оказаться недоступен, если есть branch protection с required reviewers и автор не может approve самого себя.
- Auto-merge не догоняет main. Если включено «Require branches to be up to date», и main ушёл вперёд, auto-merge не делает rebase сам. Нужно либо вручную rebase, либо включить «Automatically update branches» в Repo Settings.
Merge queue (продвинутый случай)
На больших репо с активным main одного auto-merge мало: пока ты
ждёшь зелёного CI, в main приходит чужой PR, твой CI устаревает.
GitHub Merge Queue решает это: PR'ы выстраиваются в очередь, GitHub
собирает временную ветку gh-readonly-queue/... (event
merge_group), куда добавляет коммиты PR'ов в порядке очереди
поверх свежего main, прогоняет CI на этой ветке и при зелёном
результате fast-forward'ит main. Каждый PR проверяется в том
состоянии, в котором он реально вольётся - конфликты и регрессии,
возникающие от сочетания PR'ов, ловятся до merge.