Откат репозитория до конкретной ревизии - PullRequest
1 голос
/ 26 февраля 2011

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

Как я могу откатить более одной ревизии в конкретную ревизию?

Ответы [ 4 ]

3 голосов
/ 26 февраля 2011

Если под «откатом» в этом контексте вы подразумеваете избавление от наборов изменений, как если бы вы никогда не тянули, тогда вы можете использовать функцию «strip» в расширении MQ.

Сначала включите расширение MQ, отредактировав файл .hgrc (* nix) или mercurial.ini (Windows):

[extensions]
mq=

Затем используйте команду strip:

hg strip REV

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

Также обратите внимание, что если вы уже перенесли слияние куда-то еще, вам также необходимо выполнить очистку в этом хранилище, и в зависимости от того, происходит ли слияние "в дикой природе", может быть невозможно окончательно избавиться об этом.

2 голосов
/ 26 февраля 2011

Откат не то, что вы описываете. Если до операции ваш репо выглядел так:

[A]-[B]-[C]-[D]

и после тяги это выглядело так:

[A]-[B]-[C]-[D]
          \
           -[E]-[F]

и после слияния это выглядело так:

[A]-[B]-[C]-[D]-----[G]
          \        /
           -[E]-[F]

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

Есть несколько способов сделать это. Самый Mercurial способ сделать это просто сделать:

hg update D
hg merge E
... re-merge, doing it better this time ...
hg commit # creates H

Тогда ваша история будет выглядеть так:

[A]-[B]-[C]-[D]-------- [G]
          \          X
           -[E]-[F]-----[H]

где этот X - пересечение. Затем вы будете использовать H в качестве новой точки развития и игнорировать (или закрыть G).

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

cd ..
hg clone -r tip-1 myrepo mynewrepo

где у вас тогда будет все в mynewrepo, кроме G. Затем вы можете заново объединить. Команда strip также работает, но по какой-то причине она отключена.

Суть в том, что вам не нужно удалять и повторять тягу; просто слияние.

1 голос
/ 26 февраля 2011

Я действительно не использовал Mercurial, только CVS и SVN, но это должно быть одинаково.Я предполагаю, что вы можете оформить более старую версию на основе номера или даты редакции, верно?Если так, проверьте более старую версию во временном каталоге и повторно объедините это.Вам также нужно будет удалить все новые файлы, добавленные в хранилище.Таким образом, вы фактически должны иметь ту же копию файлов, что и 2 или более ревизий назад.

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

0 голосов
/ 26 февраля 2011

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

hg up -C -R 7

Эта строка отбрасывает незафиксированные изменения и возвращается к ревизии 7, как пример.

...