team workflow / git branching

Git Flow:
фіча їде в реліз сама,
а не разом із усім dev

Як ми працюємо з гілками: dev — пісочниця, у release потрапляють тільки готові feature-гілки, деплой запускається тегом, а QA тестує конкретну версію. Нижче — навіщо це і як саме працює.

01 / ЩО БУЛО НЕ ТАК

Старий flow тягнув у прод чужий незавершений код

Раніше ланцюжок був лінійний: feature → dev → release → prod. Кожен наступний крок — мерж усієї попередньої гілки. Це означає: мержачи dev у release, ти береш не свою фічу, а весь поточний стан dev — включно з тим, що туди поклали інші й ще не доробили.

feature-гілки dev release → prod готова фіча незавершена фіча мерж усього dev ⚠ чужий незавершений код у release → prod
Мерж «гілка в гілку цілком» переносить і готове, і неготове — без розбору
Реальний кейс

Даніш почав CEX-адаптер, але не зміг дотестувати — клієнт не видав API keys. Його незавершені зміни лишилися в dev. Сашко зробив DEX-адаптери, протестував свої зміни на кожному етапі й помержив dev → release → prod. Разом із його кодом у прод поїхав і недороблений CEX-адаптер — хоча його ніхто туди не відправляв свідомо.

02 / ГОЛОВНА ІДЕЯ

dev — пісочниця. Джерело релізу — feature-гілка

Одне речення

У release мержиться не dev, а конкретна feature-гілка. dev існує лише щоб погратись/потестувати — з нього зазвичай нічого нікуди не їде.

Кожна фіча живе у своїй гілці від початку до самого релізу. Хочеш перевірити на дев-стенді — мержиш фічу в dev. Готовий релізитись — мержиш ту саму фічу в release. Два незалежні маршрути з одного джерела:

feature/danish- cex-adapter feature/sasha- dex-adapters dev (sandbox) release тест на dev — ок ⛔ у release не йде: фіча ще не готова готово ✓ мерж самої фічі з dev далі нічого не їде ∅ → tag → QA → main/prod
Незавершена фіча Даніша спокійно живе у своїй гілці та в dev — release її «не бачить»
feature/danish-cex-adapter feature/sasha-dex-adapters dev (sandbox) release tag = деплой
03 / ШЛЯХ ФІЧІ КРОК ЗА КРОКОМ

Від першого коміту до проду

Створюєш feature-гілку

Нова фіча = нова гілка. Вся робота — тільки в ній.

git checkout -b feature/sasha-dex-adapters

Хочеш потестити на дев-стенді? Мерж у dev

dev — спільна пісочниця: інтеграції, ручні перевірки, експерименти. Це необов'язковий крок і він ні до чого не зобов'язує — фіча в dev ≠ фіча в релізі.

feature/sasha-dex-adapters → dev

Фіча готова? Мерж саму фічу в release

Ключовий момент: у release їде тільки твоя feature-гілка, а не dev. Що лежить у dev — release не стосується.

feature/sasha-dex-adapters → release

Ставимо tag — і тільки тоді деплой

Мерж у release сам по собі нічого не деплоїть. Кілька девів можуть змержити свої фічі. Коли стан стабільний — ставимо tag, і деплоїться саме цей коміт.

git tag v1.1.0-three-new-adapters

QA тестує конкретну версію

Не «поточний стан гілки», а зафіксований tag. Усі знають, що саме перевіряється, і гілка може жити далі, не ламаючи тестування.

QA апрувнув — мерж release у main/prod

У прод потрапляє рівно той код, який пройшов QA. Знайшли баг? Фікс у тій самій feature-гілці (або окремій fix-гілці) → знову в release → новий tag → QA тестує нову версію.

feature branch release tag v1.1.0 = деплой QA тестує саме цей tag main / prod баг? → фікс у feature/fix-гілці → знову в release → новий tag
Основний пайплайн релізу + цикл виправлення багів
04 / ДЕПЛОЙ ЧЕРЕЗ TAG

Мерж ≠ деплой. Деплой = tag

Пуш чи мерж у release не запускає деплой автоматично. Це дає свободу: кілька людей спокійно мержать свої фічі, а деплой стається один раз — коли команда свідомо фіксує стабільний стан тегом.

release фіча A деплою немає фіча B деплою немає фікс C tag v1.1.0 → 🚀 деплой
Деплоїться рівно той коміт, на якому стоїть tag — ні раніше, ні «щось приблизно таке»

Іменування тегів

Версія + людська назва, щоб одразу було видно, що в релізі:

v1.1.0-whitebit-adapter  v1.1.0-three-new-adapters

05 / ЯК ОНОВЛЮВАТИ DEV

dev підтягуємо з release, а не навпаки

Код тече тільки вниз: release → dev. Після кожного релізу (або просто регулярно) мержимо release у dev — так пісочниця завжди містить актуальний продовий код, і фічі тестуються на свіжій базі, а не на застарілій.

git checkout dev && git merge release

release dev (sandbox) tag v1.1.0 (реліз) ↓ синхронізація після релізу — ок ⛔ вгору — ні
Односторонній потік: release → dev. Зворотного мержа немає — це і захищає release від сміття

Коли dev «забруднився» — перестворюємо

dev — пісочниця, тому з часом у ньому накопичуються покинуті експерименти та фічі, які так і не доїхали до релізу. Це нормально. Коли сміття заважає (конфлікти при мержах, стенд поводиться не як прод) — dev просто перестворюємо з release:

git checkout release && git branch -f dev && git push --force origin dev

Важливо

Перестворення dev — це force-push спільної гілки: спершу попередь команду. Нічиї напрацювання при цьому не губляться — вся робота живе у feature-гілках, і потрібні фічі просто мержаться в свіжий dev заново.

06 / ПРАВИЛА

Можна / не можна

Робимо так

  • Нова фіча — нова feature/* гілка
  • Мержимо фічу в dev, щоб потестити на стенді
  • Готову фічу мержимо з feature-гілки в release
  • Доробки — у ту саму feature-гілку, потім знову в release
  • Перед повторним мержем підтягуємо актуальний release у фічу, вирішуємо конфлікти
  • Деплоїмо тільки через tag на коміті в release
  • Після релізу синхронізуємо: мерж release → dev
  • Забруднився dev — перестворюємо його з release (попередивши команду)
  • QA апрувнув tag → мержимо release у main

Так не робимо

  • Не мержимо dev → release (головне правило; винятки — лише свідомі й рідкісні)
  • Не мержимо в release фічі, які не готові («ще без API keys» = не готова)
  • Не деплоїмо «просто запушив у release» — без tag деплою немає
  • Не тестуємо «поточний стан гілки» — QA працює з конкретним tag
  • Не фіксимо баги прямо в release в обхід feature/fix-гілки
Що це дає

Неготовий код фізично не може «випадково поїхати» в прод: він живе у своїй гілці, поки автор сам не змержить його в release. Кожен реліз — це свідомий набір конкретних фіч + зафіксована тегом версія, яку перевірив QA.

07 / ШПАРГАЛКА

Хто є хто

Гілка / штукаРольЗвідки приходить кодКуди йде далі
feature/* Вся робота над фічею, від першого коміту до фіксів після QA відгалужується від актуального коду → dev (тест), → release (реліз)
dev Пісочниця: інтеграції, експерименти, ручні тести на стенді будь-які feature-гілки + release (синхронізація вниз) зазвичай нікуди — глухий кут за дизайном
release Кандидат у прод: тільки свідомо вибрані готові фічі конкретні feature/fix-гілки → tag → QA → main
tag Зафіксована версія. Створення tag = запуск деплою ставиться на коміт у release деплой → QA тестує цю версію
main / prod Те, що реально працює в проді release після апруву QA