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


95

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

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

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

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


Ответы:


129

Когда самый простой способ (новый 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())'

1
Спасибо! Я оказался в ситуации, которая решилась отлично, без каких-либо проблем.
eswald 05

1
Это спасло меня от крупных исправлений выше, очень просто, спасибо!
David C

3
Если у кого-то есть проблемы hg strip 'roots(outgoing())'с работой из-за того, что он не узнает 'roots(outgoing())'. Я смог заставить его работать hg strip "roots(outgoing())".
jsea 05

@SombreErmine cmd.exe, да.
просто кто-нибудь

21

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

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

hg clone -r good foo foo-clean

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

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


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


У меня такая же ситуация, но в каталоге репо много файлов, но они находятся в hgignore. Не могу установить hg strip и хотел бы удалить локальные коммиты без замены всего клона. Любые идеи? - А! Если я не добавил никаких файлов, я смогу просто скопировать другой клон в свой старый каталог !?
Peteter

Однако будьте осторожны с этим методом, если у вас несколько веток. Клонирование до указанной ревизии позволяет получить ревизии только в ветви указанной ревизии. Затем вам может потребоваться hg pull -rпоследняя «хорошая» ревизия каждой дополнительной ветки.
Yitz

9

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


Спасибо. Когда вы говорите «удалить все локальные данные», вы имеете в виду удалить весь репозиторий или только мои изменения? Что делает hg init (есть Googled, но нет простого объяснения), и нужно ли мне использовать с ним какие-либо флаги? Удалит ли он такие вещи, как мои настройки Mercurial .hgrc?
Ричард

Обновление: если я удалю все в корневом каталоге проекта, наберу «hg init», я получу «abort: repository». уже существует!'. Нужно ли мне настраивать и работать из нового каталога? Я бы предпочел, если возможно ... Неужто должен быть простой способ убить все, что я сделал локально ?!
Ричард

Да, удалите все, включая все содержимое репозитория. Начните с новой чистой папки. Ваши настройки вы можете сохранить в файле резервной копии, а затем восстановить их в новом репозитории, созданном с помощью hg init reponame. Подробности об инициализации и прочем
alemjerus

6
alemjerus: hg init+ hg pull= hg cloneРазница в том, что hg cloneэто хороший .hg/hgrcфайл для вас, и в нем hg cloneбудут использоваться жесткие ссылки для экономии места при клонировании в той же файловой системе.
Мартин Гейслер

Ричард: Результат hg help initздесь: selenic.com/mercurial/hg.1.html#init Но, может быть, это слишком кратко? Если вам нужна дополнительная помощь, отправьте письмо в наш список рассылки! См .: mercurial.selenic.com/wiki/MailingLists
Мартин Гейслер,

5

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

проверка полосы hg

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

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

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


Вы можете использовать его в общедоступной версии, но если вы потянете еще раз, она появится снова. (hg strip работает только с локальным репозиторием.)
Майк

2

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


2
hg strip `hg out --template" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | вырезать -d "" -f 1`

делает фокус для меня.

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

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

hg strip `hg out OTHER_REPO_ALIAS --template" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | вырезать -d "" -f 1`

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.