Как обновить ветку, чтобы она была в состоянии тега на другой ветке в Mercurial? - PullRequest
2 голосов
/ 18 апреля 2011

У меня есть хранилище с веткой master и develop.

Я хочу создать третью ветку с именем, скажем, она называется bugfixes.

Я хочу иметь возможность обновиться до bugfixes, а затем совет bugfixes будет таким же, как предыдущий тег на master.(Скажем, этот тег называется Release5.1).

Я попытался обновить ветку, а затем обновить ее до тега, но это переключает ветвь обратно на master (где находится тег).Я также пытался объединить

hg merge -r Release5.1

, но это только внесло изменения и не привело к тому, что ветвь «вернулась во времени».

Какя могу получить этот тег на верхушке именованной ветви?

Я задаю этот вопрос, потому что мой парень из CruiseControl.net говорит мне, что мы можем делать только сборки из подсказок ветвей, а не изконкретные ревизии.(Может быть, это другой вопрос ....)

Ответы [ 2 ]

2 голосов
/ 18 апреля 2011

Сначала некоторые основы:

Слияния носят направленный характер:

  • При слиянии bugfixes в master, затем master получает наборы измененийкоторые были зафиксированы в ветви bugfixes.
  • Когда вы объединяете master в bugfixes, происходит обратное.

Если вы хотите, чтобы две ветви отражали друг друга, тогда вы должны выполнить слияние в обоих направлениях.


Я бы сказал, что вам вообще не нужна ветка bugfixes. Вместо этого я бы установил политикув котором говорится:

  • master всегда должно быть в состоянии, которое может быть выпущено
  • Исправления ошибок фиксируются в master
  • Все выпуски помечены тегамиmaster
  • Новые функции передаются в develop
  • Когда наступает время выпуска, develop объединяется в master
  • После каждого выпуска, master объединен с develop, чтобы гарантировать, что новые функции основаны на последней версии.

Это приведет к чему-то вроде этого:

workflow with no bugfixes branch


Если у вас должна быть ветка bugfixes, тогда я устанавливаю такую ​​политику:

  • master всегда должно бытьв состоянии, которое может быть выпущено
  • Все выпуски являются тегами master
  • Исправления ошибок фиксируются в bugfixes
  • Новые функции фиксируются в develop
  • Когда пришло время для исправления ошибки:
    1. Объединить bugfixes в master
    2. Метка master
    3. Объединить masterв bugfixes, чтобы они соответствовали
    4. Объедините master в develop, чтобы убедиться, что новые функции основаны на последней версии.
  • Когда придет времядля основного выпуска:
    1. Слияние bugfixes в master
    2. Слияние develop в master
    3. Метка master
    4. Слияниеmaster в bugfixes, чтобы они соответствовали
    5. Слияние master в develop, чтобы убедиться, что новые функции основаны на последних

Это приведет к чему-то похожему на это:

workflow with bugfix branch


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

hg update <TAG>
hg branch Release1.x
<fix the bug>
hg commit -m "Bug fix to older version"
hg tag Release1.2

...if the bug is present in master, then you should also:
hg update master
hg merge Release1.x
hg commit -m "merged bug fix in Release1.x to master"

Это приведет к чему-то вроде этого:

bug fix to older release

ПРИМЕЧАНИЕ 1: На данный момент master имеет коммиты, которые никогда не должны быть частью Release1.x релиза.В связи с этим вам никогда не следует сливать master в Release1.x.

ПРИМЕЧАНИЕ 2: Если вам требуется поддержка нескольких выпусков продукта в поле, обычно бываетименованная ветка для каждого основного выпуска.Эти продолжительные именованные ветви затем используются только для исправления ошибок.Если вы очень осторожны, вы можете объединить исправления ошибок из одной ветки релиза в другую, но, по моему опыту, для копирования изменений между ветвями чаще используется hg transplant.

1 голос
/ 18 апреля 2011

Я бы посоветовал вам оставить ветку bugfixes, по существу, зеркалом ветки master, за исключением случаев, когда вы исправляете ошибку, и как только ошибка исправлена, объедините bugfix обратно в master и снова синхронизировать их.

Если вам нужно поддерживать несколько старых версий master, вам, вероятно, потребуется иметь bugfix именованную ветвь для каждой старой версии, которую вы хотите поддерживать.

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

  1. Обновление тега, на котором вы хотите основать исправление
  2. Внести изменения
  3. Фиксация (это сделает неназванную ветвь)
  4. Сборка / тестирование кончика новой безымянной ветки
  5. Отметить новую версию
  6. Объедините по необходимости, чтобы все строки кода получили исправление ошибки

Из-за того, как работает внутренняя хеш-структура Mercurial, разматывание изменений из «стека» (или вставка новых наборов изменений в стек, в зависимости от того, как вы на это смотрите) является действительно очень сложной задачей и, вероятно, сломайте все репозитории, которые были клонами того, над которым вы работаете.

...