Стратегии ветвления
GitHub Flow
Самая простая и популярная схема:
mainвсегда рабочий и готов к выкату.- Для каждой задачи создается короткая ветка от
main. - Открывается Pull Request, проходит ревью и проверки.
- После слияния в
mainкод выкатывается.
main: A---B-------M---N \ /feature: C---DПодходит большинству команд и веб-проектов с постоянной поставкой.
Trunk-based development
Все работают почти напрямую в main, ветки живут не дольше одного-двух дней. Незаконченные функции прячут за флагами возможностей (feature flags). Требует хорошей автоматизации и тестов. Используется в крупных командах с частыми релизами.
Git Flow
Много долгоживущих веток:
main — только релизы, помечены тегамиdevelop — общая интеграцияfeature/* — задачи, от developrelease/* — подготовка релизаhotfix/* — срочные исправления, от mainПодходит для продуктов с версионными релизами (мобильные приложения, библиотеки, десктоп). Для веб-сервисов обычно избыточен.
Что выбрать
| Ситуация | Схема |
|---|---|
| Веб-сервис, частые деплои | GitHub Flow или trunk-based |
| Несколько поддерживаемых версий | Git Flow или релизные ветки |
| Маленькая команда, учебный проект | GitHub Flow |
Pull Request
Pull Request (PR, в GitLab — Merge Request) — запрос на слияние ветки с обсуждением и проверками.
Порядок:
git switch -c feature/searchgit add .git commit -m "Add search endpoint"git push -u origin feature/searchЗатем откройте PR на GitHub. Если установлен GitHub CLI:
gh pr create --fillgh pr checkout 42gh pr merge 42 --squashХороший Pull Request
- небольшой: до 200–400 строк, одна задача;
- с описанием: что сделано, зачем, как проверить, ссылка на задачу;
- с зелеными проверками: тесты и линтеры проходят;
- самопроверен: вы сами просмотрели diff до запроса ревью;
- в draft режиме, пока не готов.
Шаблон описания:
## Что сделаноДобавлен поиск по каталогу.## ЗачемЗадача PROJ-123: пользователи не могут найти товары.## Как проверить1. Открыть /catalog2. Ввести слово в поле поиска## Скриншоты и заметкиСпособы слияния PR
| Способ | Результат | Когда |
|---|---|---|
| Merge commit | сохраняет все коммиты и добавляет merge | нужна полная история |
| Squash and merge | все коммиты ветки в один | чистая история, много мелких коммитов |
| Rebase and merge | линейная история, коммиты сохраняются | аккуратные коммиты в ветке |
Для большинства команд удобен Squash and merge: один PR — один коммит в main.
Code review
Для автора:
- отвечайте на комментарии спокойно, правьте или объясняйте;
- не переписывайте историю во время ревью без нужды, так тяжелее смотреть изменения.
Для ревьюера:
- проверяйте логику, граничные случаи, безопасность, тесты, читаемость;
- критикуйте код, а не человека;
- разделяйте блокирующие замечания и пожелания («nit:»);
- отвечайте быстро: долгие ревью тормозят команду.
Сообщения коммитов: Conventional Commits
Единый формат помогает читать историю и автоматически генерировать changelog и версии:
тип(область): описаниетелоподвалТипы:
| Тип | Назначение |
|---|---|
feat | новая функциональность |
fix | исправление ошибки |
docs | документация |
refactor | изменение кода без смены поведения |
test | тесты |
chore | служебные изменения, зависимости |
perf | улучшение производительности |
ci | настройки CI |
Примеры:
feat(auth): add login via emailfix(cart): prevent negative quantitydocs: update install instructionsfeat(api)!: remove deprecated v1 endpointsЗнак ! или подвал BREAKING CHANGE: означают несовместимое изменение.
Правила репозитория
Настройте в GitHub: Settings → Branches → Branch protection rules (или Rulesets) для main:
- запрет прямого push, только через Pull Request;
- минимум одно одобрение ревью;
- обязательные проверки CI перед слиянием;
- запрет force push и удаления ветки;
- требование актуальной ветки перед слиянием;
- опционально: подписанные коммиты, линейная история.
CODEOWNERS
Файл .github/CODEOWNERS назначает ответственных за части кода. Они автоматически добавляются в ревьюеры:
* @team-lead/backend/ @backend-team/frontend/ @frontend-team/.github/ @devopsЧто хранить в репозитории
Должно быть:
- исходный код и тесты;
README.md: что это, как запустить, как внести вклад;.gitignore;LICENSEдля открытых проектов;- конфигурация CI/CD;
.env.exampleбез реальных значений;CONTRIBUTING.mdс правилами команды.
Не должно быть:
- секретов: паролей, токенов, ключей,
.env; - зависимостей (
node_modules,target) и сборки; - больших бинарных файлов, для них используют Git LFS;
- личных настроек IDE.
Ежедневные привычки
- Начинайте день с
git pull --rebase. - Коммитьте часто и небольшими порциями.
- Перед коммитом смотрите
git statusиgit diff --staged. - Не работайте долго в ветке без синхронизации с
main. - Не коммитьте код, который не компилируется или ломает тесты.
- Удаляйте слитые ветки.
- Перед силовыми операциями (
reset --hard,push --force) остановитесь и подумайте.
