Trunk-based development
Стратегия ветвления, при которой все разработчики интегрируют изменения в одну главную ветку (trunk/main) как можно чаще — несколько раз в день.
Зачем нужно
Долгоживущие feature-ветки накапливают конфликты и откладывают интеграцию. Trunk-based development (TBD) решает это радикально: ветки живут не более 1-2 дней, интеграция в main происходит постоянно. Это основа Continuous Integration: CI-пайплайн всегда смотрит на trunk и быстро сигнализирует о проблемах. Крупные компании (Google, Facebook, Netflix) используют именно этот подход.
Где используется
- Команды с высокой частотой деплоя (несколько раз в день)
- CI/CD-пайплайны, где каждый коммит в main запускает деплой
- Как альтернатива Gitflow для продуктов без строгих релизных окон
- Совместно с Feature Flags для сокрытия незаконченных фич в production
Основной контент
Основные принципы TBD
- Один trunk (main/master) — единственная долгоживущая ветка
- Короткие ветки — feature-ветки живут 1-2 дня максимум
- Частые коммиты — интеграция в main несколько раз в день
- Feature Flags — незаконченная фича скрыта флагом, а не веткой
- Стабильный trunk — main всегда в деплоибельном состоянии
Базовый workflow
# Утром: синхронизироваться
git switch main
git pull --rebase origin main
# Создать короткую ветку для небольшой задачи
git switch -c feat/add-search-field
# Быстро реализовать, покрыть тестами
# ... работа ...
git commit -m "feat: добавить поле поиска в хедер"
# Актуализировать ветку и отправить
git rebase origin/main
git push -u origin feat/add-search-field
# Создать PR → быстрое ревью (< 4 часов) → merge в main
# Удалить ветку
git switch main
git pull
git branch -d feat/add-search-field
Feature Flags вместо долгих веток
// Вместо ветки живущей месяц — флаг
if (featureFlags.isEnabled('new-checkout-flow')) {
return <NewCheckout />;
}
return <OldCheckout />;
# Код фичи живёт в main, но скрыт флагом
git commit -m "feat: добавить новый checkout (за флагом)"
# Когда фича готова — включить флаг через конфиг
# Когда фича стабильна — удалить флаг и старый код
Release branches (при необходимости)
# Если нужны стабильные релизные ветки
git switch main
git checkout -b release/2.1.0
# Только cherry-pick критичных фиксов в release
git cherry-pick abc1234
# Тегировать релиз
git tag -a v2.1.0 -m "Release 2.1.0"
git push --tags
Сравнение с Gitflow
| Критерий | TBD | Gitflow |
|---|---|---|
| Количество веток | 1 + короткие feature | develop, main, release, hotfix, feature |
| Время жизни ветки | 1-2 дня | Недели и месяцы |
| Интеграция | Непрерывная | По релизным окнам |
| Feature flags | Обязательны | Не нужны |
| CI/CD | Обязателен | Желателен |
Частые ошибки
- Не использовать Feature Flags — без флагов короткие ветки не помогают при длинной разработке фич
- Игнорировать CI — TBD без автоматических тестов — это просто частые коммиты в сломанный main
- Слишком большие PR даже при TBD — разбивай задачи на маленькие инкременты (< 400 строк в PR)
- Переходить на TBD без подготовки команды — нужны зрелый CI/CD, культура код-ревью и Feature Flag система
Связанные темы
- _MOC Git
- git branch и git checkout
- git merge -- слияние веток
- git rebase -- основы
- Conventional Commits