Когда нужно разветвляться?

Ответы:

59

Есть несколько применений ветвления. Одно из наиболее распространенных применений - разделение проектов, которые когда-то имели общую кодовую базу. Это очень полезно для экспериментов с вашим кодом, не затрагивая основной ствол.

В общем, вы увидите два типа веток:

  • Ветка функции: если конкретная функция является настолько разрушительной, что вы не хотите, чтобы вся команда разработчиков была затронута на ранних этапах, вы можете создать ветвь, в которой будет выполняться эта работа.

  • Ветка с исправлениями: пока продолжается разработка основного канала, можно создать ветку с исправлениями, в которой будут храниться исправления для последней выпущенной версии программного обеспечения.

Возможно, вам будет интересно прочитать следующую статью, в которой объясняются принципы ветвления и когда их использовать:

Даниэль Вассалло
источник
Я никогда не слышал и не думал о распространенном использовании, о котором вы упомянули, но это действительно классная идея. Я действительно могу использовать это в следующем проекте. Спасибо, что указали на это.
Нильс Ридеманн
82

В общем, основная цель ветвления (функция VCS - Version Control System) - добиться изоляции кода .

У вас есть хотя бы одна ветка, которой может быть достаточно для последовательной разработки, и она используется для многих задач, которые записываются (фиксируются) в той же уникальной ветке.

Но эта модель быстро показывает свой предел:

Когда у вас есть усилия по разработке (рефакторинг, эволюция, исправление ошибок, ...) и вы понимаете, что не можете безопасно вносить эти изменения в той же ветке, что и текущая ветвь разработки (потому что вы нарушите API или введете код, который нарушит все), то нужна еще ветка.
(Чтобы изолировать этот новый код от старого, даже если два набора кода будут объединены позже)

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


Ветвь может быть полезна, даже если вы единственный, кто работает с исходным кодом, или если вас много.
Но вы не должны делать «одну ветвь на разработчика»:
цель «изоляции» делается для того, чтобы изолировать усилия по разработке (задача, которая может быть столь же общей, как «давайте разработаем следующую версию нашего программного обеспечения», либо такой конкретной, как «давайте исправим ошибка 23 "),
не изолировать" ресурс " .

(ветка под названием «VonC» ничего не значит для другого разработчика: что, если «VonC» выйдет из проекта? Что вы должны с этим делать?
ветку под названием «bugfix_212» можно интерпретировать, например, в контексте системы отслеживания ошибок , и любой разработчик может использовать его, хотя бы имея некоторое представление о том, что он должен с ним делать)

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

Определение ветки означает также определение рабочего процесса слияния : вам нужно знать, где слить ветку, когда вы закончите с ней.
В этой связи глава 7 Practical Perforce (Laura WINGERD - O'Reilly) является хорошим введением (независимо от VCS) для объединения рабочего процесса между различными типами ветвей: "" Как развивается программное обеспечение "(pdf)

Он определяет термин кодовая строка (ветвь, которая записывает важные этапы развития кода либо с помощью тегов в определенных точках, либо с помощью важного слияния с ответвлением)

В нем представлена ​​основная модель (центральная строка кода для записи релизов) и описаны различные цели ветвления:

  • Активные потоки разработки : постоянная строка кода при последовательном выполнении различных разработок
  • ветки задач : кратковременные ветки для более конкретной задачи (исправление ошибок является классическим, но вы также можете определить ветвь для операции слияния, которую, как вы знаете, сложно выполнить: вы можете объединить, зафиксировать и протестировать в этой ветке задачи без создания проблемы для основной текущей ветки разработки)
  • промежуточная ветвь : для подготовки релиза с некоторыми предпроизводственными данными или файлами конфигурации.
  • Частные ветки, специальные ветки и разреженные ветки : для очень небольших задач, просто чтобы иметь возможность зафиксировать некоторую незавершенную работу, не дожидаясь формального завершения или проверки теста.
    Это позволяет «фиксировать рано, фиксировать часто».

Другие интересные концепции, связанные с VCS: Основные концепции
(изначально о ClearCase, но также действительны для любой VCS)

VonC
источник
19

Все SCM 21 века говорят вам:

Разделение для каждой задачи, над которой вы работаете , независимо от того, является ли это новой функцией, исправлением ошибки, тестом или чем угодно. Это называется тематической веткой, и она меняет способ работы с SCM.

Ты получаешь:

  • Лучшая изоляция
  • Лучшая прослеживаемость -> вы связываете задачи с ветвями, а не с отдельными наборами изменений, что дает вам возможность фиксировать столько раз, сколько вы хотите, и не накладывает ограничений, таких как «одна проверка на задачу».
  • Задачи независимы (обычно начинаются со стабильного базового уровня, поэтому вы сосредотачиваетесь только на своем коде, а не на исправлении ошибок со стороны ваших людей), и вы можете выбрать, хотите ли вы интегрировать их в какой-то момент или позже, но они всегда ниже контроль версий
  • Вы можете легко просмотреть код (из системы контроля версий, а не из ерунды перед фиксацией), прежде чем перейти к основной строке

Инструменты, которые могут это сделать:

Инструменты, которые НЕ МОГУТ сделать:

  • SVN
  • CVS
  • VSS
  • TFS
  • Волей случая
пабло
источник
1
Почему вы не можете этого сделать с SVN ??
yegor256
4
SVN - плохое слияние. Из-за отсутствия надлежащего отслеживания слияния. Кроме того, поскольку создание ветки не так дешево, как в тех, которые я указал, в реальных условиях это становится кошмаром.
pablo
Лучшая прослеживаемость: почему вы хотите совершать фиксацию столько раз, сколько хотите? Разве не достаточно одного раза на задачу, если задача не является сложной функцией? Также ошибки от людей могут легко попасть в основную ветку и сделать ее не «стабильной» и не «безопасной», прямо в момент слияния.
Paiman Samadian
@PaimanSamadian: «Разве не достаточно одного раза на задачу, если задача не является сложной функцией?» Конечно. К тому же, когда задача является сложной, один совершить не хватает (я совершаю каждые несколько минут , если дела идут хорошо). Зачем заставлять одну фиксацию на задачу? • «Также ошибки от людей могут легко попасть в основную ветку» На самом деле нет. Часть рабочего процесса функциональной ветки состоит в том, что он делает возможным просмотр и тестирование кода до того, как код будет объединен в основную ветвь.
Marnen Laibow-Koser
1
@PaimanSamadian несколько проверок отлично подходят для объяснения промежуточных изменений и упрощения проверки. Кроме того, если вы над чем-то работаете несколько часов, несколько проверок отлично подойдут.
пабло
8

Это также зависит от инструмента SCM, который вы используете. Современные SCM (git, mercurial и т. Д.) Упрощают создание и уничтожение веток по мере необходимости. Это позволяет вам, например, создавать одну ветку для каждой ошибки, над которой вы работаете. Как только вы объедините свои результаты в ствол, вы отбрасываете ветку.

Другие SCM, например Subversion и CVS, имеют гораздо более «тяжелую» парадигму ветвления. Это означает, что ветка считается подходящей только для чего-то большего, чем патч из двадцати с чем-то строк. Там ветки обычно используются для отслеживания целых треков разработки, таких как предыдущая или будущая версия продукта.

Фред
источник
5

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

Доминик Роджер
источник
5

Это зависит от того, какой тип SCM вы используете.

В более новых распределенных версиях (таких как git и mercurial) вы все время создаете ветки и все равно повторно объединяетесь. Я часто работаю над отдельной веткой какое-то время только потому, что кто-то сломал сборку на основной ветке, или потому что сеть не работает, а затем объединяю изменения обратно позже, когда это исправлено, и это так легко сделать, что это даже не раздражает .

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

В более старых системах с центральным репозиторием (например, CVS, SVN и ClearCase) это гораздо более серьезная проблема, которую необходимо решать на уровне команды, и ответ должен быть больше похож на `` поддерживать старый выпуск, позволяя развитие, чтобы продолжить по основной линии », или« как часть большого эксперимента ».

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

Джон Лоуренс Аспден
источник
3

Я считаю, что совет Лоры Вингерд и Кристофера Зайвальда из 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
пабло
Отзыв в 2015 году! Причина, по которой следует избегать ветвления, заключается в том, чтобы избежать необходимости слияния - не потому, что у Perforce не было ветки задачи / темы (вы можете выполнять «ветвь задачи» в потоках - в Perforce мы называем это «потоками задач». Как уже упоминалось другими - ветвление подразумевается в DVCS, и вопрос становится непочтительным. Я считаю, что обсуждение должно быть ограничено только инструментами, которые работают в режиме клиент-сервер. Или DVCS, используемым централизованно (начиная с версии 2015.1 вы можете использовать Perforce в режиме DVCS - лучшее из обоих миров)
Лестер Чунг
2

Цели ветвления могут быть разными:

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

Также может возникнуть необходимость в разветвлении:

  • когда вы хотите предоставить исправление конкретному клиенту (скажем, важному) и не уверены, будет ли исправление частью будущих выпусков

  • сатиш
    источник
    1

    Когда вам захочется.

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

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

    просто кто-то
    источник
    0

    Когда вам нужно внести изменения, основанные на вашей текущей ветке, не предназначенные для следующего выпуска из этой ветки (и не ранее).

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

    Эндрю Айлетт
    источник
    0

    Оставив в стороне все технические детали ...

    Разветвляйтесь, когда знаете, что легче слить обратно!

    Помните, что слияние всегда будет происходить в соответствии с тем, как работа выполняется в проекте.

    Как только это будет достигнуто, в игру вступят все остальные третичные вопросы.

    Сайед М. Шааф
    источник