Skip to main content

Стратегії гілкування Git (Git Flow, GitHub Flow)?

Стратегії гілкування Git (branching strategies) визначають правила створення, злиття та видалення гілок, щоб команда координувала розробку без поломок у продакшені.

Теорія

TL;DR

  • Git Flow: конвеєр на заводі з окремими станціями для функцій, тестування та виправлень. GitHub Flow: фуд-трак, де готують і одразу подають.
  • Головне розходження: Git Flow тримає довгоживучу гілку develop як точку інтеграції перед продакшеном. GitHub Flow не має develop і зливає напряму в main.
  • Заплановані версійні релізи (десктоп, гра)? Git Flow. Безперервний деплой вебзастосунку? GitHub Flow.
  • Команда 10+ з квартальними релізами: Git Flow. Команда 1-10 з щоденними деплоями: GitHub Flow.

Швидкий приклад

bash
# GitHub Flow: один короткий цикл, main залишається deployable git checkout main git pull origin main # завжди стартуй з актуального стану git checkout -b feature/user-login # короткоживуча гілка git add . && git commit -m "Add login form" git push origin feature/user-login # відкрити PR, ревʼю, злити в main, видалити гілку git branch -d feature/user-login # main готова до деплою прямо зараз

Одна гілка. Один PR. Main отримала зміни і готова до деплою в той самий день.

Ключова різниця

Git Flow тримає гілку develop як постійну точку інтеграції. Функції потрапляють спочатку в develop. Потім гілка release/* готує продакшн-код. Лише після цього main отримує версійний тег, наприклад v1.2. GitHub Flow прибирає develop повністю: гілкуєшся від main, відкриваєш PR, зливаєш назад у main після апруву. Ось і вся структурна різниця. Git Flow важчий, але передбачуваний для команд з фіксованими датами релізів. GitHub Flow швидший для тих, хто деплоїть після кожного ревʼю.

Коли що застосовувати

  • Мобільні або десктопні застосунки з квартальними релізами: Git Flow чисто вирішує версіонування.
  • Вебзастосунки або SaaS з щоденними деплоями: GitHub Flow знімає накладні витрати на гілки.
  • Соло або маленькі команди (1-5 осіб): GitHub Flow, без зайвого процесу.
  • Великі компанії з комплаєнс-аудитами: Git Flow дає чіткий поділ між продакшном і стейджингом.
  • Монорепозиторії з мікросервісами: GitHub Flow з тегами і вибірковими CI-задачами на сервіс.

Таблиця порівняння

АспектGit FlowGitHub Flow
Гілкиmain, develop, feature/, release/, hotfix/*main, feature/* (короткоживучі)
Цикл релізівЗаплановані (v1.2 через release-гілку)Безперервні (злиття в main = деплой)
Розмір командиСередня-велика (10+ дев)Мала-agile (1-10 дев)
Інструментиgit-flow розширенняGitHub PRs + CI/CD
Частота злиттяНизька (функції збираються в develop)Висока (щоденні PR в main)
Для чогоElectron, ігри, Chrome ExtensionsNext.js на Vercel, VS Code open-source

Як Git відстежує гілки всередині

Git зберігає кожну гілку як легкий покажчик на коміт (SHA-1 хеш). Створення feature/login це просто запис невеликого файлу в .git/refs/heads/. Код не копіюється. При злитті Git знаходить спільного предка через git merge-base і накладає різницю або як fast-forward, або як merge commit. Git Flow додає CLI-скрипти (git flow feature start), які автоматизують створення гілок від develop. GitHub Flow обходиться без них і використовує PR-рушій GitHub, що виконує three-way merge на сервері.

Коли я вперше провів hotfix через повний Git Flow, автоматичний зворотний злив у develop врятував виправлення, яке інакше загубилось би в наступному релізному циклі. Але більшість вебкоманд, з якими я працював відтоді, використовують GitHub Flow і вирішують той самий граничний випадок через feature flags.

Типові помилки

Злиття feature напряму в main у Git Flow

bash
git checkout feature/add-api # гілка від develop git checkout main git merge feature/add-api # пропускає develop, ламає інтеграцію

develop існує, щоб ловити інтеграційні баги до того, як вони потраплять у main. Пропустити цей крок означає зламати всю модель. Виправлення: git flow feature finish add-api зіллє в develop автоматично.

Тримати feature-гілки занадто довго в GitHub Flow

bash
git checkout -b feature/epic # створено три тижні тому git merge main # вибух конфліктів злиття

GitHub Flow вимагає коротких гілок (1-3 дні). Якщо функція займає тижні, розбий її на менші PR або сховай незавершену роботу за feature flags. Виправлення: git rebase main щодня.

Пропустити --no-ff при зливанні hotfix і release у Git Flow

bash
git merge release/v1.0 # fast-forward стирає крок релізу з історії

Без --no-ff історія виглядає лінійною і ти втрачаєш audit trail. Виправлення: git merge --no-ff release/v1.0.

Не видаляти злиті гілки

Мертві гілки накопичуються швидко. Через рік репозиторій може мати тисячі застарілих refs. Виправлення: увімкни автовидалення в налаштуваннях GitHub PR і регулярно запускай git remote prune origin.

Де це зустрічається в реальних проектах

  • React: GitHub Flow. Функції гілкуються від main, PR з CI-перевірками.
  • VS Code: GitHub Flow. Щоденні деплої main в Insiders build.
  • Linux kernel: варіант Git Flow. mainline виконує роль develop, stable/* як release-гілки.
  • Electron: Git Flow для версійних релізів на кшталт v25.0.0.
  • Kubernetes: trunk-based development (гілки живуть менше дня).

Питання на співбесіді

Q: Як провести hotfix у Git Flow?
A: Гілкуйся від main командою git flow hotfix start fix-crash. Вноси виправлення. Запускай git flow hotfix finish fix-crash. Це автоматично зіллє в main (з тегом v1.2.1) і в develop, щоб виправлення не загубилось у наступному циклі.

Q: Чому не використовувати GitHub Flow завжди?
A: Немає проміжного буфера для великих релізів. Без develop поганий злив може зламати main до того, як CI це спіймає. Git Flow дає місце для ловлі інтеграційних багів до продакшену.

Q: Як версіонувати релізи в GitHub Flow?
A: Злий у main і одразу створи git tag (v1.2). CI/CD підхопить тег і задеплоїть той конкретний коміт. Семантичне версіонування залишається, просто без окремої release-гілки.

Q: Що таке GitLab Flow і чим він відрізняється?
A: GitLab Flow додає environment-гілки типу staging і production між feature-гілками та main. Git Flow натомість використовує release-гілки, прив'язані до номерів версій. Різні моделі мислення, схожа мета.

Q: (Senior) Як GitHub Flow масштабується в монорепозиторії з 50 сервісами без поломки деплоїв?
A: Path filters у CI (changed-files: ['services/auth/**']) запускають лише потрібні задачі. Canary deploys і feature flags дозволяють зливати незавершений код без впливу на користувачів. Кожен сервіс отримує власний тег версії.

Приклади

Базовий: створення та злиття feature-гілки (GitHub Flow)

bash
git checkout main git pull origin main git checkout -b feature/use-auth-hook # src/hooks/useAuth.js # export const useAuth = () => { ... перевіряє токен у localStorage ... } git add src/hooks/useAuth.js git commit -m "Add useAuth hook with token check" git push origin feature/use-auth-hook # відкрити PR, 2 ревʼювери схвалюють # auto-merge в main, CI проходить тести # Vercel підхоплює main і деплоїть git branch -d feature/use-auth-hook

PR відкрито, розглянуто, злито і задеплоєно в той самий день. Main жодного разу не була в нестабільному стані.

Просунутий: hotfix у Git Flow зі зворотним зливом у develop

bash
# Краш у продакшені під час підготовки release/v1.2 git checkout main git checkout -b hotfix/critical-crash # гілка від main, не від develop # виправити краш git add . && git commit -m "Fix null pointer in auth handler" git checkout main git merge --no-ff hotfix/critical-crash git tag -a v1.2.1 -m "Hotfix: null pointer in auth" git checkout develop git merge --no-ff hotfix/critical-crash # backport, щоб виправлення потрапило в наступний реліз git branch -d hotfix/critical-crash

main отримує тег v1.2.1 і деплоїться. develop також має виправлення, тому наступний запланований реліз не поверне цей баг.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.