Похоже, что в конечном итоге мы перевели наш проект на плохую стратегию ветвления - "Каскадировать" (в вопросе " TFS - Устойчивость каскадных ветвей " это было признано фактически жизнеспособным). Теперь, прочитав несколько статей и увидев, что это ведет к бесконечному ветвящемуся дереву, я понял, что это плохо и хочу исправить его. Но это было не так просто, как я ожидал. TFS позволяет слияния только с родительскими ветвями (слияние братьев и сестер невозможно).
Вот диаграмма нашей текущей иерархии веток:
Выглядит странно, но все началось с небольших изменений в последней ветке 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 - это просто миниатюрная копия этого. Вот почему я задаю оптимальный и наименее рискованный способ выполнить это слияние.
Мой текущий план таков:
release
. Должен ли я ожидать конфликтов или проблем здесь? Я ожидаю и надеюсь, что нет.release
в trunk
. Самая страшная часть =)trunk
.stable
" (основную) ветку из trunk
trunk
чтобы стать ребенком stable
. Это решение предлагается в смежном вопросе " Как исправить неверное ветвление TFS "release
" и " R***
" или оставить их в качестве мусора?stable
" ветвь будет состоять только из проверок окончательного релиза.integration
" для обеспечения стабильных характеристик - в настоящее время мы все живем в единой активной ветке без проблем.alternate
" ветвь, основанную на stable
для развития паралога, в случае, если нам понадобится еще раз приостановить текущую работу, чтобы сделать некоторые срочные исправления. Должен ли я хранить одну альтернативную ветвь навсегда или удалять ее после объединения и создавать новую (например, R125), когда это необходимо?
Идея этого изменения состоит в том, чтобы иметь фиксированное ограниченное количество ветвей (в идеале 2, самое большее 3-4).
Пожалуйста, поделитесь своими мыслями и проблемами с моей стратегией или предложите лучшую. Я спрашиваю, потому что не уверен, что все будет работать так, как я ожидаю, не знаю, проще ли это, а стоимость ошибки огромна.
Наконец, я сформовал это слияние! Спасибо @DaveShaw за рекомендации, я в основном использовал их. Но хочу публиковать мое изобретение, которое, по моему мнению, значительно сэкономило время.
Вместо выполнения необоснованного слияния из R120
непосредственно в trunk
я создал внутреннюю ветвь dev
из общей корневой версии R120
и trunk
и предварительно сформировал необоснованное слияние из R120
в dev
. Это создало более 600 файлов с конфликтами! Но их было легко разрешить - возьмите все с R120
.
Тогда, поскольку ветки dev
и trunk
имеют общий корень, я мог бы объединить их с регулярным слиянием (не беспочвенным). Это было намного лучше, чем необоснованное, и создало только 11 файлов с конфликтами, и я мог разрешить их всего за один день - все это были реальные конфликты, требующие ручного разрешения и редактирования кода для слияния. Таким образом, это спасло мне время, чтобы отличить реальные 11 конфликтующих файлов от 600 тех, которые не являются реальными конфликтами и могут быть решены автоматически.
Затем я стабилизирую обе ветки и переключу их роли (оказалось, что в настоящее время dev
играет main
(стабильную), а trunk
сломан). Поэтому я решил использовать ветвящуюся стратегию "Изоляция развития", которая скоро будет развиваться до "изоляции разработки, функциональности и выпуска".
Для большинства моих оставшихся вопросов @DaveShaw предоставил хорошие объяснительные ответы, мне нечего добавить.
Это то, что я должен делать, и нет ли лучшего выхода?
Я тщательно выполнял необоснованное слияние всех изменений из ветвей, 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, вы можете попробовать пересоздать более простую версию своей проблемы и поэкспериментировать с решениями.
Ваша стратификация слияния выглядит нормально для меня, но я постараюсь закончить с диаграммой трех ветвей.
Мы используем три ветки Dev, Test, Release.
большинство построек от dev и помечены. (так же, как туловище на вашей диаграмме). Затем мы переместим его на qa и продолжим развитие. Если в будущей разработке есть проблема \bug и ветвь Dev, мы устанавливаем ветвь тестирования на метку и исправляем проблему на тестовой ветке и объединяем ее для dev и снова и берем метку. Если у нас есть проблема с продукцией, мы используем метку в релизе, исправляем проблему, маркируем ее и, конечно, объединяем ее в dev. Это как все это делается с использованием трех ветвей.
Конечно, вы всегда можете использовать ветки функций для длинных и дезактивных функций.