Git Flow, GitHub Flow и Trunk-Based Development: какой workflow выбрать

Разбираем структуру веток, правила мержа и точки применения каждого workflow — и рассказываем, как команде перейти с одного подхода на другой без боли.

Обложка: Git Flow, GitHub Flow и Trunk-Based Development: какой workflow выбрать

Когда команда только начинает использовать Git, все коммитят в main — и это работает. Но с ростом числа разработчиков, выпусков и параллельных задач хаос нарастает: кто-то сломал сборку, хотфикс застрял в незарелизенной ветке, никто не знает, что попадёт в следующий релиз. Решение — договориться о workflow: наборе правил, как создавать ветки, когда сливать и что идёт в прод.

Существует несколько устоявшихся подходов: Git Flow, GitHub Flow, Trunk-Based Development и GitLab Flow. У каждого свои сильные стороны и ограничения. Разберём, чем они отличаются и какой выбрать для вашей команды.

Ключевые выводы

— Git Flow оправдан для продуктов с длинными релизными циклами (мобильные приложения, коробочное ПО).

— GitHub Flow — простой выбор для SaaS и веб-команд с CI/CD: одна ветка main + короткоживущие фичи.

— Trunk-Based Development максимизирует скорость деплоя, но требует зрелой инфраструктуры: feature flags, автотесты, быстрый CI.

— GitLab Flow — компромисс между Git Flow и Trunk-Based: environment-ветки без сложных release-веток.

— Начните с GitHub Flow и переходите на Trunk-Based по мере роста CI/CD-зрелости команды.

Эта статья — часть нашего полного путеводителя по Git. Там — весь маршрут: от первого коммита до продвинутых workflow.

Git Flow: строгая структура для долгих релизов

Git Flow — самый известный workflow, описанный Винсентом Дриссеном в 2010 году. Его основа — две постоянные ветки: main (всегда стабильна, только теги релизов) и develop (интеграционная ветка). Поверх них — три типа временных веток.

			main          ●─────────────────────────────────●─── (v1.1.0)
               \                               /|
develop        ●───●───●───●───●───●───●───●──● ●──(hotfix merge)
                    \       /       \   /      \
feature/login  ─────●───●──           \        \
feature/pay    ─────────────────●───●─\        \
release/1.1.0                         ●───● ──→ main+develop
                                               \
hotfix/crash   ────────────────────────────────●───● ──→ main+develop
		
  • feature/* — новые функции, ответвляются от develop, сливаются обратно
  • release/* — подготовка релиза: только баг-фиксы, документация, версии; сливается в main и develop
  • hotfix/* — срочные фиксы прямо из main; сливается и в main, и в develop

Когда оправдан: мобильная разработка (App Store review занимает дни), коробочное ПО с поддержкой нескольких версий, enterprise-продукты с квартальными релизными циклами. Команда знает: в main только то, что уже у пользователей.

Минусы: тяжёлый для SaaS с деплоем несколько раз в день — слишком много веток, слишком много merge'ей. Ветки живут долго, накапливают конфликты. Инструмент git flow упрощает работу, но не убирает сложность модели.

GitHub Flow: простота для непрерывной поставки

GitHub Flow появился как реакция на сложность Git Flow. Правило одно: main всегда готов к деплою, новые фичи — в короткоживущих ветках через PR.

			main     ●──────────────────────●──────────────●
          \                   /  \            /
feature   ─●──●──●──●──●──●──    ─●──●──●──●─
                               PR              PR
		
  • Создаёте ветку от main с понятным именем (fix/login-timeout, feat/dark-mode)
  • Коммитите, открываете Pull Request — это точка обсуждения и code review
  • После approve'а и прохождения CI — мёрж в main и деплой

Когда оправдан: SaaS-продукты, веб-сервисы, команды с настроенным CI/CD, где деплой происходит после каждого мёрж в main. Простота модели снижает когнитивную нагрузку: все знают один набор правил.

Ограничение: отсутствует встроенная концепция «релиза» и «staging». Если нужно поддерживать несколько версий одновременно — GitHub Flow не покрывает этот кейс без дополнительных договорённостей.

Trunk-Based Development: всё в main, feature flags в помощь

Trunk-Based Development (TBD) доводит идею короткоживущих веток до предела — разработчики интегрируют изменения напрямую в trunk несколько раз в день. Модель существует с 1990-х и вдохновила упрощённые подходы вроде GitHub Flow. Если используются ветки — они живут максимум 1–2 дня и сливаются без церемоний.

			main  ●──●──●──●──●──●──●──●──●──●──●──●──●──●
       |     |        |              |       |
       dev1  dev2     dev3           dev1    dev2
       (feat A half-done,
        behind feature flag)
		

Незавершённый код скрывается за feature flags: функция есть в коде, но включается только для нужной аудитории. Это позволяет постоянно интегрировать изменения, не ломая прод. Системы вроде LaunchDarkly, Unleash или простейший конфиг-файл — стандартный инструментарий TBD-команд.

Когда оправдан: зрелые команды с высоким покрытием тестами, быстрым CI (< 10 минут), культурой маленьких атомарных коммитов. Google, Facebook, Amazon деплоят по этой модели тысячи раз в день. По данным DORA (State of DevOps 2018), элитные DevOps-команды деплоят в 46 раз чаще, чем команды с низкой зрелостью процессов.

Требования: без надёжного CI/CD, автотестов и feature flags TBD превращается в хаос. Не пробуйте этот подход, если CI занимает больше 20 минут или нет хорошего тестового покрытия — нет универсального порога, но без него TBD рискован.

GitLab Flow: среднее между двух крайностей

GitLab Flow решает главный пробел GitHub Flow — отсутствие environment-веток. Концепция: main — это то, что разработано; staging — что протестировано; production — что в проде.

			main       ●──●──●──●──●──●──●──●
             \        \        \
staging        ●────────●────────●
                \        \        \
production       ●────────●────────●
		

Фичи разрабатываются в ветках, сливаются в main, затем промоутируются вниз по цепочке окружений. Подход близок к реальности большинства команд: есть staging для QA, есть production для пользователей.

Когда оправдан: команды, которым нужен staging/QA-процесс перед релизом, но сложность Git Flow избыточна. Хорошо сочетается с GitLab CI/CD и авто-деплоем по веткам.

Таблица сравнения

КритерийGit FlowGitHub FlowTrunk-BasedGitLab Flow
Размер командыСредние и крупныеЛюбойСредние+Любой
Релизный циклНедели — месяцыЕжедневноНесколько раз в деньДни — недели
Сложность настройкиВысокаяНизкаяСредняяСредняя
Требования к CI/CDЖелательноОбязательноКритичноОбязательно
Feature flagsНе нужныОпциональноОбязательноОпционально
Поддержка нескольких версийДаНетНетЧастично

Как выбрать: практические рекомендации

Начните с GitHub Flow — это разумный дефолт для большинства команд. Простые правила, понятный процесс PR/review, легко объяснить новичку. Если вы только выстраиваете процессы — это ваш выбор.

Переходите на Trunk-Based Development, когда: CI стабильно проходит за < 10 минут, команда привыкла к маленьким коммитам, есть инфраструктура для feature flags. Не форсируйте переход — команды, прыгнувшие в TBD без готовности, возвращаются обратно через месяц.

Выбирайте Git Flow только если у вас длинные релизные циклы с обязательной сертификацией, поддержка нескольких мажорных версий одновременно (например, мобильное приложение с 1.x и 2.x у разных клиентов), или регуляторные требования к freeze-периодам.

Помните: workflow — это договорённость внутри команды. Лучший workflow — тот, который все понимают и соблюдают. Формализованный Git Flow, который никто не соблюдает, хуже неформального «коммитим в main аккуратно». Также полезно настроить Git hooks для автоматической проверки соблюдения правил — linting, тесты, формат коммит-сообщений.

Часто задаваемые вопросы
1
Можно ли совмещать элементы разных workflow?

Да, и это распространённая практика. Например, взять GitHub Flow за основу, но добавить отдельную staging-ветку как в GitLab Flow. Главное — задокументировать договорённости и убедиться, что вся команда их понимает. Самопридуманные гибриды работают, если они решают реальную проблему, а не усложняют ради усложнения.

2
Почему Git Flow считают устаревшим?

Сам Винсент Дриссен в 2020 году добавил к оригинальной статье примечание: Git Flow был создан до эпохи непрерывной поставки. Для веб-сервисов, которые деплоятся несколько раз в день, модель избыточна. Устаревшим он не является — просто оптимален для узкого класса задач. Для мобильных приложений и коробочного ПО он по-прежнему актуален.

3
Как Trunk-Based Development работает без feature flags?

Технически возможно, но рискованно. Без feature flags незавершённый код попадает в прод в «видимом» состоянии. Частичный выход — branch by abstraction: рефакторинг через промежуточный слой абстракции, который переключают целиком. Но для большинства команд проще начать с простого feature flag — даже переменная окружения уже решает проблему.

Git workflow — не религия. GitHub Flow подходит большинству команд прямо сейчас: он прост, понятен и хорошо масштабируется с CI/CD. Trunk-Based Development — следующий уровень для команд, которые хотят деплоить несколько раз в день и готовы инвестировать в инфраструктуру. Git Flow остаётся правильным выбором там, где он исторически появился — в продуктах с длинными релизными циклами. Выбирайте инструмент под задачу, а не под моду.

Рекомендуем