Неправильная стратегия ветвления TFS - как исправить

1

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

Вот диаграмма нашей текущей иерархии веток: Изображение 174551

Выглядит странно, но все началось с небольших изменений в последней ветке release то время как багажник был приостановлен в середине трехмесячной работы. Затем мы сделали несколько промежуточных релизов, основанных на предыдущем (до 1.1.4). Но когда мы начали выпуск 1.2.0, история с trunk повторялась, и мы должны были приостановить 1.2.0 и реализовать исправление 1.1.5.

Теперь я столкнулся с необходимостью слияния 1.1.5 изменений в ветки 1.2.0, что невозможно напрямую. Я могу только объединить 1.1.5 с 1.1.4, которого я хотел избежать (кто знает, возможно, нам нужно будет реализовать 1.1.6 на основе 1.1.4 завтра). Но, похоже, у меня нет другого выхода. Тем не менее, можно будет создать ветвь 1.1.6 от самой последней версии 1.1.4.

Это то, что я должен делать, и нет ли лучшего выхода?

И теперь возникают большие проблемы и главный вопрос. В конце концов мне нужно будет объединить все изменения в trunk. И проблема 1.1.5-1.2.0 - это просто миниатюрная копия этого. Вот почему я задаю оптимальный и наименее рискованный способ выполнить это слияние.

Мой текущий план таков:

  1. Создайте ветку "1.1.4 final" с последней стабильной выпущенной версией.
  2. Необязательно: создайте похожие ветки для всех предыдущих выпусков с номерами. Я должен сделать это? Скорее всего, мне больше не понадобятся эти версии в будущем.
  3. Слить 1.1.5 в 1.1.4
  4. Слить 1.1.4 в 1.2.0. Изменений в 1.1.5 не было, поэтому я не должен сталкиваться с проблемами здесь.
  5. Сверните 1.1.4 в 1.1.3, 1.1.2 и до ветки release. Должен ли я ожидать конфликтов или проблем здесь? Я ожидаю и надеюсь, что нет.
  6. Объединить release в trunk. Самая страшная часть =)
  7. Стабилизировать код в trunk.
  8. Теперь настало время создать лучшую ветвящуюся стратегию... На данный момент я очень не уверен в этой части.
  9. Создайте новую " stable " (основную) ветку из trunk
  10. Резервный trunk чтобы стать ребенком stable. Это решение предлагается в смежном вопросе " Как исправить неверное ветвление TFS "
  11. Должен ли я удалить текущие ветки " release " и " R*** " или оставить их в качестве мусора?
  12. Для следующих выпусков выпуска не создаются отдельные ветки - вместо этого отметьте окончательные изменения в устойчивой ветке. На самом деле " stable " ветвь будет состоять только из проверок окончательного релиза.
  13. Я НЕ собираюсь создавать ветвь " integration " для обеспечения стабильных характеристик - в настоящее время мы все живем в единой активной ветке без проблем.
  14. Создайте " alternate " ветвь, основанную на stable для развития паралога, в случае, если нам понадобится еще раз приостановить текущую работу, чтобы сделать некоторые срочные исправления. Должен ли я хранить одну альтернативную ветвь навсегда или удалять ее после объединения и создавать новую (например, R125), когда это необходимо?

Изображение 174551

Идея этого изменения состоит в том, чтобы иметь фиксированное ограниченное количество ветвей (в идеале 2, самое большее 3-4).

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

  • 0
    Нужно ли поддерживать старые выпуски с помощью исправлений, или старые ветки по существу рудиментарны после выхода кода?
  • 0
    @DanielMann, нам никогда не требовалось выпускать исправления для более старых версий, чем предыдущий. Я думаю, что этого не произойдет и в ближайшее время. Таким образом, ветви R113, R112, "выпуск" являются Gargabe сейчас и присутствуют только для истории.
Показать ещё 1 комментарий
Теги:
tfs
merge
version-control
branch

3 ответа

0
Лучший ответ

Наконец, я сформовал это слияние! Спасибо @DaveShaw за рекомендации, я в основном использовал их. Но хочу публиковать мое изобретение, которое, по моему мнению, значительно сэкономило время.

Вместо выполнения необоснованного слияния из R120 непосредственно в trunk я создал внутреннюю ветвь dev из общей корневой версии R120 и trunk и предварительно сформировал необоснованное слияние из R120 в dev. Это создало более 600 файлов с конфликтами! Но их было легко разрешить - возьмите все с R120.

Тогда, поскольку ветки dev и trunk имеют общий корень, я мог бы объединить их с регулярным слиянием (не беспочвенным). Это было намного лучше, чем необоснованное, и создало только 11 файлов с конфликтами, и я мог разрешить их всего за один день - все это были реальные конфликты, требующие ручного разрешения и редактирования кода для слияния. Таким образом, это спасло мне время, чтобы отличить реальные 11 конфликтующих файлов от 600 тех, которые не являются реальными конфликтами и могут быть решены автоматически.

Затем я стабилизирую обе ветки и переключу их роли (оказалось, что в настоящее время dev играет main (стабильную), а trunk сломан). Поэтому я решил использовать ветвящуюся стратегию "Изоляция развития", которая скоро будет развиваться до "изоляции разработки, функциональности и выпуска".

Для большинства моих оставшихся вопросов @DaveShaw предоставил хорошие объяснительные ответы, мне нечего добавить.

1

Это то, что я должен делать, и нет ли лучшего выхода?

Я тщательно выполнял необоснованное слияние всех изменений из ветвей, release в trunk. Я бы сделал это один филиал за раз и объединил "Все изменения до определенной версии" и выделил всю "Последняя версия". Это даст вам багажник, который содержит все изменения из ваших релизов.

Должен ли я ожидать конфликтов или проблем здесь?

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

Обычный процесс при работе с ветвями выпуска (даже те, которые напрямую не связаны с trunk) заключается в проверке в ветки релиза, а затем в RI (обратная интеграция) объединить изменение обратно в trunk. Некоторые люди предпочитают сначала проверять trunk а затем сливаются в ветку выпуска, чтобы избежать ситуации, когда trunk может быть забыт. Это шесть из одного, полдюжины других ИМО.

Должен ли я удалить текущие ветки "выпуска" и "R ***" или оставить их в качестве мусора?

Я не думаю, что это важно, вы можете перенести их в папку с obsolete releases если вы хотите скрыть их или просто удалить их - удаленные TFS будут мягкими.

Поделитесь своими мыслями и проблемами с моей стратегией или предложите лучшую

Я бы не стал stable. Как только у меня было все в trunk я был бы счастлив, цель магистрального/основного ветки - быть стабильной версией кода, если разработчики не смогут ее поддерживать (я не обвиняю их BTW), а затем работаю в ветких функций, и регулярное объединение FI в филиал функции - лучший способ.

Куда вы идете дальше, действительно зависит от процесса, который ваша компания имеет для релизов. Один из вариантов заключается в "маркировке" trunk когда у вас есть релиз, который вы хотели бы.

Start -----L:R1-----C->

Если вам нужно будет исправить ошибку до выпуска, вы можете разветкиться с метки:

Start -----L:R1-----C->
           |    /
     B:R1  |--C/

Проверьте изменение в ветки R1 (B: R1) и объедините его обратно в trunk.

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

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

И, наконец, мой вопрос для всех, кто хочет создать филиал, - "Как вы отпустите этот код?", Это помогает мне создавать ветки для решения проблем, а не для создания проблем. Если я не знаю, как будет выпущен код, я не знаю, как лучше всего структурировать ветки - я когда-то был вовлечен в проект с иерархией из 23 веток от Main, что все собралось вместе, прежде чем протестированы или выпущены - мы могли бы использовать один :).

Последнее, если у вас есть учетная запись VSOnline или другая коллекционная коллекция Team Project, вы можете попробовать пересоздать более простую версию своей проблемы и поэкспериментировать с решениями.

  • 0
    Спасибо за ответы. Это выглядит достаточно хорошо для реализации. Кроме того, воссоздание и тестирование стратегии песочница является обязательным шагом. Я собираюсь в отпуск через 30 минут, так что проверю ваш ответ через 2 недели, чтобы наконец просмотреть, проверить и принять его.
  • 0
    Удачи и приятного отдыха - пожалуйста, не думайте о ветвлении в течение 2 недель :)
Показать ещё 2 комментария
0

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

Мы используем три ветки Dev, Test, Release.

большинство построек от dev и помечены. (так же, как туловище на вашей диаграмме). Затем мы переместим его на qa и продолжим развитие. Если в будущей разработке есть проблема \bug и ветвь Dev, мы устанавливаем ветвь тестирования на метку и исправляем проблему на тестовой ветке и объединяем ее для dev и снова и берем метку. Если у нас есть проблема с продукцией, мы используем метку в релизе, исправляем проблему, маркируем ее и, конечно, объединяем ее в dev. Это как все это делается с использованием трех ветвей.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню