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