Как я могу работать как по умолчанию, так и филиал в Hg? - PullRequest
3 голосов
/ 05 мая 2011

ОК, я новичок в Mercurial и в ветвлении управления версиями в целом, поэтому у меня может быть принципиальное недопонимание того, что здесь происходит - пожалуйста, будьте добры ...;)

Мы маленькиеКоманда разработчиков (2 разработчика) работает над проектом, и нам нужно внедрить довольно существенные изменения, которые могут занять недели или месяцы.В то же время программа используется ежедневно, поэтому нам необходимо регулярно вносить исправления и исправления.

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

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

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

Мы запускаем последнюю версию TortoiseHg для Windowsи по большей части я люблю графический инструмент.Тем не менее, я совершенно готов зайти в командную строку для выполнения определенных задач, когда это необходимо.

Спасибо за любую помощь, Дейв

Ответы [ 5 ]

2 голосов
/ 05 мая 2011

Это зависит от того, какую ветку вы создали.

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

Рабочий процесс с именованной веткой, один репо / рабочий каталог

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

Если вы хотите работать с веткой default, обновите ее, исправьте ошибки и зафиксируйте эти изменения. Не объединяйте изменения из ветки dev1.

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

Если вы работаете в ветке dev1 и коллега исправляет ошибку в default, которая вам нужна, фиксируйте свою работу, извлекайте их изменения, объединяйте их и затем возобновляйте свою работу (есть ярлыки, которые вы можете использовать здесь, но таким образом вы можете отказаться от слияния, если оно станет грязным)

Примечание. Все они предполагают, что все ваши изменения зафиксированы в точке, в которую вы хотите переключиться между ветвями dev1 и default.

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

Безымянный рабочий процесс филиала, использующий dev1 репо, клонированный из рабочего репо

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

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

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

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

Опять же, важно отметить, что вы получаете изменения из вашей ветки dev1 в default только тогда, когда вы отправляете их в производственный репозиторий default. Если вы только извлекаете / объединяете default наборов изменений в клон dev1, тогда ваша ветвь функций будет обновляться до default, поэтому, когда вы будете готовы развернуть эту функцию в ветке default, вы можете сделать это с помощью одной простой операции нажатия.

2 голосов
/ 05 мая 2011

Да, вы можете сделать это с Mercurial.

Во-первых, в случае, если вам неясно (это было не так для меня некоторое время), в Mercurial есть 3 типа «веток» :

  • клонировать репозиторий
  • именованная ветвь (с помощью команды hg branch)
  • анонимная ветка, которой вы можете управлять с помощью закладок или просто запоминая набор изменений

Полагаю, вы использовали метод hg branch. Имейте в виду, что это часто , а не , что вы хотите, потому что это имя ветви будет жить в истории репо всегда (ну, есть опция --close-branch, но все же ...).

Основной рабочий процесс:

  • обновление до ветки dev с hg up devbranch
  • зафиксировать изменения в ветке dev
  • объединить с основной веткой через hg merge default или просто hg merge по желанию
  • (повторите по желанию)

А для работы в ветке по умолчанию:

  • обновить ветку по умолчанию с hg up default
  • зафиксировать изменения
  • (повторите по желанию)

НЕ делайте этого:

  • обновить ветку по умолчанию с hg up default
  • объединить с веткой dev с hg merge

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

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

Вы не хотите запустить hg merge из ветки по умолчанию.

1 голос
/ 05 мая 2011

Это предложение:

После слияния, если я обновляюсь до значения по умолчанию, у меня теперь есть изменения с dev1, слитые в источник.

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

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

Направление в том смысле, что направление играет роль в результате.Что касается фактического содержимого файла, то не имеет значения, в каком направлении вы объединяетесь, но новый слитый набор изменений, который вы фиксируете, будет находиться в той ветке, в которой вы находились, когда вы инициировали объединение (если вы не переопределяете).* Итак, сначала обновите заголовок dev1, затем объедините с default, и после фиксации у вас должна быть новая ревизия в ветке dev1, но default следует оставить в покое.

1 голос
/ 05 мая 2011
# bang on dev1
# more banging on dev1
# someone beats on default for a while
# update to dev1
hg up dev1
# bring in the changes from default
hg merge -r default
# validate successful merge
hg commit -m "merging"

Ключ фиксируется на dev1, когда вы вносите изменения по умолчанию.

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

0 голосов
/ 05 мая 2011

Это скорее подсказка, чем ответ, но ...

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

...