Удалить все локальные ревизии и вернуться к дереву

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

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

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

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


person Richard    schedule 26.01.2010    source источник
comment
Возможный дубликат Есть ли способ удалить локальные коммиты в Mercurial?   -  person StayOnTarget    schedule 24.10.2018


Ответы (7)


Когда самый простой способ (новый 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: еще более разумный подход - использовать язык набора изменений и сделать:

% hg strip 'roots(outgoing())'
person just somebody    schedule 27.01.2010
comment
Спасибо! Я оказался в ситуации, которая решилась идеально, без каких-либо проблем. - person eswald; 06.01.2011
comment
Это избавило меня от крупных исправлений выше, очень просто, спасибо! - person David C; 22.07.2011
comment
Если у кого-то есть проблемы с работой hg strip 'roots(outgoing())' из-за того, что он не распознает 'roots(outgoing())'. Мне удалось заставить его работать с hg strip "roots(outgoing())". - person jsea; 05.06.2015
comment
@SombreErmine в cmd.exe, да. - person just somebody; 14.06.2015

Вы захотите создать локальный клон, в котором вы сохраните только наборы изменений, которые также присутствуют в удаленном репозитории. Используйте TortoiseHg, hg log или аналогичный, чтобы выяснить, какая из ваших ревизий является той последней, которую вы не использовали make (тот, который был до того, как начался беспорядок). Здесь может помочь использование 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 сообщит вам идентификатор подсказки в удаленном репозитории.

person Martin Geisler    schedule 27.01.2010
comment
У меня такая же ситуация, но в каталоге репо много файлов, но они находятся в hgignore. Не могу установить hg strip и хотел бы удалить локальные коммиты без замены всего клона. Любые идеи? - А! Если я не добавил никаких файлов, я смогу просто скопировать другой клон в свой старый каталог !? - person Peteter; 15.02.2011
comment
Однако будьте осторожны с этим методом, если у вас несколько веток. Клонирование до указанной ревизии получает только наборы изменений в ветви указанной ревизии. Затем вам может потребоваться hg pull -r для последней исправной ревизии каждой дополнительной ветки. - person Yitz; 09.01.2013

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

person alemjerus    schedule 26.01.2010
comment
Спасибо. Когда вы говорите «удалить все локальные данные», вы имеете в виду удалить весь репозиторий или только мои изменения? Что делает hg init (есть Googled, но нет простого объяснения), и нужно ли мне использовать с ним какие-либо флаги? Удалит ли он такие вещи, как мои настройки Mercurial .hgrc? - person Richard; 26.01.2010
comment
Обновление: если я удалю все в корневом каталоге проекта, наберу «hg init», я получу «abort: repository». уже существует!'. Нужно ли мне настраивать и работать из нового каталога? Я бы предпочел, если возможно ... Неужто должен быть простой способ убить все, что я сделал локально ?! - person Richard; 26.01.2010
comment
Да, удалите все, включая все содержимое репозитория. Начните с новой чистой папки. Ваши настройки вы можете сохранить в файле резервной копии, а затем восстановить их в новом репозитории, созданном с помощью hg init reponame. Подробная информация об инициализации и прочем: hgbook.red-bean.com/ прочтите / mercurial-in-daily-use.html - person alemjerus; 26.01.2010
comment
alemjerus: hg init + hg pull = hg clone Разница в том, что hg clone делает для вас хороший .hg/hgrc файл и hg clone будет использовать жесткие ссылки для экономии места при клонировании в той же файловой системе. - person Martin Geisler; 27.01.2010
comment
Ричард: Результат hg help init находится здесь: selenic.com/mercurial/hg.1 .html # init Но, может быть, это слишком сжато? Если вам нужна дополнительная помощь, отправьте письмо в наш список рассылки! См .: mercurial.selenic.com/wiki/MailingLists - person Martin Geisler; 27.01.2010
comment
Это вполне допустимый подход, но для больших репозиториев это не самый быстрый способ сделать это. - person StayOnTarget; 17.12.2018

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

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

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

https://www.mercurial-scm.org/wiki/Strip

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

person averasko    schedule 07.07.2011
comment
Вы можете использовать его в общедоступной версии, но если вы потянете еще раз, она появится снова. (hg strip работает только с локальным репозиторием.) - person Mike Rosoft; 27.02.2019

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

person OJ.    schedule 26.01.2010

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`
person Sebastian    schedule 17.08.2011

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

person MrFlamey    schedule 02.12.2014