Hg почти совершил неправильную ветку - PullRequest
7 голосов
/ 14 сентября 2011

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

Насколько трудно этого достичь в ртути?

Ответы [ 4 ]

5 голосов
/ 15 сентября 2011

Если между текущей родительской ревизией и целевой ревизией существует линейный путь, вы можете просто выполнить

hg update right-branch

, и Mercurial объединит изменения в вашей рабочей копии с целевой ревизией.

Это делается с помощью механизма полного слияния , поэтому такие вещи, как переименования, учитываются, и вы получаете трехстороннюю программу слияния в случае конфликтов.В подходах, основанных на полках и diff, этого нет, и вам необходимо вручную разрешать конфликты, используя файлы .rej.Вы даже можете увидеть текущий статус слияния с помощью hg resolve --list и повторно объединить выбранные файлы, поскольку Mercurial создает необходимые резервные копии для вас.

Если нет линейного пути, вы получите это предупреждение:

abort: crosses branches (merge branches or use --clean to discard changes)

Затем вы можете получить то, что хотите, сначала обновившись до общего предка, а затем снова обновившись вперед.Я не уверен на 100%, почему мы выдаем это предупреждение, но поиск в архивах списка рассылки должен дать вам ответ, если вам интересно.

3 голосов
/ 14 сентября 2011

Если вы хотите сделать это без расширения полки, сделайте следующее:

hg diff --git > ../work_in_progress.patch
hg up desired-branch
hg import --no-commit ../work_in_progress.patch

Где ../work_in_progress.patch может быть любым путем, который вы хотите (я обычно храню свои патчи чуть выше своего хранилища), а desired-branch - это ветка, к которой вы действительно хотите применить свои изменения.

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

2 голосов
/ 14 сентября 2011

Если вы используете TortoiseHg, этого очень легко достичь с помощью способности полки THG (http://tortoisehg.bitbucket.io/manual/2.9/shelve.html).. В диалоговом окне фиксации просто нажмите кнопку «Полка» (значок которой представляет собой файл с наложенным Z), затем двойная стрелка вправо, чтобы отложить все изменения. Закройте диалоговое окно полки, обновите до нужного набора изменений, откройте диалоговое окно полки и щелкните двойную стрелку влево, чтобы отменить их.

Если вы не используете THG, вы можете установить расширение hgshelve (https://www.mercurial -scm.org / wiki / ShelveExtension ), но я не знаком с ним.

Похоже, вы также можете добиться того же результата с Mercurial Queues (http://mercurial.808500.n3.nabble.com/Shelve-extension-td802439.html).

1 голос
/ 14 сентября 2011

К сожалению, Mercurial не поддерживает готовые полки, поэтому вам нужно сделать временный коммит и перенести его в соответствующую ветку, используя rebase или tramsplant или сделать разность и применить его вручную.Вы также можете использовать стороннее расширение полки, см. https://www.mercurial -scm.org / wiki / ShelveExtension и https://www.mercurial -scm.org / wiki / AtticExtension

...