Удалить все локальные наборы изменений и вернуться к дереву - PullRequest
94 голосов
/ 26 января 2010

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

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

Я знаю, hg update -C перезаписывает любые локальные изменения. Но как мне удалить локальные коммиты?

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

Ответы [ 7 ]

128 голосов
/ 27 января 2010

Когда самый простой способ (новый hg clone) не практичен, я использую hg strip:

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

Повторяйте, пока hg outgoing не будет тихо. Обратите внимание, что hg strip $rev стирает $rev и всех его потомков.

Обратите внимание, что вам, возможно, придется сначала включить strip в настройках Mercurial .

PS: еще более разумный подход - использовать язык revset и сделать:

% hg strip 'roots(outgoing())'
21 голосов
/ 27 января 2010

Вы захотите создать локальный клон, в котором вы сохраните только те наборы изменений, которые также присутствуют в удаленном репозитории. Используйте TortoiseHg , hg log или подобное, чтобы выяснить, какая из ваших ревизий является самой последней ревизией, которую вы не сделали (той, которая была до начала беспорядка). Здесь может помочь hg outgoing - в нем будут перечислены все сделанные вами изменения - выберите номер редакции раньше, чем любой из них.

Если целевая ревизия называется good, а ваш клон называется foo, тогда выполните:

hg clone -r good foo foo-clean

Это будет быстрая локальная операция - нет причин загружать все заново . Клон foo-clean будет содержать только наборы изменений до версии good. Теперь вы можете заменить foo-clean/.hg/hgrc на foo/.hg/hgrc, чтобы сохранить локальные настройки репозитория, такие как путь push / pull по умолчанию.

Когда вы убедитесь, что в foo-clean есть все, что вам нужно от foo, просто удалите foo и переименуйте foo-clean в foo. Выполните hg pull, чтобы получить любые новые наборы изменений из удаленного репозитория в свой клон, и продолжайте как обычно.


Если никто не поместил новые наборы изменений в удаленный репозиторий, тогда очень просто определить, какую ревизию вы хотите использовать, как good выше: hg id default сообщит вам идентификатор подсказки в удаленном репозитории.

9 голосов
/ 26 января 2010

Хорошо. Так что просто удалите все локальные вещи, hg init новый локальный репозиторий и hg pull последний совет, который у вас есть. Не забудьте hg update после этого.

5 голосов
/ 07 июля 2011

Вы можете использовать

HG ревизия полосы

убить любую ревизию и ее поддерево в вашем локальном хранилище.

https://www.mercurial -scm.org / вики / Strip

Но не пытайтесь использовать это для чего-то, что уже было выдвинуто.

2 голосов
/ 17 августа 2011
hg strip `hg out --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | cut -d " " -f 1`

помогает мне.

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

Вы также можете использовать этот стиль, чтобы он проверялся не с репозиторием по умолчанию, а с другим репозиторием

hg strip `hg out OTHER_REPO_ALIAS --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | cut -d " " -f 1`
2 голосов
/ 26 января 2010

Просто удалите все, что у вас есть в локальной системе, и повторно клонируйте удаленное хранилище.

0 голосов
/ 02 декабря 2014

Если вы используете TortoiseHg, один из простых способов выйти из (небольшого) беспорядка - это сначала обновить его до последней ревизии, затем выбрать наборы изменений и инициировать «объединение с локальным». Когда появится диалоговое окно слияния, просто нажмите маленький значок «+», чтобы открыть некоторые дополнительные параметры, один из которых - «отменить наборы изменений из ревизии слияния (другой)». Это будет означать, что ваши наборы изменений все еще будут находиться в репо и будут выдвинуты, но не будут иметь никакого эффекта, потому что они будут отброшены при слиянии. Если у вас много наборов изменений, охватывающих множество голов, возможно, вы не захотите загрязнять репо таким образом, но это простое исправление, и стоит подумать, содержат ли наборы изменений, которые вы отбрасываете, данные, на которые вы позже захотите сослаться.

...