как я могу работать как по умолчанию, так и по ветке одновременно в Hg?

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

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

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

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

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

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

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


person DaveN59    schedule 05.05.2011    source источник
comment
Для тех, кто может попасть в ситуацию, в которую попал я, вот как я это исправил.   -  person DaveN59    schedule 05.05.2011
comment
Упс. Думал, что смогу получить новую строку в комментарии, глупый я... Я клонировал поврежденный репо, обновился до ветки dev1, отбросив все незафиксированные изменения, и вуаля! Теперь у меня есть 2 отдельные ветки. Затем я стер свое исходное репо и клонировал исправленное. До сих пор не знаю, как я попал в то состояние, в котором был, хотя...   -  person DaveN59    schedule 05.05.2011


Ответы (5)


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

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

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

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

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

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

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

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

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

Рабочий процесс безымянной ветки с использованием репозитория dev1, клонированного из производственного репозитория

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

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

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

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

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

person Mark Booth    schedule 05.05.2011
comment
Я использую именованные ветки, спасибо за разбивку. Я считаю, что графический инструмент не сделал того, что я ожидал, поэтому с этого момента я буду использовать командную строку, чтобы делать то, что я могу получить немного... - person DaveN59; 05.05.2011
comment
Я отмечаю это как ответ, как для этого ответа, так и для комментария к другому ответу ниже. Спасибо! - person DaveN59; 05.05.2011

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

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

  • клонировать репозиторий
  • «именованная ветвь» (используя команду 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 из ветки по умолчанию.

person jwd    schedule 05.05.2011
comment
Я был очень осторожен, чтобы НЕ выполнять слияние, когда по умолчанию была моя текущая ветка, и все же мне удалось повредить ветку по умолчанию. Я сделал слияние из графического инструмента, и я думаю, что это, вероятно, была моя проблема. - person DaveN59; 05.05.2011
comment
@ DaneN59 - В TortoiseHG легко случайно объединить default в dev1, а не dev1 в default, если вы используете контекстное меню из неправильного меню, чтобы инициировать слияние. Я подозреваю, что это то, что вы могли бы делать - я знаю, что делал это несколько раз. *8') Хитрость заключается в том, чтобы посмотреть, как соединяются линии связи. - person Mark Booth; 05.05.2011
comment
Спасибо за это. Должно быть, я сделал это, не осознавая этого, как вы сказали, но я думал, что очень осторожен, чтобы не... - person DaveN59; 05.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, когда вы вносите изменения по умолчанию.

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

person Paul Nathan    schedule 05.05.2011
comment
Да, я пробовал это. Затем я обновился до ветки по умолчанию, и у меня есть множество незафиксированных изменений — из ветки dev1. У меня просто сломана установка TortoiseHg или что? - person DaveN59; 05.05.2011
comment
Если вы совершили коммит в ветке dev1 и обновили ветку по умолчанию, и у вас есть незафиксированные изменения, то вы не все коммитили в ветке dev1, прежде чем покинуть ее. Если бы вы это сделали, обновление по умолчанию дало бы вам нетронутую рабочую папку. - person Lasse V. Karlsen; 05.05.2011
comment
Я дам вам это, но как я получил частичную фиксацию? Вот что меня смущает на данный момент... - person DaveN59; 05.05.2011
comment
@Dave: вам нужно зафиксировать, прежде чем менять местами. Если вы используете графический интерфейс TortoiseHG, я предлагаю немного избежать этого и придерживаться командной строки — графический интерфейс принимает некоторые решения за вас (например, фиксация как часть диалоговой последовательности слияния). - person Paul Nathan; 05.05.2011

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

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

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

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

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

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

person Lasse V. Karlsen    schedule 05.05.2011
comment
Я знаю об этом предварительном условии, и я думал, что сделал это. Тем не менее, мне удалось повредить ветку по умолчанию. - person DaveN59; 05.05.2011

Это скорее совет, чем ответ, но...

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

person sylvanaar    schedule 05.05.2011
comment
@DaveN59 - я бы не стал заморачиваться. transplant и rebase являются (ИМХО) унаследованными рабочими процессами, разработанными для того, чтобы обойти ограниченные возможности ветвления в предварительно распределенных системах VCS. Слияние дает вам четкое представление об истинной истории изменений, которые вы теряете при перебазировании или пересадке наборов изменений. - person Mark Booth; 05.05.2011
comment
@Mark Booth - я полагаю, вы имеете право на это мнение. Как бы вы выполнили задачу, которую выполняет Transplant, используя слияния, т.е. как вы выбираете вишни, используя только слияния... Возможно, вы думали, что я предлагаю ТОЛЬКО использовать Transplant.... - person sylvanaar; 05.05.2011
comment
@Mark Booth: Хотя я согласен с тем, что transplant и rebase не являются решениями проблемы DaveN59, они по-прежнему являются очень полезными расширениями, а не «устаревшими», IMO. Как правило, они наиболее полезны при работе с вышестоящим репозиторием, над которым у вас нет контроля. - person jwd; 05.05.2011