Mercurial-вернуться к старой версии и продолжить оттуда



Я использую Mercurial локально для проекта (это единственное РЕПО, в котором нет нажатия/вытягивания в/из другого места).



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



Я немного запутался с branch/revert/update -C команды в Mercurial. В основном я хочу вернуться к версии 38 (в настоящее время на 45) и у моих следующих коммитов есть 38 в качестве родителя и продолжайте оттуда. Мне все равно, если ревизии 39-45 будут потеряны навсегда или окажутся в тупиковой ветви своей собственной.



какая команда / набор команд мне нужен?

903   7  

7 ответов:

hg update [-r REV]

если позже вы зафиксируете, вы эффективно создадите новую ветвь. Затем вы можете продолжить работу только над этой веткой или в конечном итоге объединить в нее существующую.

вот шпаргалка по командам:

  • hg update изменяет рабочую копию родительской редакции, а также изменяет содержимое файла в соответствии с этой новой родительской редакции. Это означает, что новые фиксации будут продолжаться от версии, которую вы обновляете.

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

  • hg branch начинает новую ветку. Подумайте о именованной ветви как о метке, которую вы назначаете наборам изменений. Так что если вы делаете hg branch red, то следующие наборы изменений будут помечены как принадлежащие на" красной " ветке. Это может быть хороший способ организовать наборы изменений, особенно когда разные люди работают в разных ветвях, и вы позже хотите увидеть, где набор изменений родом из ... Но вы не хотите использовать его в вашей ситуации.

если вы используете hg update --rev 38, тогда наборы изменений 39-45 будут оставлены как тупик-болтающаяся голова, как мы ее называем. Вы получите предупреждение при нажатии, так как вы будете создавать "несколько головок" в репозитории, который вы нажимаете. Предупреждение есть, так как это невежливо оставлять такие головы вокруг, так как они предполагают, что кто-то должен сделать слияние. Но в вашем случае вы можете просто пойти вперед и hg push --force так как ты действительно хочешь оставить все как есть.

если вы еще не нажали ревизию 39-45 где-то еще, то вы можете сохранить их в тайне. Все очень просто: с hg clone --rev 38 foo foo-38 вы получите новый локальный клон, который содержит только до версии 38. Вы можете продолжать работать в foo-38 и нажмите на новые (хорошие) наборы изменений, которые вы создаете. У вас все еще будут старые (плохие) изменения в вашем foo клон. (Вы можете переименовать клоны, как вы хотите, например,foo до foo-bad и foo-38 до foo.)

наконец, вы также можете использовать hg revert --all --rev 38 а затем совершить. Это создаст ревизию 46, которая выглядит идентично ревизии 38. Затем вы продолжите работу с версии 46. Это не создаст вилку в истории таким же явным образом, как hg update сделал, но с другой стороны вы не получите жалуется на наличие нескольких голов. Я бы использовал hg revert если бы я сотрудничал с другими, которые уже сделали свою собственную работу на основе ревизии 45. Иначе, hg update более явными.

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

hg revert path/to/file -r-2

Это -2 вернется к версии перед последней фиксацией, используя -1 просто вернет текущие незафиксированные изменения.

ИМХО, hg strip -r 39 подходит для этого случая лучше.

он требует, чтобы расширение mq было включено и имеет те же ограничения, что и" метод клонирования РЕПО", рекомендованный Мартином Гейслером: Если набор изменений был каким-то образом опубликован, он (вероятно) вернется к вашему РЕПО в какой-то момент времени, потому что вы только изменили свое локальное РЕПО.

после hg update -r REV в ответе не было ясно, как совершить это изменение, чтобы вы могли затем нажать.

Если вы просто попытаетесь зафиксировать после обновления, Mercurial не думает, что есть какие-либо изменения.

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

Это затем создало две головы, как уже упоминалось.

чтобы избавиться от другой головы перед толкая, я затем последовал за No-Op Сливается шаг, чтобы исправить эту ситуацию.

Я был тогда в состоянии нажать.

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

hg revert --all --rev 

hg commit -m "Restoring branch  as default"

здесь - номер ревизии или имя ветви. Эти две строки на самом деле являются частью сценария bash, но они отлично работают сами по себе, если вы хотите сделать это вручную.

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

Я бы установил Tortoise Hg (бесплатный графический интерфейс для Mercurial) и использовал его. Затем вы можете просто щелкнуть правой кнопкой мыши по ревизии, к которой вы, возможно, захотите вернуться - со всеми сообщениями фиксации там перед вашими глазами - и "вернуть все файлы". Делает его интуитивно понятным и легко катиться назад и вперед между версиями набора файлов, что может быть очень полезно, если вы хотите установить, когда проблема впервые появилась.

Comments

    Ничего не найдено.