Git Flow -- стратегия ветвления

Git Flow — соглашение о структуре веток в репозитории: строго определённые роли для main, develop, feature/*, release/*, hotfix/*.

Зачем нужно

Без договорённости о ветках каждый разработчик называет и организует их по-своему — хаос. Git Flow даёт конкретные правила: где живёт стабильный код, где разработка, как создавать фичи и как выпускать релизы. Подходит для проектов с запланированными релизами (не continuous deployment).

Где используется

  • Продуктовые команды с регулярными релизами (раз в 1-2 недели)
  • Проекты, где нужно поддерживать несколько версий одновременно
  • Enterprise-разработка с длинными циклами тестирования

Основной контент

Структура веток

main ─────────────────────────────────── (только стабильный код, теги версий)
  │                            ↑
  └─── develop ────────────────┤──────── (интеграционная ветка)
            │       ↑          │
            │  feature/auth    │
            │  feature/cart    │
            │                  │
            └── release/1.2 ───┘
                     │
hotfix/1.1.1 ────────┘ (также мержится в develop)

Ветки и их роль

Ветка Назначение Откуда Куда
main Продакшн-код с тегами
develop Текущая разработка main main через release
feature/* Новая функциональность develop develop
release/* Подготовка к релизу develop main + develop
hotfix/* Срочный фикс в продакшне main main + develop

Пример: работа с фичей

# Начало фичи (от develop)
git switch develop
git pull origin develop
git switch -c feature/user-auth

# Разработка...
git add .
git commit -m "feat: добавить JWT авторизацию"

# Завершение фичи
git switch develop
git merge --no-ff feature/user-auth   # --no-ff сохраняет merge commit
git push origin develop
git branch -d feature/user-auth

Пример: релиз

# Создание релизной ветки
git switch develop
git switch -c release/1.2.0

# Только исправления багов, обновление версии
npm version minor   # или вручную в package.json
git commit -am "chore: версия 1.2.0"

# Финализация
git switch main
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "Release 1.2.0"

git switch develop
git merge --no-ff release/1.2.0
git branch -d release/1.2.0

Пример: hotfix

git switch main
git switch -c hotfix/1.1.1

# Фикс...
git commit -am "fix: критический баг с оплатой"

git switch main
git merge --no-ff hotfix/1.1.1
git tag -a v1.1.1 -m "Hotfix 1.1.1"

git switch develop
git merge --no-ff hotfix/1.1.1
git branch -d hotfix/1.1.1

Альтернативы Git Flow

  • GitHub Flow — проще: только main + feature ветки → PR → merge. Подходит для continuous deployment
  • Trunk-Based Development — все работают в main, фичи за feature flags. Для зрелых команд с хорошим CI

Частые ошибки

  • Мержить feature напрямую в main — минуя develop; релиз будет неполным
  • Коммитить новые фичи в release-ветку — только багфиксы; новые фичи ждут следующего цикла
  • Не тегировать релизы — теги в main — это версии; без них не откатиться к конкретному релизу

Связанные темы

Ресурсы