Подвижное слияние Отмены

Имейте сценарий, где мы неумышленно объединили именованное ответвление (ABC) в наш default ответвление.

hg rollback не опция, потому что была пара фиксаций с тех пор.

Существует ли способ отменить это?

14
задан Steve Horn 30 June 2010 в 14:02
поделиться

3 ответа

Если вы не опубликовали репо публично, вы можете сделать это

hg clone -r (parent1 of bad merge) -r (parent2 of bad merge) old new

и удалить старое репо.

4
ответ дан 1 December 2019 в 13:47
поделиться

Вам понадобится расширение Mq. Если оно у вас не включено, добавьте это в файл Mercurial.ini или .hgrc.

[extensions]
hgext.mq=

Если вы не знакомы с ним, расширение Mq позволяет вам манипулировать историей. Хорошая новость в том, что это позволит нам исправить ваше репо. Плохая новость в том, что всем, у кого есть клон испорченного репозитория, придётся клонировать его снова, потому что мы изменим историю.

Сначала сделайте ещё один клон вашей репозитории для работы, чтобы мы ничего не испортили.

Теперь найдите идентификатор ревизии набора изменений слияния (который объединил default и вашу названную ветку). Запишите его. Мы будем называть его changesetM. Теперь найдите идентификатор ревизии следующего набора изменений. Запишите его. Мы будем называть его changesetN.

Как только вы получили эти два идентификатора ревизии, перейдите к командной строке и cd в ваше репо. Затем введите следующее, заменяя changeset[M|N] соответствующими идентификаторами ревизий:

$ hg qimport -r changesetN:tip
  # This will add all of your changes since the merge to the queue
$ hg qpop -a
  # This pops them all out of your history.
$ hg strip changesetM
  # This removes the merge changeset.
$ hg update -C default
  # Make sure we're on the default branch
$ hg qpush -a
  # Take the changesets in the queue and push them back onto your history.
$ hg qfinish -a
  # Remove changesets from the queue and finalize them as normal changesets.

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

Наконец, если у вас есть другие вопросы по Mercurial, загляните на kiln.stackexchange.com.

UPDATE

Я забыл упомянуть: Если кто-то основывает изменения на чём-то, что было только в другой ветке, возможно, что hg qpush -a не сработает. Вы увидите foo.txt.rej и foo.txt.orig файлы, лежащие повсюду. К сожалению, вам придется исправить это самостоятельно. Чтобы исправить это, откройте исходный файл, файл .orig и файл .rej и выберите нужные изменения для объединения, сохранив их в исходном файле. После объединения используйте hg qrefresh, чтобы обновить патч до нового, объединенного патча. После этого вы можете снова запустить hg qpush -a и продолжить работу. Если вы снова столкнетесь с той же ошибкой на другом патче, просто выполните тот же процесс.

8
ответ дан 1 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: