← назад к разделу

Git не навязывает процесс: ветки дешёвые, делай что хочешь. Поэтому каждая команда выбирает модель ветвления — соглашение о том, какие ветки живут в проекте, откуда ветвиться и куда вливаться. Моделей за пятнадцать лет придумано много, но реально выбор идёт между тремя. Знать их нужно и чтобы быстро включиться в процесс новой команды, и чтобы понимать, почему процессы такие разные.

Различает их одно число: сколько времени работа живёт в стороне от общей ветки — недели, дни или часы. Всё остальное — следствие.

Git Flow: две долгих ветки и три временных v1.0 main hotfix release develop feature v1.1 v1.2 GitHub Flow: один main, ветки на дни main ветка → pull request ветка → pull request деплой деплой trunk-based: ствол, ветки на часы, флаги main ветка-однодневка за фиче-флагом жизнь ветки часы дни недели

Три модели по очереди на одном холсте. Git Flow: main с тегами версий и develop живут всегда, feature, release и hotfix приходят и уходят; работа держится в стороне неделями, а hotfix обязан вернуться и в main, и в develop — иначе фикс потерян. GitHub Flow: один main, короткая ветка через pull request, после слияния — деплой. Trunk-based: мелкие коммиты прямо в ствол, редкая ветка-однодневка, недоделанное — за фиче-флагом. Метка внизу показывает, как от модели к модели сокращается жизнь ветки.

Git Flow: тяжеловес эпохи релизов

Классика 2010 года: две долгоживущие ветки — main (только релизы, каждый помечен тегом) и develop (интеграция текущей разработки) — плюс три вида временных: feature/* (от develop, в develop), release/* (подготовка релиза: стабилизация, версии), hotfix/* (срочный фикс от main, вливается и в main, и в develop).

Сильная сторона — параллельные версии: пока develop копит v2.4, release-ветка стабилизирует v2.3, а hotfix чинит v2.2 в проде. Слабая — церемониальность: много веток, много слияний, забытый «hotfix в develop» — классический источник регрессий.

Где уместен: коробочные продукты, мобильные приложения с релизными поездами, энтерпрайз с параллельной поддержкой версий. Для непрерывно деплоящихся веб-сервисов Git Flow сегодня избыточен (это признал и его автор).

GitHub Flow: просто и вокруг PR

Одна долгоживущая ветка — main, всегда готовая к деплою. Всё остальное — короткие ветки от main, вливаемые назад через pull request с ревью и зелёным конвейером. Влил — задеплоил.

Сильные стороны: минимальная церемония, скорость, естественная связка с код-ревью и CI. Слабость — нет штатного места для «стабилизации релиза» и параллельных версий: main всегда один.

Где уместен: веб-сервисы и команды с непрерывной поставкой — то есть большинство современных продуктовых команд. Если сомневаетесь, с чего начать, — начните с этого.

Trunk-based: скорость на пределе

Радикальное развитие той же идеи: все коммитят в main («ствол») очень маленькими порциями — либо напрямую, либо через ветки-однодневки. Интеграция происходит непрерывно, конфликты почти исчезают (нечему расходиться), скорость поставки максимальна.

Цена — зрелость инженерной культуры. Недоделанные фичи попадают в main и прячутся за фиче-флагами (код в проде, но выключен конфигом); без сильного автотестирования и дисциплины trunk-based превращается в хаос. Зато именно эта модель коррелирует с элитными показателями DORA-метрик — исследования доставки ПО стабильно связывают короткоживущие ветки с высокой скоростью и стабильностью.

Где уместен: команды с развитым CI, быстрым ревью и автотестами; крупные инженерные организации (Google живёт на монорепе со стволом).

Как выбирать

Вопросы, решающие выбор:

  • Сколько версий поддерживаете одновременно? Несколько — Git Flow (или его release-часть). Одну, в проде всегда свежая — GitHub Flow / trunk-based.
  • Как часто деплоите? Релизные поезда раз в месяц терпят церемонии; деплой по многу раз в день требует лёгкой модели.
  • Насколько зрелы автотесты и ревью? Trunk-based без них опасен; GitHub Flow — рабочая середина.

И главное: модель — командное соглашение, а не догма. Реальные процессы часто гибридны («GitHub Flow плюс release-ветка перед мажорной версией») — важно, чтобы соглашение было явным и одинаково понималось всеми. Как ветвление стыкуется с конвейером доставки и версионированием — в статье про ветки и релизный цикл.

Коротко

  • Git Flow: main+develop+feature/release/hotfix — для параллельных версий и релизных поездов; для непрерывного деплоя избыточен.
  • GitHub Flow: один main + короткие ветки через PR — дефолт современных продуктовых команд.
  • Trunk-based: мини-порции в ствол + фиче-флаги — максимальная скорость при зрелых тестах и культуре.
  • Чем дольше ветка живёт в стороне от main, тем дороже слияние: отсюда и разница моделей.
  • Выбор определяют: число поддерживаемых версий, частота деплоя, зрелость автоматизации.
  • Модель — явное командное соглашение; гибриды нормальны.

Что почитать дальше