Коли ви повинні відділитися?


Відповіді:


59

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

Загалом, ви б бачили два типи галузей:

  • Функціональна галузь: Якщо певна функція є достатньо руйнівною, що ви не хочете, щоб на її ранній стадії впливала вся команда розробників, ви можете створити гілку, в якій виконувати цю роботу.

  • Fixes Branch: Незважаючи на те, що розробка продовжується в основному стволі, можна створити гілку виправлень, щоб містити виправлення останньої випущеної версії програмного забезпечення.

Можливо, вам буде цікаво переглянути наступну статтю, яка пояснює принципи розгалуження та коли їх використовувати:


Я ніколи не чув і не думав про загальне використання, яке ви згадали, але це справді класна ідея. Я справді міг би використати це в майбутньому проекті. Дякуємо, що вказали на це.
Нілс Рідеманн

82

Загалом, основна мета розгалуження (VCS - система управління версіями - особливість) - досягти ізоляції коду .

У вас є принаймні одна гілка, якої може бути достатньо для послідовної розробки, і вона використовується для багатьох завдань, що записуються (виконуються) на цій самій унікальній гілці.

Але ця модель швидко показує свою межу:

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

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


Гілка може бути корисною, навіть якщо ви єдиний, хто працює над вихідним кодом, якщо вас багато.
Але ви не повинні робити "одну гілку на розробника":
мета "ізоляції" робиться для ізоляції зусиль з розробки (завдання, яке може бути настільки ж загальним, як "давайте розробимо наступну версію нашого програмного забезпечення", або настільки ж конкретним, як "давайте виправляємо помилка 23 "),
не ізолювати" ресурс " .

(гілка під назвою "VonC" нічого не означає для іншого розробника. Що робити, якщо "VonC" покине проект? Що ви з цим робити?
Гілка під назвою "bugfix_212" може бути інтерпретована, наприклад, у контексті системи відстеження помилок) , і будь-який розробник може використовувати його принаймні з деяким уявленням про те, що він повинен робити з цим)

Гілка не є тегом (SVN - це система редагування, яка намагається запропонувати функцію версій , наприклад розгалуження та теги через каталоги з дешевою копією файлу: це не означає, що тег є гілкою)

Визначити гілку означає також визначити робочий процес злиття : вам потрібно знати, де об’єднати свою гілку, коли ви закінчите з нею.
З цього приводу глава 7 практичної роботи (Laura WINGERD - O'Reilly) - це гарне введення (агностик VCS) для об'єднання робочого процесу між різними галузями: "" Як розвивається програмне забезпечення "(pdf)

Він визначає термін кодова лінія (гілка, яка записує значні етапи еволюції коду, або через теги в певних точках, або через важливе злиття назад до гілки).

Він представляє модель основної лінії (центральний код для запису випусків) та описує різні цілі розгалуження:

  • Активні потоки розвитку : стійка кодова лінія, коли відбуваються послідовні різні розробки
  • гілки завдань : недовговічні гілки для більш конкретного завдання (виправлення помилок є класичним, але ви також можете визначити гілку для об'єднання зусиль, які, як ви знаєте, складні для завершення: ви можете об'єднати, здійснити і протестувати в цій гілці завдань без введення проблеми для основної поточної галузі розвитку)
  • Постановочна гілка : для підготовки випуску з деякими специфічними даними або конфігураційними файлами перед виробництвом.
  • Приватні відділення, спеціальні відділення та розріджені гілки : для дуже невеликих завдань, просто щоб мати можливість виконувати певну роботу, не чекаючи офіційного завершення чи перевірки тесту.
    Це дозволяє "вчиняти рано, вчиняти часто".

Інші цікаві концепції навколо VCS: основні поняття
(спочатку про ClearCase, але також дійсні для будь-яких VCS)


19

Усі СКМ 21 століття говорять вам:

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

Ви отримуєте:

  • Краща ізоляція
  • Краща простежуваність -> ви пов'язуєте завдання з гілками, а не окремими наборами змін, що дозволяє вільно виконувати стільки разів, скільки вам потрібно, і не встановлює обмеження, як "одна реєстрація на завдання".
  • Завдання незалежні (як правило, починаючи зі стабільної базової лінії, тому ви зосереджуєтесь лише на своєму коді, а не на виправлення помилок у своїх людей), і ви можете вибрати, чи хочете ви їх інтегрувати в якийсь момент або пізніше, але вони завжди під контроль версій
  • Ви можете легко переглянути код (від контролю версій, не попередньо виконуючи фігня), перш ніж потрапляти на основну лінію

Інструменти, які можуть це зробити:

Інструменти, які не можуть зробити це

  • SVN
  • CVS
  • VSS
  • TFS
  • Перфорс

1
Чому ви не можете зробити це з SVN ??
yegor256

4
SVN не є гарним злиттям. Через відсутність належного відстеження об’єднання. Крім того, оскільки створити філію не так дешево, як у тих, на кого я вказав, це в кінцевих умовах стає кошмаром.
пабло

Краща простежуваність: Чому б ви хотіли скористатися стільки разів, скільки хочете? Чи не один раз на завдання достатньо, коли завдання не є складною особливістю? Також помилки від людей можуть легко пройти до головної гілки та зробити її не "стабільною" та не "безпечною", саме в той момент, коли вони зливаються.
Paiman Samadian

@PaimanSamadian: "Чи не один раз на завдання достатньо, коли завдання не є складною функцією?" Звичайно. До того ж, коли завдання є складною, один зробити НЕ вистачає (я роблю кожні кілька хвилин , якщо справи йдуть добре). Навіщо змушувати один вчинок на кожне завдання? • "Також помилки від людей можуть легко пройти до головної гілки" Насправді ні. Частина точки робочого процесу особливості філії є те , що він робить огляд коду і тестування можливо , перш ніж код об'єднується в основну гілку.
Marnen Laibow-Koser

1
@PaimanSamadian кілька чеків чудово пояснюють проміжні зміни та полегшують огляд. Крім того, якщо ви працюєте кілька годин над чимось, декілька чеків чудово підходять.
пабло

8

Це також залежить від інструменту SCM, який ви використовуєте. Сучасні SCM (git, mercurial тощо) полегшують створення та знищення гілок, коли це необхідно. Це дозволяє, наприклад, робити одну гілку на помилку, над якою ви працюєте. Як тільки ви об’єднаєте свої результати в стовбур, ви відкинете гілку.

Інші СКМ, наприклад, субверсія та CVS, мають значно «важчішу» парадигму розгалуження. Це означає, що гілка вважається підходящою лише для чогось більшого, ніж двадцять-щось виправлення. Там гілки класично використовуються для відстеження цілих треків розвитку, як попередня або майбутня версія продукту.


5

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


5

Це залежить від того, який тип SCM ви використовуєте.

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

Документ (короткий і читабельний), який найбільше допоміг мені зрозуміти, що відбувається в розподілених системах, це: UnderstandingMercurial .

У старих системах з центральним сховищем (наприклад, CVS, SVN та ClearCase), це набагато серйозніша проблема, яку потрібно вирішити на рівні команди, і відповідь має бути більше схожою на "підтримку старого випуску, дозволяючи розвиток, який слід продовжувати на основній лінії ", або" як частина великого експерименту ".

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


3

Я вважаю, що порада від Laura Wingerd & Christopher Seiwald в Perforce є дуже короткою та корисною:

* Branch only when necessary.
* Don't copy when you mean to branch.
* Branch on incompatible policy.
* Branch late.
* Branch, instead of freeze.

Детальне пояснення кожного з них та інших найкращих практик див. На веб-сайті http://www.perforce.com/sites/default/files/pdf/perforce-best-practices.pdf .


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

Відповідь у 2015 році! Причина уникати гілки полягає в тому, щоб уникнути необхідності злиття - не тому, що у Perforce не було гілки завдань / тем (ви можете робити "гілку завдань" у потоках - у Perforce ми називаємо це "потоками завдань". Як вже згадували інші - розгалуження мається на увазі в DVCS, і питання стає непотрібним. Я вважаю, що обговорення має обмежуватися лише інструментами, що працюють в режимі клієнт-сервер. Або DVCS, що використовується централізовано (з моменту випуску 2015.1 ви можете використовувати Perforce в режимі DVCS - кращий з обох світів)
Лестер Чеунг

2

Для розгалуження існують різні цілі:

  1. Особливості / клопи гілок. Динамічні та активні гілки, які переміщуються назад у стовбур, коли функція / помилка завершена.
  2. Статичні гілки (мітки в Subversion, хоча, по суті, просто "нормальна гілка"). Вони забезпечують статичний знімок скажімо, реліз. Хоча над ними можна працювати, вони залишаються недоторканими.

1

Потреба у розгалуженні також може виникнути:

  • коли ви хочете надати виправлення конкретному клієнту (скажімо, важливе), і ви не впевнені, чи виправлення буде частиною майбутніх версій


  • 1

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

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

    OTOH, немає ніякої технічної різниці між відділенням і замовленням в розподілених SCM, і злиття набагато простіше. Ви будете відчувати, як розгалужуватись набагато частіше.


    0

    Коли вам потрібно внести зміни на основі вашої поточної гілки, не призначеної для наступного випуску з цієї гілки (і не раніше).

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


    0

    Залишаючи всі технічні характеристики осторонь .....

    Відділіться, коли знаєте, що легше повернутися назад!

    Маючи на увазі, що об'єднання завжди буде здійснюватися з тим, як виконується робота в проекті.

    Як тільки це досягнуто, всі інші третинні питання вступлять у гру.

    Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
    Licensed under cc by-sa 3.0 with attribution required.