Что означают «ветвь», «тег» и «ствол» в репозиториях Subversion?


1193

Я часто видел эти слова в дискуссиях о Subversion (и, я думаю, в общем хранилище).
Я использую SVN для своих проектов в течение последних нескольких лет, но я никогда не понимал полную концепцию этих каталогов.

Что они имеют в виду?


29
Вот хорошая статья, в которой я встретил объяснение, как / когда использовать ствол, ветвь и теги. Раньше я не использовал управление исходным кодом, но эта статья позволила довольно простому человеку понять, как я. Ежедневно с Subversion
Badmoon

Ответы:


910

Хм, не уверен, что согласен с тем, что Ник повторяет тег, похожий на ветку. Тег это просто маркер

  • Магистраль будет основной частью разработки, начиная с начала проекта до настоящего времени.

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

  • Метка будет моментом времени на стволе или ветви, которую вы хотите сохранить. Двумя основными причинами сохранения будет то, что это либо основной выпуск программного обеспечения, будь то альфа, бета, RC или RTM, либо это самый стабильный вариант программного обеспечения до того, как были применены основные изменения в магистрали.

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

Ветви и теги поддеревья отличаются от ствола следующими способами:

Subversion позволяет системным администраторам создавать подключаемые скрипты, которые запускаются для выполнения при возникновении определенных событий; например, внесение изменений в хранилище. Типичная реализация репозитория Subversion очень часто рассматривает любой путь, содержащий «/ tag /», как защищенный от записи после создания; в результате, созданные тэги являются неизменяемыми (по крайней мере, для «обычных» пользователей). Это делается с помощью сценариев ловушек, которые обеспечивают неизменность, предотвращая дальнейшие изменения, если тег является родительским узлом измененного объекта.

Subversion также добавила функции, начиная с версии 1.5, относящиеся к «отслеживанию слияния веток», так что изменения, зафиксированные в ветке, могут быть объединены обратно в транк с поддержкой постепенного «умного» слияния.


284
Путаница с тегами и ветвями заключается в том, что в svn между ними нет никакого различия, кроме названия каталога. В SVN вы можете зафиксировать изменения в теге, и на самом деле это трудно предотвратить. Большинство других VCS рассматривают теги как неизменяемые снимки (моменты времени).
Кен Лю

4
TagsКаталог также часто используется для тестирования основных этапов и проверки обычным пользователем. Это было бы хорошим местом для размещения прототипа тоже (только некоторые идеи на моей голове).
Джефф Ноэль

6
@KenLiu Есть хуки, которые могут сделать теги неизменяемыми. То есть вы можете создать и оформить тег, но не вносить никаких изменений. Конечно, тег, являющийся лишь частью хранилища, означает, что доступна полная история. Если кто-то изменяет тег, вы можете отслеживать это и почему. Во многих VCS, если вы изменяете тег, может не быть никакого способа узнать об этом.
Дэвид В.

3
Возможно, следует упомянуть стабильные ветви : сделанные там изменения, как правило, не объединяются в магистраль .
волк

4
Насколько я понимаю, в «идеальном мире» никакая разработка никогда не должна происходить в транке, транк всегда должен быть либо точным кодом, который находится в реальном времени, либо кодом, который вот-вот будет выпущен в прямом эфире. как таковой, что сделало бы ветви основной частью развития.
MikeT

556

Прежде всего, как указывают @AndrewFinnell и @KenLiu, в SVN имена каталогов сами по себе ничего не значат - «ствол, ветви и теги» - это просто общее соглашение, которое используется большинством репозиториев. Не во всех проектах используются все каталоги (достаточно часто вообще не использовать «теги»), и на самом деле ничто не мешает вам называть их как угодно, хотя нарушение соглашения часто сбивает с толку.

Я опишу, вероятно, наиболее распространенный сценарий использования ветвей и тегов, и приведу пример сценария их использования.

  • Багажник : основное направление развития. Это место, где живет ваш следующий основной выпуск кода, и, как правило, имеет все новейшие функции.

  • Ветви : Каждый раз, когда вы выпускаете основную версию, создается ветка. Это позволяет вам исправлять ошибки и создавать новые версии, не выпуская новейшие - возможно, незавершенные или непроверенные - функции.

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


Например, допустим, вы начинаете новый проект. Вы начинаете работать в «стволе», над чем в конечном итоге будет выпущена версия 1.0.

  • trunk / - версия для разработки, скоро будет 1.0
  • ветви / - пусто

Как только 1.0.0 закончен, вы ветвитесь на ствол в новую ветку "1.0" и создаете тег "1.0.0". Теперь работа над тем, что в итоге будет 1.1, продолжается в багажнике.

  • trunk / - версия для разработки, скоро будет 1.1
  • ветки / 1.0 - версия 1.0.0
  • tags / 1.0.0 - версия 1.0.0

Вы сталкиваетесь с некоторыми ошибками в коде и исправляете их в стволе, а затем объединяете исправления с веткой 1.0. Вы также можете сделать обратное и исправить ошибки в ветке 1.0, а затем объединить их обратно в транк, но обычно проекты придерживаются одностороннего объединения только для уменьшения шансов что-то упустить. Иногда ошибка может быть исправлена ​​только в 1.0, потому что она устарела в 1.1. На самом деле это не имеет значения: вам нужно только убедиться, что вы не выпускаете 1.1 с теми же ошибками, которые были исправлены в 1.0.

  • trunk / - версия для разработки, скоро будет 1.1
  • ветки / 1.0 - предстоящая версия 1.0.1
  • tags / 1.0.0 - версия 1.0.0

Как только вы найдете достаточно ошибок (или, возможно, одну критическую ошибку), вы решаете выпустить 1.0.1. Итак, вы делаете тег «1.0.1» из ветки 1.0 и выпускаете код. На этом этапе транк будет содержать то, что будет 1.1, а ветвь "1.0" содержит код 1.0.1. В следующий раз, когда вы выпустите обновление до 1.0, это будет 1.0.2.

  • trunk / - версия для разработки, скоро будет 1.1
  • филиалы / 1,0 - предстоящая версия 1.0.2
  • tags / 1.0.0 - версия 1.0.0
  • tags / 1.0.1 - версия 1.0.1

В конце концов вы почти готовы к выпуску 1.1, но сначала вы хотите сделать бета-версию. В этом случае вы, скорее всего, сделаете ветку «1.1» и тег «1.1beta1». Теперь работа над тем, что будет 1.2 (или, может быть, 2.0), продолжается в транке, но работа над 1.1 продолжается в ветке "1.1".

  • ствол / - версия для разработки, скоро будет 1.2
  • ветки / 1.0 - предстоящая версия 1.0.2
  • ветки / 1.1 - предстоящая версия 1.1.0
  • tags / 1.0.0 - версия 1.0.0
  • tags / 1.0.1 - версия 1.0.1
  • tags / 1.1beta1 - 1.1 бета 1 версия выпуска

Выпустив финал 1.1, вы делаете тег «1.1» из ветки «1.1».

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


Другое использование веток для функций. Здесь вы ветвитесь в ствол (или одну из веток релиза) и работаете над новой функцией изолированно. Как только функция завершена, вы объединяете ее и удаляете ветку.

  • trunk / - версия для разработки, скоро будет 1.2
  • ветки / 1.1 - предстоящая версия 1.1.0
  • ветки / ui-rewrite - экспериментальная ветка

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


Также обратите внимание, что схема управления версиями, которую я здесь использовал, является лишь одной из многих. Некоторые команды могут делать исправления ошибок / выпуски поддержки как 1.1, 1.2 и т. Д., А основные изменения - как 1.x, 2.x и т. Д. Здесь используется то же самое, но вы можете назвать ветвь «1» или «1». .x "вместо" 1.0 "или" 1.0.x ". (Кроме того, семантическое управление версиями - хорошее руководство о том, как делать номера версий).


6
@baruch - Это совершенно неправильно. Теги легковесны и (что касается самого Subversion) идентичны ветвям.
Джош Келли

7
Люблю детали использования. Спасибо @gregmac.
Джером Френч

2
Могу ли я получить цитату о том, что теги / ветки легкие? Кажется, это не так ..
Кардин Ли Дж

3
Это должен быть принятый ответ, который намного лучше ^^
Nam G VU

4
@Cardin У меня нет ссылки прямо сейчас, но важно отметить, что теги легки на сервере, но не на клиенте. Если вы извлечете все теги, вы получите столько полных копий. Однако, если вы посмотрите на размер хранилища на сервере, он увеличится только на несколько байтов на тег. Вот почему вы не должны извлекать корневой каталог, вообще говоря.
gregmac

97

В дополнение к тому, что сказал Ник, вы можете узнать больше на Streamed Lines: паттерны ветвления для параллельной разработки программного обеспечения

введите описание изображения здесь

На этом рисунке mainствол, rel1-maintветвь и 1.0тег.


1
@ Волк, он мог бы быть - эта диаграмма довольно общая, независимо от инструментов. Все SCM используют разные слова, но одни и те же понятия, между магистралью и главой нет никакой разницы; или багажник и мастер. Эта диаграмма показывает, как моя нынешняя компания использует SVN.
gbjbaanb

@gbjbaanb Спасибо, что поделились. ... и теги, похоже, не решаются с помощью вопроса. Является ли чистым совпадением (также в вашей нынешней компании), что слияния не идут от основного к обслуживаемому филиалу?
волк

@ Волк Не случайно - только ветка из ствола, делай работу, сливай обратно в ствол. Затем ответвитесь от ствола до метки. Мы рассматриваем еще одну «ствол», которая называется «Интеграция», в которой завершены ветви, объединенные с ней, для тестирования, которое не составляет релиз, транк все еще используется для тех веток, которые мы решили добавить в следующий выпуск. Единственный раз, когда вы объединяетесь из ствола в ветку, это обновить долгосрочную ветвь, но лучше (и проще) просто создать новую ветку из ствола и объединить изменения вашей старой ветки с ней, если вам это нужно.
gbjbaanb

75

В общем (инструментальное представление) ветвь - это механизм, используемый для параллельной разработки. SCM может иметь от 0 до n ветвей. Subversion имеет 0.

  • Магистраль является основной веткой, рекомендованной Subversion , но вы никоим образом не обязаны ее создавать. Вы могли бы назвать это "главным" или "выпусками", или не иметь ни одного вообще!

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

    • цель "myProject_dev" или "myProject_Merge"
    • периметр выпуска 'myProjetc1.0_dev' или myProject2.3_Merge 'или' myProject6..2_Patch1 '...
  • Тег - это снимок файла, чтобы легко вернуться в это состояние. Проблема в том, что тег и ветвь одинаковы в Subversion . И я определенно рекомендую параноидальный подход:

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

Тег является окончательным. Его содержание никогда не должно меняться. НИКОГДА. Когда-либо. Вы забыли строку в примечании к выпуску? Создать новый тег. Устаревший или удалить старый.

Сейчас я много читал о «объединении таких-то и таких-то в таких-то ветках и, наконец, в стволовой ветке». Это называется рабочим процессом слияния, и здесь нет ничего обязательного . Это не потому, что у вас есть ветвь ствола, что вы должны объединить обратно .

По соглашению, ветвь ствола может представлять текущее состояние вашей разработки, но это для простого последовательного проекта, то есть проекта, который имеет:

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

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


38

В SVN тег и ветка действительно похожи.

Tag = определенный фрагмент времени, обычно используемый для релизов

Филиал = также определенный отрезок времени, на котором может продолжаться разработка, обычно используемая для основной версии, такой как 1.0, 1.5, 2.0 и т. Д., Затем, когда вы отпускаете, вы помечаете ветку. Это позволяет вам продолжать поддерживать производственную версию, в то же время продвигаясь вперед с серьезными изменениями в стволе.

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


30

У них действительно нет никакого формального значения. Папка - это папка для SVN. Они являются общепринятым способом организации вашего проекта.

  • Ствол - это то место, где вы храните свою основную линию развития. Папка веток - это место, где вы можете создавать ветки, которые сложно объяснить в коротком посте.

  • Ветвь - это копия подмножества вашего проекта, над которой вы работаете отдельно от ствола. Может быть, это для экспериментов, которые могут никуда не пойти, или, может быть, это для следующего выпуска, который вы позже объедините обратно в ствол, когда он станет стабильным.

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

Но, как я уже сказал, для SVN папка - это папка. branch, trunkИ тег просто условность.

Я использую слово «копировать» свободно. SVN на самом деле не делает полные копии вещей в хранилище.


13

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

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

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

Вот ссылка на очень хорошее руководство по репозиториям:

Статьи в Википедии также стоит прочитать.


12

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

Вот мой простой способ,

trunk - каталог trunk содержит самый актуальный, утвержденный и объединенный объем работ. Вопреки тому, что многие признались, мой багажник предназначен только для чистой, аккуратной, одобренной работы, и не для разработки, а для освобождения.

В какой-то момент времени, когда ствол кажется готовым к выпуску, он помечается и освобождается.

ветки - каталог веток содержит эксперименты и текущую работу. Работа под веткой остается там до тех пор, пока не будет одобрен для слияния в ствол. Для меня это область, где вся работа сделана.

Например: у меня может быть ветвь итерации-5 для пятого раунда разработки продукта, может быть ветка -прототип-9 для девятого раунда экспериментов и так далее.

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

Я полагаю, с помощью тегов я могу прыгать назад и вперед во времени к интересующим точкам довольно легко.


10

Я нашел это великолепное руководство по SVN, когда искал веб-сайт автора книги по программированию приложений OpenCV 2 Computer Vision, и подумал, что должен поделиться.

У него есть учебник о том, как использовать SVN и что означают фразы «ствол», «тег» и «ветвь».

Цитируется прямо из его урока:

Текущая версия вашего программного проекта, над которой сейчас работает ваша команда, обычно находится в каталоге с именем trunk . По мере развития проекта разработчик обновляет эту версию, исправляет ошибки, добавляет новые функции) и отправляет свои изменения в этот каталог.

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

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


9

Магистральный каталог - это каталог, с которым вы, вероятно, больше всего знакомы, поскольку он используется для хранения самых последних изменений. Ваша основная кодовая база должна быть в транке.

Каталог ветвей предназначен для хранения ваших веток, какими бы они ни были.

Каталог тегов в основном предназначен для маркировки определенного набора файлов. Вы делаете это для таких вещей, как выпуски, где вы хотите, чтобы «1.0» были этими файлами в этих ревизиях, а «1.1» - этими файлами в этих ревизиях. Вы обычно не изменяете теги, как только они сделаны. Для получения дополнительной информации о тегах см. Глава 4. Ветвление и слияние (в разделе Контроль версий с помощью Subversion ).


9

Одна из причин, почему у каждого есть немного другое определение, состоит в том, что Subversion реализует нулевую поддержку ветвей и тегов. Subversion в основном говорит: мы смотрели на полнофункциональные ветви и теги в других системах и не нашли их полезными, поэтому мы ничего не реализовали. Просто сделайте копию в новый каталог с именем конвенции вместо . Тогда, конечно, каждый волен иметь немного разные соглашения. Чтобы понять разницу между реальным тегом и простым соглашением об именовании и копировании, см. Статью и ветви Subversion в Википедии .


8

Tag = определенный фрагмент времени, обычно используемый для релизов

Я думаю, это то, что обычно подразумевают под «тегом». Но в Subversion:

У них действительно нет никакого формального значения. Папка - это папка для SVN.

что я нахожу довольно запутанным: система контроля версий, которая ничего не знает о ветвях или тегах. С точки зрения реализации, я думаю, что способ создания «копий» в Subversion очень умный, но мне нужно знать об этом, что я бы назвал дырявой абстракцией. .

Или, может быть, я просто слишком долго использовал CVS .


Альтернативная перспектива заключается в том, что верно обратное, что навязывание концепции тегов в объектной модели Subversion было бы неплотной абстракцией в противоположном направлении. Как я полагаю, вы знаете, Subversion была реакцией на CVS, попыткой «сделать CVS правильно». Я не смог найти ссылку, но разработчики оригинальной Subversion сказали, что они преднамеренно отбросили концепцию тегов, что различие между ветвями и тегами является чисто политическим вопросом. Если команды хотят навязать политику и соглашение поверх объектной модели Subversion, пусть будет так. Это именно то, что мы имеем сегодня.
Дэррил

6

Я думаю, что некоторая путаница возникает из-за разницы между концепцией тега и реализацией в SVN. Для SVN тег - это ветка, которая является копией. Изменение тегов считается неправильным, и на самом деле такие инструменты, как TortoiseSVN, будут предупреждать вас, если вы попытаетесь изменить что-либо с помощью ../tags/ .. в пути.


5

Я не совсем уверен, что такое «тег», но ветвь - довольно распространенная концепция управления исходным кодом.

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

Сначала вы создадите ветку. По сути, это копия ствола того времени, когда вы создали ветку. Затем вы сделаете всю свою работу в филиале. Любые изменения, сделанные в ветви, не влияют на транк, поэтому транк по-прежнему пригоден для использования, что позволяет другим продолжать работать там (например, исправление ошибок или небольшие улучшения). Как только ваша функция будет завершена, вы вернете ветку обратно в транк. Это переместит все ваши изменения из ветви в ствол.

Есть несколько шаблонов, которые люди используют для веток. Если у вас есть продукт с поддержкой нескольких основных версий одновременно, обычно каждая версия представляет собой ветвь. Там, где я работаю, у нас есть отдел QA и производственный отдел. Перед выпуском нашего кода в QA мы интегрируем изменения в ветку QA, а затем внедряем их. При выпуске в производство мы интегрируемся из ветви QA в ветку Production, поэтому мы знаем, что код, работающий в рабочей среде, идентичен тому, что тестировал QA.

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


4

Багажник : после завершения каждого спринта в agile мы выпускаем частично отгружаемый продукт. Эти релизы хранятся в багажнике.

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

Теги : каждый раз, когда мы выпускаем частично бета-версию продукта, мы делаем для него тег. Это дает нам код, который был доступен в тот момент, позволяя нам вернуться в это состояние, если это потребуется в какой-то момент в процессе разработки.


Это ваш конкретный рабочий процесс, он вообще не применим.
Джейсон С

4

Для людей, знакомых с GIT, мастер в GIT эквивалентен транку в SVN.

Ветвь и тег имеют одинаковую терминологию как в GIT, так и в SVN.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.