Существует ли простой способ создать исправление в одной ветви и затем применить его к другой ветви в TFS 2010? - PullRequest
4 голосов
/ 12 января 2012

У меня есть две ветви пакета обновления, выходящие из одной «основной» ветви в TFS 2010. Я хочу «перенести» набор изменений из одной ветви пакета обновления в другую, не продвигая его через основную ветку и не осуществляя необоснованного объединения.

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

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

Существует ли простой способ создать патч в одной ветви и затем применить его к другой ветви?Нечто подобное в Subversion.

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

Ответы [ 4 ]

3 голосов
/ 12 января 2012

Итак, у вас есть что-то вроде этого:

------------------------------------> MAIN
      \          \
       \          \
        A          B

Вы можете сделать из ветви B 'B:

------------------------------------> MAIN
      \          \
       \          \
        A          B
                    \
                     \
                       B'

Тогда сделайте необоснованное слияние из A->B'. После этого сделайте слияние B'->B. Иди и уничтожь B'. Хотя я никогда этого не делал, это должно сработать.

2 голосов
/ 12 января 2012

Один подход:

  • Отобразите обе ветви (A и B) в отдельные папки на вашем ПК.
  • Найдите изменения в A, которые вы хотите объединить в B (смотритев журнале управления исходным кодом для ветви найдите наборы изменений и дважды щелкните их, чтобы просмотреть список размеченных файлов), и проверьте их в целевой ветви.(Альтернативы: проверить все файлы - TFS откажется от неизмененных файлов при регистрации. Или отключите сетевой кабель и затем запустите VS, и он отключится. После объединения используйте File> Source Control> Go online, чтобы вернуться в режим онлайн ипроверить все измененные файлы)
  • Использовать инструмент слияния (я бы рекомендовал Beyond Compare, Araxis, но все, кроме ужасных, которые должны поставляться с VS), чтобы объединить каждый файл в ветви A сeqiuivalent файл в ветви B
  • Построить и проверить ветку B
  • Регистрация

Это позволяет избежать использования TFS для какого-либо объединения, поэтому он не узнаетчто это слияниеПросто будет казаться, что вы написали много кода в ветви B довольно быстро: -)

Другой подход:

  • Слияние ревизии в основную ветку из AВо время слияния включите оба варианта кода и добавьте команды #if вокруг нового и старого блоков кода, чтобы они сосуществовали бок о бок, а пакет обновления "включен" в основной магистралипростым определением.По умолчанию это определение не должно быть определено, поэтому двоичный вывод по основному коду ветки не изменяется.то есть

    #if SERVICE_PACK_A  
        ...ServicePackA code...  
    #else  
        ...original Main branch code...  
    #endif
    
  • Теперь объедините изменения в ветку B

1 голос
/ 12 января 2012

На самом деле мне указали на другое решение, которое мне тоже нравится.http://geekswithblogs.net/TarunArora/archive/2011/06/06/unshelve-shelveset-created-from-one-branch-to-another.aspx

1 голос
/ 12 января 2012

Мой ответ похож на ответ Джейсона Уильямса. Если вы хотите остаться "внутри" TFS, то у вас есть только 2 варианта. Выполните необоснованное слияние или слияние с A на Main, а затем с Main на B.

Поскольку вы не хотите делать ни то, ни другое, вам нужно выполнить слияние "вне" TFS.

Инструменты, которые вам понадобятся: Team Explorer, Team Foundation Power Tools, сторонний инструмент слияния. Мне нравится Sourcegear DiffMerge (потому что он бесплатный), но Araxis, Beyond Compare и Winmerge будут работать одинаково хорошо. (кроме этого, вы можете настроить TFS для использования стороннего инструмента слияния (Еще раз спасибо, Джейсон!))

  1. Получайте последние новости в обеих ветках пакетов обновлений
  2. Проверить целевую ветку
  3. Используйте инструмент слияния для сравнения папок между двумя локальными папками
  4. Объединить соответствующие изменения от А до В
  5. В командной строке запустите tfpt uu для локальной копии B, это отменит извлечение любых файлов, которые не были изменены как часть слияния. (для этого необходимо, чтобы были установлены инструменты TFS Power.)
  6. Проверить ожидающие изменения в B

Это не здорово, но я думаю, что это единственный способ сделать то, что вы пытаетесь достичь

...