Как мне сделать сброс настроек --hard HEAD на Mercurial? - PullRequest
70 голосов
/ 20 апреля 2010

Я пользователь Git, пытаюсь использовать Mercurial.

Вот что произошло: я сделал hg backout для ревизии, которую хотел вернуть. Это создало новую голову, поэтому hg дал мне указание слиться (я полагаю, вернуться к «default»). После слияния он сказал мне, что я все еще должен совершить. Затем я заметил что-то, что я сделал неправильно при разрешении конфликта в слиянии, и решил, что хочу, чтобы все было так, как до hg backout, то есть я хочу, чтобы это несвязанное слияние прошло. На Git этот незафиксированный материал был бы в индексе, и я просто сделал бы git reset --hard HEAD, чтобы стереть его, но, как я прочитал, индекс не существует в Mercurial. Так как мне отступить от этого?

Ответы [ 4 ]

87 голосов
/ 20 апреля 2010

Если вы еще не сделали коммит, и, похоже, у вас его нет, вы можете отменить всю работу по слиянию с помощью hg update --clean.

Однако в более новых Mercurial есть удобная команда для повторного объединения одного файла: hg resolve path/to/file.ext. Из hg help resolve:

The available actions are: ...

 4) discard your current attempt(s) at resolving conflicts and

перезагрузка объединение с нуля: "hg resol file ..." (или "-a" для всех неразрешенные файлы)

21 голосов
/ 20 апреля 2010

Это близко:

hg update --clean

11 голосов
/ 16 сентября 2013

На странице GitConcepts Руководства Hg объясняется, как выполнять многие действия git, с которыми пользователи знакомы в Mercurial.

Mercurial не имеет встроенного поведения git reset --hard. Однако расширение strip предоставляет команду strip, которая выполняет. Для использования сначала включите strip в вашем ~/.hgrc файле ::

[extensions]
strip =

Примечание: это расширение поставляется новым в Mercurial 2.8. Предыдущие версии предоставляли команду strip в mq расширении .

Теперь вы можете запускать такие команды, как hg strip или даже hg help strip. Чтобы удалить набор изменений и все его дочерние элементы, просто укажите этот набор изменений в качестве аргумента hg strip. Например, чтобы удалить последний только что сделанный вами коммит (после того, как вы использовали команды, которые заставили hg rollback сообщить, что откат транзакции больше не выполняется), вы можете удалить ревизию tip. Каждый раз, когда вы запускаете эту команду, другая ревизия будет удалена. Действия hg strip следует считать необратимыми; незнакомые пользователи должны сделать резервные копии своих репозиториев перед использованием.

$ hg strip tip

Например, с синтаксисом revsets я указываю, что хочу удалить любые мои коммиты, которые приводят к появлению дополнительных головок при запуске hg heads. Если в приведенном ниже выражении вы укажете конкретную ревизию, отличную от tip, все в текущей ветви, не являющееся предком выбранной ревизии, будет обрезано. Это похоже на то поведение, которое мне нужно, когда я запускаю команду git reset --hard HEAD.

$ hg strip "branch(tip) and not(ancestors(tip)::tip)"
8 голосов
/ 04 августа 2015

Из git, команды:

git reset --hard     # reset to last commit    
git clean -df        # delete untracked files

равно

hg update --clean    # reset to last commit  
hg purge             # delete untracked files
...