Каков оптимальный диапазон количества живых ветвей?

Допустим, проект:

  • 1 продукт
  • построен более Y лет
  • состоящий из M модулей
  • написано на L [1..3] языках
  • разработано в общей сложности D разработчиками

В какой момент проект содержит слишком много или слишком мало живых ветвей?

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

Фон

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

Если ветвей слишком много, разработчики не уверены, куда должны идти их изменения и куда они должны распространяться, какая ветвь будет объединена с каким стволом. Слияние отрефакторенного кода очень сложно, качество падает. Более того, каждому разработчику приходится тестировать свои изменения в нескольких сетапах, тратятся значительные усилия, замедляется разработка.

Каков оптимальный диапазон количества живых ветвей?


person Dima Tisnek    schedule 23.01.2013    source источник
comment
Как вы думаете, вы могли бы расширить то, что, по вашему мнению, вредно для такого большого количества ветвей? Это слишком много, чтобы следить за вами/другими разработчиками? Система работает медленно? Я не думаю, что на самом деле существует правило, основанное на этих параметрах, вы должны смотреть на отдельные ветки, чтобы решить, полезны они или нет. Поэтому определение того, почему вы считаете, что их слишком много, может помочь в этом.   -  person Andy    schedule 23.01.2013
comment
Ха! Я только что заработал Популярный вопрос именно по этому вопросу, который вы многие сочли неконструктивным. подтверждено   -  person Dima Tisnek    schedule 09.02.2014


Ответы (7)


Как определить, что RCS (svn или git) содержит слишком много веток?

Как насчет rule of 3:

  • Одна ветка для стабильного кода — основной ствол;
  • Одна ветка для нестабильной версии — разработка предстоящего релиза;
  • И еще на обслуживание — исправления ошибок предыдущего релиза;

Многие проекты, размещенные на git, используют только две ветки: master для основного ствола и vNext для будущего релиза.

Используйте функцию tags для обозначения этапов разработки.

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

Попросите разработчиков добавить осмысленные имена и описания в локальные ветки. И лейбл фиксирует соответственно.

person shytikov    schedule 28.01.2013
comment
Спасибо за ответ, наконец-то кто-то осмелился поставить цифру в свой ответ! - person Dima Tisnek; 28.01.2013

На этот вопрос нет единого ответа. Это может быть только «то, что работает для вашей организации и рабочего процесса».

ИМХО, как только ветка изжила себя (например, все изменения слиты обратно в ствол. Или неудачный эксперимент/исследовательский проект, который был заброшен или завершен), ее следует удалить. Вы всегда можете получить его обратно, если вам это нужно, и это поможет сохранить порядок.

Основываясь на вашем редактировании: если есть ветки, которые устарели или «мертвы», почему они все еще существуют? По определению от них больше нет никакой пользы, поэтому просто удалите их.

person alroc    schedule 23.01.2013
comment
неответы не принимаются - person Dima Tisnek; 27.01.2013
comment
Тогда я не верю, что вы никогда не получите здесь ответ, который, по вашему мнению, вы можете принять. Невозможно количественно оценить это таким образом, чтобы это соответствовало требованиям произвольного проекта. - person alroc; 27.01.2013

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

Главное — последовательность. Попробуйте сгруппировать ветки, чтобы они соответствовали вашему рабочему процессу. Вы можете, например, иметь

  • stable — CI строит производство и/или постановку на основе этого
  • staging - промежуточная сборка CI из этого
  • feature/* - ветки для фич
  • hotfix/* - запускается из промежуточной/стабильной ветки, используется для исправлений
  • experimental/* — используется для функций НИОКР, которые могут не привести к чистому и поддерживаемому коду или могут быть заброшены на полпути.

Несколько основных советов здесь: http://nvie.com/posts/a-successful-git-branching-model/

Кроме того, если вы хотите, чтобы ваша команда быстро начала использовать хорошую структуру ветвей, попробуйте git flow: http://jeffkreefmeijer.com/2010/why-arent-you-using-git-flow/

О рефакторинге плохого кода других сотрудников. Вы можете использовать некоторые ветки refactor/*, чтобы вы могли легко увидеть, что сломано, имея атомарные слияния/перебазирования в отдельной ветке. Конечно, иметь тесты ЧРЕЗВЫЧАЙНО полезно, но если вы не сделаете простой git bisect, он покажет вам, кто и когда внес ошибку (и если вы напишете тест для проверки этой ошибки, который bisect будет использовать, у вас теперь есть значимый тест для добавления к вашему набору тестов).

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

РЕДАКТИРОВАТЬ: Под something/* я подразумеваю наличие нескольких ветвей с общим префиксом something/, таким образом имитируя структуру каталогов.

РЕДАКТИРОВАТЬ2: В SVN все по-другому, где ветвление и слияние не так уж и дешевы. Действовать с осторожностью ;)

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

РЕДАКТИРОВАТЬ4: В: "Можете ли вы, возможно, подумать о том, чтобы поставить некоторые числа или формулы на пороге, ниже которого допустимо беспорядочное ветвление и выше, какие ветки лучше организовать?"

Конечно!

Формула (по моему скромному мнению) проста.

  • иметь столько «грязных» веток локально, сколько хотите (просто не передавайте их другим людям или общим репозиториям)
  • старайтесь не продвигать грязные ветки, если они не представляют ценности для других разработчиков. Если они уже есть в вашем общем репозитории, сохраните их и переименуйте (на ум приходит legacy/* или просто dirty/*).

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

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

Позвольте мне привести вам пример PHP-проекта Symfony2 малого и среднего размера, над которым я работал.

Если у вас есть проект, который в течение 6-9 месяцев активно разрабатывается 5 разработчиками в гибкой (scrum) манере с демо-версией клиента каждые две недели, вы можете захотеть иметь ветки:

  • на пользовательскую историю (для тесно интегрированных пользовательских историй это может быть плохой идеей), всего около 50 ветвей, думайте о них как о функциональных ветвях.
  • на одного разработчика (по требованию, если разработчику нужно какое-то время над чем-то поработать), они приходят и уходят, но обычно в таких проектах у разработчиков меньше 3. Некоторые из них вообще не используют общедоступные ветки разработчиков и держат свои грязные ветки при себе.
  • экспериментальный (неограниченное количество веток для исследовательских целей, например другой алгоритм или библиотека, используемая в модуле), около 7 веток, насколько я помню
  • за спринт (объединено из пользовательских историй, полезно для демонстрации), около 10, это наша промежуточная/стабильная во время первоначальной разработки. Почему не теги? Теги тоже, но ветки, потому что легче применить исправление.
  • исправления (обычно недолговечные, изолированные для облегчения сбора вишни), 3 вершины;)
  • разное (обычно текущие общесистемные функции и/или ветки команды из 2-3 человек), около 10

Как видите, здесь тоже нет точного числа. Я сделал несколько проектов такого размера, и у большинства из них было около 70-80 веток (20-30 без веток пользовательской истории). Если они организованы логично и понятно, репозиторий кода легко просматривать.

С git рассмотрите также перебазирование вместо слияния, поэтому вы не получите пузыри слияния (ознакомьтесь с этой статьей http://stevenharman.net/git-pull-with-automatic-rebase).

person Chris Hasiński    schedule 26.01.2013
comment
Хорошая ссылка; вы упомянули, что я должен подумать об организации веток лучше, не могли бы вы подумать о том, чтобы поставить некоторые числа или формулы на пороге, ниже которого беспорядочное ветвление приемлемо и выше, какие ветки лучше организовать? - person Dima Tisnek; 28.01.2013
comment
Я бы предложил превратить эти исторически интересные ветки в теги, чтобы уменьшить отвлекающий беспорядок. - person Lee Meador; 28.10.2020

Для Git и SVN есть разные способы просмотра этого. Но самое главное, что значит иметь слишком много чего-то, по причинам производительности или по причинам организации.

Итак, производительность git:

В git ветка — это не что иное, как ссылка на объект, являющийся частью репозитория git. Таким образом, для этого объекта филиала нет серьезных накладных расходов. (см. http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is для получения дополнительной информации) Если вы уничтожите ветку, у вас все еще будет ВСЯ история git в вашем репозитории, это просто вопрос доступа к ней. В общем - лишнего хранилища для ветки нет. Если вы используете одноразовые ветки, удалите их, но ваши коммиты все еще существуют. Общая производительность git замедляется из-за размера репо, но ветки не создаются для его увеличения, а коммиты. Вы можете перепаковать или удалить объекты, чтобы очистить и ускорить репозиторий git.

Итак, производительность SVN:

В SVN ветки — это копии вашего рабочего дерева, однако эти копии не являются дубликатами данных. Опять же, это ссылки на существующее дерево, пока используется svn-copy. (см. http://svnbook.red-bean.com/en/1.1/ch04s02.html#svn-ch-4-sect-2.1 для получения дополнительной информации) SVN хорошо обрабатывает большие файлы и репозитории, но опять же, размер репозитория не сильно зависит филиалами, вместо этого они эффективны и дешевы. Собственно говоря, цитируя svnbook: "Суть здесь в том, что копии дешевы, как по времени, так и по пространству. Делайте ветки сколько хотите."

Организация SVN и git:

Ну, как я сказал выше, ветвление дешево, поэтому это может происходить часто, одноразовые ветки нужно удалять, но исторические ветки дешево хранить. По сути, у вас должен быть простой способ назвать ваши ветки по соглашению: release_1, bugfix_200, temp_branch_for_fun — все, что делает имя самоорганизующимся при их алфавитно-цифровом перечислении. Использование тегов также хорошо, как в SVN, так и в git — люди, как правило, чувствуют себя более комфортно с ветками, однако в git они действительно одинаковы, а в SVN они полезны для отсчета точек во времени.

Сколько слишком много ветвей - это решение бизнес-логики. Я предпочитаю иметь много одноразовых веток для Work In Progress, но иметь только исторические ветки для релизов. Но это хорошо только в итеративном рабочем процессе. В последнее время я перемещаю разработку в сторону рабочего процесса непрерывной доставки и распределенной сети git forked - тогда мне все равно, сколько ветвей имеет git fork разработчика - вместо этого мой исходный или основной репозиторий имеет только 1 постоянную ветвь: master и одноразовые ветки для исправлений с высоким приоритетом.

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

Все счастливы.

person Michael    schedule 27.01.2013
comment
Хорошая запись! Вот как я оцениваю ваш ответ для рабочего процесса CD: всего 2 традиционные живые ветки (магистраль и исправление) плюс ветки функций D или D * Const. Это примерно так? - person Dima Tisnek; 28.01.2013
comment
хорошо - в идеале одновременно существует только 1 ветка исправлений, и это одноразовые ветки исправлений, поэтому они не долговечны. А в остальном да, действительно всего 1 традиционная ветвь. - person Michael; 28.01.2013

Как определить, что RCS (svn или git) содержит слишком много веток?

Никто. Такого общего правила не существует и (если какое-либо локальное все еще может быть определено), наконец, оно сильно зависит от команды и рабочего процесса.

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

Перенесено из комментария:

1-N не закрытых веток задач на разработчика (N зависит от множества факторов) 1-2 активных на разработчика + несколько общих (стабильный-нестабильный-релиз-...)

person Lazy Badger    schedule 23.01.2013
comment
Хорошо, ленивый барсук, каково тогда разумное среднее количество ветвей или разумное количество активных ветвей в любой момент времени? - person Dima Tisnek; 23.01.2013
comment
@qarma - 1-N не закрытых веток задач на разработчика (N зависит от множества факторов) 1-2 активных на разработчика + несколько общих общих (стабильных-нестабильных -вышел-...) - person Lazy Badger; 23.01.2013
comment
@LazyBadger, ха-ха, отличное объяснение ^__^ - person bahrep; 23.01.2013
comment
@LazyBadger, не могли бы вы включить свой комментарий в ответ, пожалуйста? - person Dima Tisnek; 28.01.2013

Ветки в git считаются одноразовыми. Если вам это не нужно и вы не будете использовать его снова, вы его бросаете. Однако в моем случае я управляю множеством ветвей, но только 1% из них используется. Я заблокировал остальные и убедился, что к версии релиза применены правильные теги.

Возможно, вам потребуется определить, активны ли все рассматриваемые ветки одновременно. Так как у вас может быть 100 ветвей, но только 1 используется. Но если у вас должно быть 100 активных веток для 1 проекта, то ДА, я скажу, что это слишком много, и это просто показывает плохое управление.

Надеюсь, это поможет!

person Geddon    schedule 23.01.2013
comment
Не могли бы вы сузить свой ответ с [1..100] до меньшего диапазона? Будь то номер или форумла? Спасибо! - person Dima Tisnek; 28.01.2013
comment
Это все еще очень сложно, так как вопрос может быть по-разному интерпретирован разными менеджерами конфигурации. Например: я управляю несколькими продуктами с помощью разных инструментов контроля версий, включая svn, git, clearcase, mks и т. д., каждый из которых имеет несколько проектов. В зависимости от проекта и команды я создал структуру, которая может соответствовать их модели разработки. Таким образом, это определило, сколько активных ветвей я получу. Один фактор, который вы не учли, — это то, что ваши разработчики D разбиты на команды «T». Предполагая, что нет, исходя только из факторов, которые вы дали, я выставлю это число: - person Geddon; 29.01.2013
comment
P = проект, R = выпуск, Y = количество выпусков в год, M = количество модулей 1 продукт изначально => основная ветвь, ветвь сборки, ветвь разработки (предполагается отсутствие команды, поэтому разработка выполняется в одном потоке). D в данном случае не имеет значения; все разработчики будут иметь один и тот же путь развития. = 3 ветки - person Geddon; 29.01.2013
comment
1 релиз => ветка релиза, ветка исправления = 2 ветки Более Y => R Произошло выпусков = Y * (2R) 1 модуль => 1 ветка разработки (обычно после слияния обратно в основную ветку разработки она удаляется) Таким образом, в конкретной системе контроля версий , мое эмпирическое правило будет выглядеть примерно так: (3P + 2R + M)*Y. После технического обслуживания оно будет выглядеть так: (3P+2R)*Y + Y, я добавил дополнительную букву «Y», потому что каждый крупный выпуск вам понадобится. взять базовую линию или тег. - person Geddon; 29.01.2013
comment
спасибо, я очень рад видеть эти формулы! - person Dima Tisnek; 30.01.2013

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

person jthill    schedule 26.01.2013