Стратегии ветвления
Компания, в которой я работаю, начинает испытывать проблемы со своей текущей моделью ветвления, и мне было интересно, с какими различными видами стратегий ветвления сталкивается сообщество?
Есть ли хорошие для разных ситуаций? Что использует ваша компания? Каковы их преимущества и недостатки??
17 ответов
Вот метод, который я использовал в прошлом с хорошим успехом:
/ ствол - кровоточащий край. Следующая основная версия кода. Может или не может работать в любой момент времени.
/branches/1.0, 1.1 и т. д. Стабильное обслуживание веток кода. Используется для исправления ошибок, стабилизации новых выпусков. Если ветка обслуживания, она должна компилироваться (если применимо) и быть готова к QA/ отгрузке в любой момент времени. Если ветвь стабилизации, она должна быть скомпилирована и завершена. Не нужно добавлять никаких новых функций, рефакторинга и очистки кода. Вы можете добавить префикс, чтобы указать ветви стабилизации против ветвей обслуживания.
/ Филиалы /cool_feature. Используется для экспериментальной или деструктивной работы, которая может или не может превратиться в ствол (или ветку обслуживания). Нет никаких гарантий относительно компиляции кода, работы или иного вменяемого поведения. Должно длиться как можно меньше времени до слияния с основной веткой.
/tags/1.0.1, 1.0.2, 1.1.3a и т. д. Используется для маркировки упакованного и отгруженного выпуска. Никогда НИКОГДА не меняется. Сделайте столько тегов, сколько хотите, но они неизменны.
Я настоятельно рекомендую прочитать мнение Эрика Синка по этому вопросу:
Я, как и Эрик, предпочитаю ветвление в стиле "папок", о котором он говорит.
Материнское руководство по шаблонам ветвления см. В статье " Потоковые линии Брэда Эпплтона : шаблоны ветвления для разработки параллельных программ" Это тяжелый долг, но я не видел ничего, что могло бы превзойти его с точки зрения широты и глубины знаний о ветвлении.
- Одна ветка для активного развития (/main или master, в зависимости от жаргона)
- Одна ветка для каждого релиза поддержки -> он будет получать только очень небольшие исправления, в то время как все основные разработки идут в / main
- Одна ветка для каждой новой задачи: создайте новую ветку для работы с каждой новой записью в Bugzilla/Jira/Rally. Часто фиксируйте изменения, самостоятельно документируйте изменения, используя дюймовые галочки, и объединяйте их со своей "родительской" ветвью, только когда они завершены и хорошо протестированы.
Взгляните на этот http://codicesoftware.blogspot.com/2010/03/branching-strategies.html для лучшего объяснения
Наш репозиторий выглядит так:
/trunk
/branches
/sandbox
/vendor
/ccnet
/ trunk - ваш стандарт, передовой путь развития. Мы используем CI, поэтому всегда должны создавать и проходить тесты.
/ ветки - это то место, где мы помещаем "санкционированные" большие изменения, то есть то, что мы ЗНАЕМ, превратит это в транк, но может потребоваться некоторая работа и сломать CI. Также там, где мы работаем над техническими релизами, которые имеют свои собственные проекты CI.
/ sandbox у каждого разработчика есть своя песочница, плюс общая песочница. Это для задач типа "Давайте добавим поставщика LINQ к нашему продукту", которые вы выполняете, когда не выполняете свою реальную работу. Это может в конечном итоге перейти в транк, возможно, нет, но оно есть и находится под контролем версий. Здесь нет CI.
/ vendor Стандартная ветка vendor для проектов, в которых мы компилируем, но мы поддерживаем не код.
/ ccnet это наши теги CI, только CI-сервер может писать здесь. Оглядываясь назад, сказали бы нам переименовать это в нечто более общее, такое как CI, BUILDS и т. Д.
Первое, что нужно: ПОЦЕЛУЙ (будь проще, глупый!)
/ветви /RB-1.0 (*1) /RB-1.1 (*1) /RB-2.0 (*1) / теги /REL-1.0 (или как ваша версия выглядит, например, 1.0.0.123 *2) /REL-1.1 /REL-2.0 /хобот текущая разработка с классными новыми функциями;-)
* 1) Сохранение версии поддерживаемой - например, пакеты обновления, исправления, исправления, которые могут быть объединены с транком в случае необходимости и / или необходимости) *2) major.minor.build.revision
Правила большого пальца:
- Папка Теги не должна быть извлечена
- Только несколько кодов в ветвях релиза (упрощает слияние) - нет очистки кода и т. Д.
- Никогда не кодировать в папке тегов
- Никогда не помещайте конкретную информацию о версии в исходные файлы. Используйте Place-holders или 0.0.0.0, который механизм сборки заменит на номер версии, которую вы собираете
- Никогда не помещайте сторонние библиотеки в систему контроля версий (также никто не будет добавлять библиотеки STL, MFC и т. Д. В SVN;-))
- Только коммит код, который компилируется
- Предпочитают использовать переменные среды вместо жестко закодированных путей (абсолютных и относительных путей)
--hfrmobile
Гнат написал этот превосходный обзор различных советов, которые вы можете найти по стратегиям ветвления.
Там не одна стратегия ветвления, это то, что работает для:
- Размер вашей команды
- Ваш продукт и периоды жизненного цикла
- Используемая вами технология (веб, встраиваемые приложения, приложения для Windows)
- Ваш источник контроля, например, Git, TFS, Hg
Пост Джеффа Этвуда разрушает множество возможностей. Еще одно добавление - концепция продвижения (по ссылке Райана Даффилда). В этой настройке у вас есть ветка dev, test bracnh и ветка release. Вы продвигаете свой код до тех пор, пока он не достигнет ветки релиза и не будет развернут.
Альтернативой, которую я не вижу здесь, является философия "Ветви на переменах".
Вместо того, чтобы иметь свой ствол "Дикий Запад", что, если ствол - "Текущий выпуск"? Это хорошо работает, когда одновременно выходит только одна версия приложения, например веб-сайт. Когда необходима новая функция или исправление ошибки, создается ветвь для сохранения этого изменения. Зачастую это позволяет переносить исправления для выпуска по отдельности и предотвращает случайное добавление в код ковбойских кодов функции, которую вы не собирались выпускать. (Часто это бэкдор - "Просто для разработки / тестирования")
Указатели от Бена Коллинза весьма полезны для определения того, какой стиль будет подходить для вашей ситуации.
Мы разветвляемся, когда релиз готов к финальному контролю качества. Если какие-либо проблемы обнаружены во время процесса QA, ошибки исправляются в ветви, проверяются и затем объединяются в магистраль. Как только ветка проходит QA, мы помечаем ее как релиз. Все исправления для этого выпуска также вносятся в ветку, проверяются, объединяются в магистраль и затем помечаются как отдельный выпуск.
Структура папок будет выглядеть следующим образом (1 строка QA, 2 релиза исправлений и транк):
/ветви
/REL-1.0
/ теги
/REL-1.0
/REL-1.0.1
/REL-1.0.2
/хобот
Мы используем дикий, дикий, западный стиль git-веток. У нас есть несколько ветвей, которые имеют общеизвестные имена, определенные в соответствии с соглашением, но в нашем случае теги на самом деле более важны для нас, чтобы соответствовать требованиям корпоративной политики процессов.
Ниже я увидел, что вы используете Subversion, поэтому я думаю, что вам, вероятно, стоит проверить раздел о ветвлении в Subversion Book. В частности, обратите внимание на раздел "Расположение репозитория" в разделе " Обслуживание веток" и " Общие шаблоны веток".
Управление версиями для нескольких гибких команд Хенрика Книберга также имеет несколько положительных моментов.
Джефф Этвуд написал об этом в хорошем посте в блоге; в этом посте есть несколько важных ссылок.
В настоящее время у нас есть одна ветвь для текущего обслуживания, одна ветвь для "новых инициатив", что просто означает "вещи, которые появятся когда-нибудь в будущем; мы не уверены, когда". У нас также иногда возникали две ветки обслуживания: одна для исправлений того, что в настоящее время находится в производстве, и другая, которая все еще находится в QA.
Основным преимуществом, которое мы видели, является способность быстрее реагировать на запросы пользователей и чрезвычайные ситуации. Мы можем внести исправления в ветку, которая находится в производстве, и выпустить ее, не выпуская ничего лишнего, что, возможно, уже было проверено.
Основным недостатком является то, что в конечном итоге мы выполняем большое слияние между ветвями, что увеличивает вероятность того, что что-то будет пропущено или объединено неправильно. До сих пор это не было проблемой, но об этом обязательно нужно помнить.
До того, как мы внедрили эту политику, мы обычно делали всю разработку в транке и только разветвились, когда выпустили код. Затем мы исправили эту ветку по мере необходимости. Это было проще, но не так гибко.
Философия, которой мы придерживаемся на работе, заключается в том, чтобы держать транк в состоянии, когда вы можете нажать в любое время без значительного ущерба для сайта. Это не значит, что багажник всегда будет в идеальном состоянии. Там, конечно, будут ошибки. Но дело в том, чтобы никогда, никогда не оставлять это сломанным радикально.
Если у вас есть возможность добавить, ответвление. Смена дизайна, ветка. Было много раз, когда я думал: "О, я могу просто сделать это в багажнике, это не займет много времени", а затем 5 часов спустя, когда я не могу понять ошибку, которая ломает вещи, которые я очень хотелось, чтобы я разветвился.
Когда вы держите багажник в чистоте, вы даете возможность быстро применить и выпустить исправления ошибок. Вам не нужно беспокоиться о сломанном коде, который у вас есть, который вы легко разветвили.
Что касается Subversion, я согласен с комментарием Райана Даффилда. В главе, к которой он обращается, дается хороший анализ того, какую систему использовать.
Причина, по которой я спросил, состоит в том, что Perforce предоставляет совершенно другой способ создания веток из SVN или CVS. Кроме того, есть все DVCS, которые дают свою собственную философию ветвления. Ваша стратегия ветвления будет зависеть от того, какие инструменты вы используете.
К вашему сведению, Svnmerge.py - это инструмент, помогающий объединять ветви в SVN. Он работает очень хорошо, если вы используете его часто (каждые 10-30) коммитов, в противном случае инструмент может запутаться.
Это будет зависеть от того, какую систему контроля версий вы используете. Каждый VCS имеет разные подходы к ветвлению.
Какой VSC вы используете?
Независимо от того, какой шаблон ветвления выбран, вы должны стараться сохранять свои ветви в виде двоичного дерева, например:
trunk - tags
|
next
/ \ \
bugfix f1 f2
/ \ \
f11 f21 f22
- Дочерние узлы должны сливаться только с прямым родителем.
- Попробуйте лучше всего объединить всю ветку с родительской веткой. никогда не объединяйте подпапки в ветке.
- Вы можете выбирать коммиты по мере необходимости, если только вы сливаетесь и выбираете из целой ветви.
- Следующая ветвь на рисунке выше только для иллюстрации, она может вам не понадобиться.