Как отказаться от слияния hg?


131

Я новичок в сотрудничестве с Mercurial. Моя ситуация:

  • Другой программист изменил версию 1 файла, заменив отступы с 4 пробелами отступом с 2 пробелами. (Т.е. изменил каждую строку.) Назовите эту версию 2, отправленную в удаленное репо.
  • Я внес существенные изменения rev 1 с различными изменениями кода в моем локальном рабочем пространстве. Назовите это rev 3.
  • Я ехал hg pullи hg mergeне понимал, что происходит.
  • Конфликтов бесчисленное множество, и они не очень существенны.

Так что мне очень жаль, что я не изменил свое локальное репо на двухпространственные отступы перед слиянием; тогда слияние будет тривиальным (я полагаю). Но я не могу отступить. Думаю, мне нужно, hg update -r 3но там сказано abort: outstanding uncommitted merges.

Как я могу отменить слияние, изменить интервал в моем локальном репо и повторно выполнить слияние?

Ответы:


127

Вы можете отменить незафиксированные изменения с помощью флага -C (или --clean):

hg update -C -r 3

ВНИМАНИЕ: все, что не было совершено, исчезнет!

После этого вам, вероятно, следует использовать какой-то инструмент форматирования кода для выполнения всей операции или, по крайней мере, найти и заменить регулярными выражениями. Что-то столь же простое, как замена совпадений ^____(используйте 4 пробела вместо подчеркивания) на __(2 пробела), повторенное несколько раз (если у вас нет безумно вложенного кода), должно работать.


ООО Спасибо. Вы, должно быть, ответили правильно, когда я сам это понял. Я в emacs, так что M-x indent-regionсделал трюк с redent.
Grumdrig

6
Стоит отметить, что неотслеживаемые файлы не удаляются.
djsutho

132

Кстати: если вы просто отмените сделанное слияние, а 3 не является вашим номером ревизии, вы можете сделать это:

hg update -C -r .

25
Для всех вроде меня, которые сначала не понимали, как это работает: точка .- это ярлык для предыдущей версии.
Jeroen Wiert Pluimers

1
отличный ответ! должно быть лучше
Олег Абражаев 04

1
@Thymine: Откуда hg help updateя получил: Если набор изменений не указан, обновите его до конца текущей именованной ветки ... и совет не всегда может быть вашей текущей версией, над которой вы работаете. Я пока не тестировал ..
math

1
Ах, это хорошая деталь, которую нужно знать ... на самом деле я собираюсь удалить свой комментарий, утверждающий, что прекращение -r .- это то же самое
Тимин

Просто и очень полезно.
Naveen Kumar V,

33

Чтобы отменить незафиксированное слияние, используйте

hg update --clean

который проверит чистую копию исходного родителя слияния, потеряв все изменения.


2

По-видимому, мне просто нужно было это сделать hg update -C -r 3, что перезаписывает мои локальные файлы с учетом rev (это то, что я думал, что hg updateсойдет; но я ошибался.) Спасибо за мою помощь!


2
Добавление -Cили --clean- это то, как вы говорите Mercurial продолжить работу, даже если он выбросит некоторые измененные файлы. Вы правы, что hg update -r Xобычно приводит вас к ревизии X, но когда вы участвуете в слиянии, вам нужно настаивать немного больше :-)
Мартин Гейслер,

7
Я думаю, что "hg revert --all --cancelmerge" было бы гораздо более интуитивно понятным.
Уоррен П.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.