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

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

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

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

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

Ответ 1

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

Ответ 2

Вы хотите создать локальный клон, в котором вы сохраните только набор изменений, которые также присутствуют в удаленном репозитории. Используйте 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 сообщит вам идентификатор подсказки в удаленном репозитории.

Ответ 3

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

Ответ 4

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

Версия

hg strip

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

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

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

Ответ 5

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

Ответ 6

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`

Ответ 7

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