МенеджментБудь-який рівень

Git-стратегія гілкування

Git-стратегія гілкування — це домовленість про те, як команда розділяє роботу на гілки і як знову їх зводить. Вибір виглядає справою смаку, але нею не є: змінна, що передбачає біль, — скільки живе гілка до злиття, і кожна модель — це позиція щодо цього числа плюс правило, звідки беруться релізи й виправлення. Сторінка починається з шести моделей на одному екрані й п’яти питань, що обирають між ними; далі — час життя гілки, звідки взялася кожна модель і що її автори сказали згодом, релізні гілки й шлях виправлення, що робить короткі гілки можливими, merge проти rebase проти squash і де все це вироджується.

Що важливо
Час життя гілки
Висновок DORA
≤ 3 активні гілки, злиття щодня
Виправлення роблять
Спершу в main, потім cherry-pick

Шість моделей на одному екрані — і питання, що обирають

Більшість тих, хто шукає стратегії гілкування, хоче порівняння і спосіб обрати. Ось шість моделей, які вам трапляться, порівняні за чотирма речами, якими вони справді відрізняються: які гілки живуть довго, звідки береться реліз, де виправлення роблять спершу і скільки живе звичайна гілка.

МодельДовгоживучі гілкиРеліз береться зВиправлення спершу роблять уЗвичайна гілка живеПасує
1. Trunk-basedЛише mainmain або тег на ньомуmainГодини, менше дняОдна жива версія; швидкі тести, яким довіряють
2. Trunk із релізними гілками — Google, Release Flow у Microsoftmain; гілка на кожен реліз, яку ніколи не зливають назадРелізної гілкиmain, потім cherry-pick у релізну гілкуВід годин до дня-двохДеплої за розкладом; дві живі версії під час викочування
3. GitHub FlowЛише mainmain — сам GitHub деплоїть гілку ще до злиттяКоротка гілка від mainДень або кількаБільшість продуктових команд, з рев’ю кожної зміни
4. GitLab Flowmain плюс гілка на кожне середовище чи підтримувану версіюНижчої за течією гілкиmain, далі внизДень або кількаСередовища, що мають відставати одне від одного
5. GitFlowmain і develop; гілки release і hotfixРелізної гілки від develop, злитої в mainHotfix-гілці від main, злитій у main і developТижніВстановлюваний софт із кількома підтримуваними версіями
6. Дерева мейнтейнерів — LinuxДерево кожного мейнтейнера підсистеми; linux-next щодня зливає їх усіГоловної гілки (mainline) — після двотижневого вікна злиттяДереві підсистеми, потім у mainline, потім у стабільних ядрахОдин цикл релізу, два-три місяціТисячі учасників та ієрархія мейнтейнерів

Таблиця порівнює, а питання нижче — обирають. Відповідайте по черзі й зупиняйтеся на першій відповіді, що відкидає модель. Наступні розділи посилаються на них за номерами.

  1. 1.Скільки версій живе одночасно?

    1. Одна — модель 1 або 3; релізні гілки лише додали б cherry-pick
    2. Дві, недовго, поки триває викочування, — модель 2
    3. Кілька, місяцями, і кожну патчать, — модель 2 або 5, і спершу порахуйте ціну беквпортів
  2. 2.Чи можна задеплоїти `main` будь-якої миті?

    1. Так: тести йдуть хвилини, і їм вірять, — модель 1 вам доступна
    2. Ні — виправте тести, перш ніж міняти модель; довша гілка ховає ненадійний main, а не лікує його
  3. 3.Скільки pull request чекає на перше рев’ю?

    1. Години — гілки можуть бути короткими в будь-якій моделі
    2. День або більше — гілки будуть довгими в кожній моделі, хоч би що казала її схема
  4. 4.Чи мають середовища відставати одне від одного?

    1. Ні — деплойте з main
    2. Так — просувайте одну протестовану збірку крізь середовища; гілка на середовище, модель 4, — запасний варіант, коли збірку неможливо просунути
  5. 5.Чи затверджує реліз хтось поза командою — рев’ю в сторі, сертифікація?

    1. Ні — релізьте з main або з тегу
    2. Так — відгалужуйте релізну гілку в момент затвердження, а кожне виправлення робіть спершу в main

Час життя гілки — це і є вся суть

Гілка — це ставка на те, що решта кодової бази не зміниться так, щоб конфліктувати з вашою роботою. Ця ставка дешева на день і дорога на місяць, бо ризик конфлікту зростає і з розміром вашої зміни, і з кількістю змін, які всі інші вливають, поки вас немає.

Усі три моделі намальовані в одному масштабі, тож видно єдину різницю — як далеко гілка встигає відійти до повернення в main. Trunk-based повертається за день, GitHub Flow за кілька днів, GitFlow за тижні — і ризик конфлікту зростає разом із цією відстанню.

Пастка в тому, що витрата невидима, поки накопичується. Гілка, відкрита три тижні, кожен із цих днів відчувається продуктивною; ціна приходить одразу при злитті — як розв’язання конфліктів, якого ніхто не оцінював, і регресія, якої ніхто не передбачав. Арифметика для команди з восьми людей, що вливає в main близько п’ятнадцяти змін на день, показує, як швидко вона зростає.

Гілка відкритаВлилося в main за цей часЯке на відчуття злиття
Чотири години≈ 3 зміниRebase, що лягає чисто
Два дні≈ 30 змінКонфлікт-другий, які розв’язує автор, що ще пам’ятає обидві сторони
Два тижні≈ 150 змінЗлиття, якому потрібне окреме рев’ю, і регресія, знайдена після нього
Два місяці≈ 600 змінОкремий проєкт; часто його переписують, а не зливають

Джез Гамбл перетворив це на тест із трьох питань, який Мартін Фаулер опублікував у січні 2017 року. Чи кожен член команди щонайменше раз на день пушить у спільну головну гілку? Чи кожен такий коміт запускає автоматичну збірку й тести? Коли збірка ламається, чи зазвичай вона знову зелена за десять хвилин? Команда, що відповідає «ні» на перше, не практикує безперервну інтеграцію, хоч як називається її пайплайн.

Дослідження 2016 і 2017 років дали цьому числа. Команди з вищими показниками поставки мали три чи менше активних гілок у репозиторії застосунку, зливали гілки в транк щонайменше раз на день і не мали ні заморозок коду, ні окремих фаз інтеграції. Перешкоди, які називає DORA, — ті самі, до яких повертається ця сторінка: рев’ю, що потребує кількох затверджень, асинхронне рев’ю, через яке гілки чекають, і тести, які не запускають перед комітом.

Звідки взялася кожна модель — і що її автори сказали згодом

Моделі гілкування зазвичай викладають як позачасові патерни. Кожну написала певна команда для певної ситуації, і троє авторів згодом письмово сказали, де їхня модель перестає пасувати. Шість епізодів, по черзі.

Linux, 2005 і 2008 — багато гілок, що зливаються щодня

Лінус Торвальдс написав Git у квітні 2005 року для ядра Linux, і процес ядра — найстаріша модель тут. Кожна підсистема має мейнтейнера з власним деревом. Цикл релізу відкривається вікном злиття (merge window) приблизно на два тижні, протягом якого Торвальдс затягує дерева мейнтейнерів у головну гілку. Після нього приймають лише виправлення. Кандидати в реліз виходять приблизно щотижня, зазвичай до -rc6–-rc9, а нове ядро виходить кожні два-три місяці з приблизно 13 000 наборів змін.

Дерева, що живуть місяцями, самі по собі були б пеклом інтеграції. Запобігає цьому linux-next, який Стівен Ротвелл запустив у лютому 2008 року. Щоробочого дня він зливає всі дерева підсистем разом, збирає результат і публікує його, тож конфлікти між деревами спливають за тижні до вікна злиття. Урок той самий, до якого раз у раз повертається ця сторінка: важить не те, скільки існує гілок, а те, як часто вони зустрічаються.

GitFlow, 2010 — і примітка автора 2020 року

Вінсент Дріссен опублікував «A successful Git branching model» 5 січня 2010 року. У моделі дві постійні гілки: main (тоді master), що завжди відображає production, і develop, куди інтегрують завершену роботу. Фіче-гілки відходять від develop і повертаються в неї. Релізна гілка відходить від develop, поки готують реліз, і зливається і в main, і в develop. Hotfix-гілка відходить від main і зливається в обидві — або в релізну гілку, якщо та на цей момент існує. Кожне злиття робиться з --no-ff, тож кожна фіча лишається видимою як група комітів.

5 березня 2020 року Дріссен додав на початок допису примітку-рефлексію. Коротко: модель писали для софту з явними версіями, вебзастосунки з безперервною поставкою стали звичним випадком, і для них він радив би простіший процес, як-от GitHub Flow. Модель ніколи не була хибною. Вона відповідала на питання команди, що випускає версію 2.4, підтримуючи 2.3, — а більшість команд, які її взяли, такого питання не мали.

GitHub Flow, 2011 — а потім деплой до злиття

Скотт Чейкон описав власний процес GitHub 31 серпня 2011 року — як реакцію на те, що GitFlow завеликий для більшості команд. У ньому шість правил. Усе в main придатне до деплою. Нова робота йде в гілку від main з описовою назвою. Регулярно пушіть цю гілку на сервер. Відкривайте pull request, коли потрібен відгук або робота здається готовою. Зливайте лише після того, як хтось переглянув зміну. Деплойте одразу після злиття. Тоді GitHub деплоїв близько двох десятків разів за звичайний день.

До 2015 року GitHub поміняв два останні правила для власного сайту. Аман Гупта описав це в червні 2015-го: новий код деплоять із гілки pull request, а зливають лише після того, як його підтверджено в production. Якщо деплой гілки пішов погано, відкат — знову задеплоїти main, який завжди справний, бо нічого неперевіреного туди не потрапляє. Документація Microsoft називає ціну: кожен pull request чекає в черзі на деплой, і вона стає вузьким місцем, щойно на день припадають сотні pull request.

GitLab Flow, 2014 — і вихід із документації 2023 року

Сітсе Сейбранді, співзасновник GitLab, запропонував GitLab Flow 29 вересня 2014 року для команд, яким GitHub Flow не пасує, бо деплой — це не злиття. Модель додає гілки нижче за течією: по одній на середовище, як-от і production, або на кожну підтримувану версію. Коміти течуть лише вниз, тож кожен рядок тестують у кожному середовищі, перш ніж він дійде до наступного. Для виправлень модель формулює правило, яке радить і ця сторінка; GitLab назвав його «upstream first» і послався на Google і Red Hat: злийте в main, потім зробіть cherry-pick у релізну гілку.

2023 року GitLab вилучив сторінку GitLab Flow зі своєї документації продукту: у версії 16.0 вона стала загальним вступом до Git-процесів, а з 16.4 перенаправляє на допис у блозі. Ідея живе, але гілки середовищ мають слабкість, на якій оригінал не зупинявся. Збірка, яку деплоять у production, — не та, яку тестували на staging, а свіжа збірка злиття. Тому питання 4.2 віддає перевагу просуванню однієї протестованої збірки із середовища в середовище на одній гілці.

Google, 2016 — один транк на 25 000 інженерів

У липні 2016 року Рейчел Потвін і Джош Левенберг описали репозиторій Google у Communications of the ACM: один репозиторій на приблизно два мільярди рядків коду й 35 мільйонів комітів, яким користуються понад 25 000 інженерів. Розробка в гілках там незвична й погано підтримана. Новий і старий шляхи коду живуть поруч за умовними прапорцями. Релізи відгалужують від обраної ревізії, а виправлення роблять у головній гілці й потім переносять у релізну через cherry-pick. Це найсильніший доказ, що trunk-based development масштабується: інструменти довелося будувати під нього, але модель гілкування з розміром не змінилася.

Microsoft, 2018 — Release Flow

Едвард Томсон описав модель команди Azure DevOps у квітні 2018 року й назвав її Release Flow. Розробники працюють у коротких тематичних гілках, які зливають у main через pull request, і найзавантаженіші репозиторії приймають понад 200 pull request на день. main ніколи не деплоять напряму. Наприкінці кожного тритижневого спринту відгалужують релізну гілку — на спринті 129 це releases/M129, — і деплоять саме її. Релізні гілки ніколи не зливають назад у main.

Hotfix завжди починається в main, а потім його переносять у релізну гілку через cherry-pick просто зі сторінки pull request. Документація Microsoft пояснює причину реченням, яке варто повісити на стіну: виправити релізну гілку, не перенісши зміну в main, означає, що баг повернеться з наступним деплоєм, а про main легко забути в стресі аварії. Під час викочування кільце за кільцем у production одночасно дві релізні гілки, тож виправлення в цей період іде в обидві.

Релізні гілки — і в який бік рухається виправлення

Релізна гілка існує з однієї причини: дати main рухатися далі, поки одну версію стабілізують, випускають і патчать. Усе інше в ній випливає з одного рішення — де виправлення роблять спершу. Дві відповіді дають дуже різні збої.

Той самий баг, виправлений у двох порядках. Зроблене спершу в main і перенесене в релізну гілку через cherry-pick, виправлення є в кожному релізі, відгалуженому після того. Зроблене спершу в релізній гілці, воно залежить від злиття назад, про яке легко забути під час інциденту, — і якщо забули, наступний реліз знову виходить із багом.
ШляхЯк працюєЩо йде не такХто ним користується
Upstream firstВиправити в main разом із тестом, потім cherry-pick у кожну релізну гілкуВиправлення, що не лягає чисто на старішу гілку, доводиться там перероблятиGoogle, Release Flow у Microsoft, GitLab Flow, стабільні ядра Linux
Спершу реліз, потім злиття назадВиправити в релізній чи hotfix-гілці, потім злити в main і developПро злиття назад під тиском забувають, і баг повертається в наступному релізіGitFlow

Upstream first має один чесний виняток. Іноді баг неможливо відтворити в main, бо код там уже змінився. Тоді виправлення роблять у релізній гілці й записують, чому воно не дійшло до main, — бо main воно не потрібне. Усе інше йде спершу в main.

Ціна підтримуваних версій

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

Підтримуваних версійОдне термінове виправлення безпеки означає
1Одну зміну, один прогін пайплайна, один реліз
2Одне виправлення, один cherry-pick, два прогони тестів, два релізи
4Одне виправлення й три cherry-pick — хоча б один не ляже чисто на код, старший на два роки, — далі чотири прогони тестів і чотири релізи

Ось чому проєкти, що підтримують кілька версій, публікують, скільки саме і як довго. Node.js, Java і ядро Linux називають свої лінії і дати їхнього завершення. Команда з трьома клієнтами на трьох версіях має ту саму проблему без політики — і зазвичай дізнається про це під час інциденту.

Що робить короткі гілки можливими

Команди рідко обирають довгі гілки навмисно. Вони опиняються з ними, бо щось робить раннє злиття неможливим, а винною призначають модель. Справжньою причиною зазвичай є одна з чотирьох речей, і питання 3 стосується першої.

Затримка рев’ю і розмір зміни

Якщо pull request чекає на рев’юера півтора дня, ніхто не відкриває маленьких: вартість одного оберту фіксована, тож раціонально запхати в кожен більше. Від цього рев’ю стають більшими, а отже повільнішими, а отже пакувати стає ще вигідніше. Петля сама себе підсилює, і це найпоширеніша причина, чому команді не вдається скоротити життя гілки.

Повільне рев’ю і великі pull request живлять одне одного. Коли рев’ю триває півтора дня, раціонально класти в кожен pull request більше; за більші pull request беруться пізніше, і вони тривають довше; чекання зростає. Петлю розривають два командні правила — час відповіді на рев’ю, виміряний у годинах, і розмір, за якого рев’юер може попросити поділити зміну.

Найкращі опубліковані дані про те, як виглядає швидке рев’ю, — від Google. Його дослідження 2018 року на приблизно дев’яти мільйонах переглянутих змін показало медіанне очікування першого відгуку менше години для малих змін і близько п’яти годин для дуже великих, а для всього рев’ю — медіану менше чотирьох годин. Менше чверті рев’ю мали більше ніж одного затверджувача. Швидкість і розмір — це один висновок, а не два.

Виправлення непоказні: заявлене очікування щодо часу відповіді на рев’ю, виміряне в годинах; розмір, за якого рев’юер має право попросити поділити зміну; і парна чи ансамблева робота для змін, які інакше були б завеликими для рев’ю взагалі. Trunk-based development не скасовує рев’ю. Він його переміщує: або в парну роботу в реальному часі, або в рев’ю, достатньо швидке, щоб процес не вигинався навколо нього.

Незавершена робота за прапорцем

Гілка часто лишається відкритою просто тому, що фіча не дороблена, а половини фічі в main ніхто не хоче. Відповідь — : код зливають щодня, і він лишається вимкненим, доки не буде завершений. Ціна — сам прапорець, який треба прибрати, щойно фічу повністю ввімкнено; сторінка про планування релізу описує чотири види прапорців і скільки має жити кожен.

Великі зміни без великих гілок

Звичне заперечення проти коротких гілок — великий рефакторинг: заміна платіжного провайдера, зміна , перебудова модуля. Відповідь на нього — branch by abstraction; назву техніці дав Пол Геммант у квітні 2007 року. Поставте інтерфейс перед тим, що замінюєте. Переводьте на нього викликачів, по одному злиттю за раз. Збудуйте за ним нову реалізацію, перемкніться, потім видаліть стару. Кожен крок — мала зміна, яку можна злити окремо, і кодову базу можна випустити на будь-якому з них.

Як тримати main зеленим, коли зливають багато людей

Короткі гілки породжують нову проблему. Два pull request можуть кожен пройти свої перевірки й однаково разом зламати main, бо жоден не тестували з іншим. Ґрейдон Гоар, творець Rust, назвав відповідь «правилом не ракетної науки»: автоматично тримати репозиторій коду, що завжди проходить усі свої тести, — перевіряючи кожну зміну злитою з поточним main, перш ніж вона туди потрапить. Саме це робить merge queue. У GitHub черга злиття стала загальнодоступною в липні 2023 року, а в GitLab те саме зветься merge trains.

Merge, rebase чи squash

Ця суперечка з’їдає більше енергії команди, ніж заслуговує. Усі три способи кладуть у main той самий код; відрізняється історія, яка лишається після них, і те, що ця історія ще зможе розповісти через рік.

Merge, rebase і squash кладуть у main однаковий код і лишають різну історію. Merge-коміт зберігає обидві лінії рівно такими, як вони були; rebase переграє коміти в пряму лінію з новими ідентифікаторами; squash лишає один коміт на гілку. Жоден із них не змінює результатів поставки, тож оберіть один, запишіть і ніколи не переписуйте гілку, на якій будує хтось інший.
СпосібІсторія main після ньогоЗберігаєВтрачаєБезпечний, коли
Merge-комітОбидві лінії, з’єднані merge-комітомРівно те, що сталося, і колиЧитабельність на активному репозиторіїЗавжди
Rebase, потім fast-forwardПряма лінія, коміти гілки зверхуКожен коміт — переписанимПочаткові ідентифікатори комітів і основу, на якій кожен писалиГілка тільки ваша
SquashОдин коміт на гілкуОдну зміну на одиницю роботи, яку легко скасуватиПроміжні крокиГілки короткі, і кожна — одна ідея

Жоден із трьох помітно не впливає на результати поставки: оберіть один, запишіть і припиніть обговорення. Одну практичну різницю варто знати. git bisect знаходить коміт, що щось зламав, ділячи історію навпіл, і працює найкраще, коли кожен коміт у main збирається й проходить тести. Squash і merge queue обидва це гарантують. Rebase двадцяти проміжних комітів — ні.

Що справді важить — правило, з яким погоджуються без суперечок: ніколи не переписуйте історію гілки, на якій хтось інший уже збудував свою роботу. Переписати власну гілку до рев’ю — нормально. Якщо після цього доводиться робити force-push, використовуйте git push --force-with-lease: він відмовить, якщо тим часом хтось інший запушив. Переписування спільної гілки ламає всіх, хто на ній будував, і, на відміну від естетичного питання, це не справа смаку.

Як це виявляється в реальній поставці — і де вироджується

Стратегія гілкування — це місце, де командний процес зустрічається з інженерною практикою, і вона безжально оголює прогалини в останній. Команда не перейде на короткі гілки, якщо її тести йдуть сорок хвилин і нестабільні: ніхто не зливатиме шість разів на день у сигнал, якому не довіряє. Модель гілкування зазвичай є симптомом; причина зазвичай у тестах.

Де вона вироджується

  • Фіче-гілка, відкрита місяць, — злиття стає окремим проєктом.
  • GitFlow, узятий для вебзастосунку з однією живою версією, додає церемонію, що нікому не служить, — його автор сказав це 2020 року.
  • Гілка develop перед main — кожну зміну інтегрують двічі.
  • Гілка на кожного розробника перетворює інтеграцію на періодичні перемовини.
  • Хотфікс, застосований до релізної гілки й не влитий назад, повертається багом.
  • Гілки середовищ, що перезбирають код для кожного середовища, — і production запускає збірку, яку ніхто не тестував.
  • Релізні гілки, яких тримають живими довго після того, як їхня версія пішла з production.
  • Короткі гілки без прапорців — недороблене або зливають зламаним, або тримають осторонь.
  • Переписування історії спільної гілки ламає всіх, хто збудував на ній роботу.

Коли це застосовувати

Застосовуйте, коли

  • Обирайте trunk-based, коли в production рівно одна версія, а тести швидкі й надійні.
  • Обирайте GitHub Flow як розумний стандарт для продуктової команди, що рев’юїть кожну зміну.
  • Додавайте релізні гілки з правилом upstream first, коли деплої йдуть за розкладом або кожен реліз затверджує стор чи сертифікатор.
  • Обирайте GitFlow, коли кілька випущених версій треба підтримувати й патчити паралельно.
  • Поєднуйте короткі гілки з прапорцями, щоб недороблене можна було безпечно злити.

Уникайте, коли

  • Переходити на trunk-based, доки тести повільні чи нестабільні, — спершу виправте це.
  • Брати GitFlow тому, що він звичний, а не тому, що ви випускаєте версії.
  • Додавати типи гілок, щоб розв’язати проблему рев’ю чи власності, — це виправлення процесу, а не Git.
  • Підтримувати більше випущених версій, ніж витягує реальна робота з беквпортів.
  • Міняти модель, не змінюючи того, що робило стару болісною.

Джерела й метод

На чому стоїть ця стаття

  • 17 джерел
  • Перевірено 12 жовтня 2026 р.

Дослідження з Claude. Пошук і звірку першоджерел зроблено з Claude (Anthropic). Відбір, текст і перевірку фактів — редакція Anatomy of IT Product.

Було корисно?

Поділіться з тим, хто працює над тією ж задачею.