Git-flow і master з кількома паралельними гілками звільнення


86

Ми намагаємось прийняти успішну модель розгалуження Git, реалізовану git-flow. Зараз ми працюємо щонайменше над двома гілками випусків, однією для останнього стабільного випуску та іншою для наступної (попереднього перегляду) випуску. Я не розумію, чому всі випуски, здається, "лінеаризовані" для майстра і позначені там. Чому б не позначити випуски у своїх гілках випусків? Чому взагалі майстер ? Або чому розвивати гілку, а не використовувати master для неї?

Відповіді:


77

У моделі git-flow ваша "остання випущена" версія насправді зіставляється з master, а ваша "попередній випуск" - у releaseгілку git-flow . Він розгалужується developі, нарешті, зливається, masterколи відбувається фактичний випуск. Тоді це стане вашим "останнім випуском", і ви, як правило, виправляєте лише помилки цього випуску, використовуючи hotfixгілки git-flow . Таким чином, ви masterзавжди представляєте найбільш стабільний стан останньої випущеної версії.

Якщо ви хочете виправити помилки для старих випусків або зробити будь-яку іншу розробку там, ви розщепите supportгілку з відповідного коміту master(у вас будуть всі коли-небудь створені там версії). supportгілки все ще експериментальні ( згідно з документами ) і недостатньо добре задокументовані. Але, як ви можете бачити з довідки командного рядка:

usage: git flow support [list] [-v]
       git flow support start [-F] <version> <base>

ці гілки тільки розпочато і не призначені для об’єднання назад masterні до develop. Зазвичай це нормально, оскільки виправлення "старовинних" випусків або функцій, які замовники запрошують реалізовувати у "старовинних" випусках, не можуть або не повинні повертатися master. Якщо ви все ще думаєте, ви хочете перенести виправлення на основну лінію розробки (представлене символом masterі develop), просто запустіть a hotfix, вибирайте зміни та закінчуйте hotfix.


17
Це не стосується повільного конвеєра від тесту до контролю якості до виробництва. Може існувати дві (а то й більше, але скажімо просто дві) гілки випуску відкритими, кожна з яких знаходиться на різній стадії цього конвеєру, і кожна з них повинна дозволити виправлення помилок, знайдених у тесті. Тоді гілка розробника буде там, де накопичуються функції для випуску, гілка якого ще не зроблена. У такій ситуації виправлення випуску n-2 врешті-решт буде об'єднано для розробки, але пропустить випуск n-1, принаймні, дотримуючись стандартного потоку git. Це призвело б до регресу на n-1, фіксованого врешті-решт на звільнення n
Брендан

Чому б не зберегти гілки випуску, а коли створено новіші гілки випуску, старіші перетворюються на гілки "підтримки"?
lkanab

1
Чому випуски гілок «розгалужуються» від прояву, а не просто «відгалужуються» від розробки?
Сандра К

gitflow-avh виглядає як підтримувана (тобто не мертва) вилка вихідного gitflow. git flow supportне позначено експериментальним.
Тімо Верховен

9

Схоже, в основному це ментальна модель з трохи надто великим акцентом на галузях. Я згоден, ви можете просто позначати коміти, які ви звільняєте, замість того, щоб об'єднувати їх назад у master.

Хоча картинка досить гарна. Об'єднання всього назад у master дає чітке вказівку на випуски у часовому порядку, замість того, щоб теги версій були розкидані по всьому графіку.

Я думаю, що ця модель не працює для виправлення помилок у старих версіях. Це псує акуратне впорядкування.

  1. Скажімо, ми випустили версію 1.0.1, а пізніше додали функції та випустили 1.1.0.
  2. Ми виявили помилку в 1.0.1 і хочемо виправити її в обох версіях
  3. Ми повинні додати 1.0.2 після 1.1.0 в master, а потім безпосередньо перейти (або раніше) також 1.1.1.

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


1
supportгілки призначені для виправлення помилок у попередніх версіях, хоча вони все ще позначені як "експериментальні".
mstrap

2

Я особисто вважаю, що згаданий git-flow надто ускладнений.

Якщо ви використовуєте GitHub, спробуйте GitHub flow(як описано Скоттом Чейконом).

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

ОНОВЛЕННЯ : Існує новий офіційний веб-сайт The GitHub Flow ™

ОНОВЛЕННЯ 2 : Існує новий офіційний (і спрощений) посібник GitHub для GitHub Flow ™: https://guides.github.com/introduction/flow/


10
Потік GitHub підходить лише для контексту, не орієнтованого на випуск: процес git-flow розроблений здебільшого навколо "випуску". Насправді у нас немає "випусків", оскільки ми розгортаємо виробництво щодня - часто кілька разів на день.
Remi Mélisson

10
Я б також додав, що git-flow насправді не працює так чудово в контексті, орієнтованому на випуск, який має випуски обслуговування. Наприклад, що відбувається, коли випуск 1.2.1 відбувається після випуску 1.3.0? Ймовірно, це не можна об’єднати master, що є аномалією хронології твору.
Кен Вільямс

@KenWilliams, як описано у відповіді mstrap , для цього і supportпотрібні гілки. Але ви маєте рацію, це справді аномалія, що такі випуски не зливаються назад master, що, на моє розуміння, повинно містити всі виробничі випуски.
beatngu13

2

У моєму випадку у мене є дві версії одного програмного забезпечення, основи яких однакові, але кожна версія має різні функції.

Тож я створюю дві, worktreeщо означає, створюю дві відповідні довготривалі гілки поруч із майстром.

$git worktree add -b version-silver ..\version-silver master
$git worktree add -b version-gold ..\version-gold master

Тоді я маю:

$git branch
master  # base stuff here
version-silver # some normal features
version-gold # some better features

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

cd master
vim basic.cpp
git add .
git commit -m "my common edit on basic.cpp"
cd ..\version-silver
vim silver.cpp
git add .
git commit -m "my specific edit on silver.cpp"
git merge master # here i get the basic.cpp latest changes for silver project
cd ..\version-gold
git merge master # here i get the basic.cpp latest changes for gold project

Конкретні зміни кожної версії також потраплять у відповідну папку, і роботи над кожним проектом будуть ізольованими, і IDE не буде плутати.

Сподіваюся, що це допомагає.


2

Повністю згоден з @Mot.

Приємно чути ті самі запитання.

Нашу команду також полювали на більш універсальну модель розгалуження, ніж на Успішну . Тобто, як @Mot було згадано вище - головна ідея полягає у тому, щоб уникнути введення додаткових сховищ для підтримки реліз-* гілок в окремих * .git репо, як це, наприклад, робить kernel.org для стабільних випусків. Але kernel.org робить це заради мінімізації завантажених розмірів, я думаю.

Для мене здається, що більш чистою є наявність майстра як основної лінії для розвитку .

Також є деякі конфлікти у версії *, що об'єднує модель для освоєння та позначення її згодом з ідеєю

використовуйте скрипт Git Hook для автоматичного створення та розгортання нашого програмного забезпечення на наших виробничих серверах щоразу, коли було зроблено коміт на master

причина закінчення (злиття та позначення) не є атомною транзакцією:

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2

і якщо git hook починає будувати з підтримкою автоматичного керування версіями:

$git describe --tags --long >.ver

тоді можна створити помилкову версію для:

$ git merge --no-ff release-1.2

Я знаю, що встановлення версій у програмі " Успішний" вводить певний процес випуску, але це не автоматично.

Отже, підсумовуємо - ключові відмінності, які ми вводимо до моделі гілок для випусків - * злиття та тегування:


-2

Головна гілка ЗАВЖДИ повинна представляти вашу базу виробничого коду, отже, ви завжди об'єднуєте код назад у майстер відразу після випуску.

Тегування використовується для "запам'ятовування" точного коду, який увійшов до виробничого випуску, щоб ви могли повернутися пізніше і проаналізувати код, якщо щось пішло не так.

З цим теоретично не має значення, позначаєте ви свій код на гілці випуску або на гілці master після того, як ви об'єдналися з master. Я особисто вважаю за краще позначати код на гілці випуску, оскільки це саме той код, який увійшов до складання / випуску (припускаючи, що щось може піти не так із злиттям).

Проблема концепції галузі розвитку полягає в тому, що вона є однопоточною. Брендан у цій темі згадав стратегію, яка може бути використана із залученням концепції галузі розвитку.


4
Що таке "база виробничого коду", якщо ви підтримуєте кілька випусків, наприклад v1.0, v1.1, v1.5 паралельно?
Thomas S.

База виробничого коду - це те, що зараз виробляється, наприклад v1.0. Філії несуть зміни щодо випусків, які будуть розгорнуті у виробництві в майбутньому, наприклад V1.0.1, v1.1 і v2.0. Після того, як "майбутній" випуск буде розгорнуто у виробничій системі, він об'єднується з основним, щоб цей майстер відображав те, що знаходиться у виробництві. Він також об'єднується вперед (наприклад, v1.0.1 до 1.1 та v2.0), тому зміни v1.0.1 не втрачаються, коли v1.1 випускається у виробництво.
Берні Ленц

4
Я говорю про підтримку декількох випущених версій, а не про майбутні версії.
Thomas S.

4
Здається, ви мене не розумієте. Ви не уявляєте, що в деяких компаніях підтримується кілька версій версій? Microsoft, наприклад, також підтримує оновлення для Windows 7, 8, 8.1 та 10, то чому б не іншим компаніям?
Thomas S.

1
Це правильно Томас. Ця модель орієнтована на товари, що мають один випуск у даний момент часу, наприклад, веб-сайти. Я також використовував цю модель для мобільних збірок, наприклад, для android та iPhone, де збірка параметризована для створення збірки для android або iPhone (або обох) із однаковим номером версії. Мені цікаво ознайомитись із вашими відомостями про те, як структурувати модель збірки для продукту, який має кілька активних версій, що працюють у будь-який момент часу, можливо, з деякими спільними компонентами, а деякі компоненти різними. Будь ласка, повідомте нас ...
Берні Ленц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.