Как избавиться от некоторых изменений в Hg? - PullRequest
7 голосов
/ 13 ноября 2010

Эй, я хочу вернуть некоторые изменения в Hg, но мне трудно это делать.

Я совершил некоторые изменения случайно, поэтому я хотел отменить это. Немного попробовав, я смог hg backout, но он создал новый коммит. Теперь я хотел, чтобы мой репо перешел в исходное состояние (без двух последних коммитов и с моими изменениями в рабочем каталоге). По-видимому, нет способа сделать это (что-то похожее на git reset --soft). Есть ли?

Еще одна вещь, которую я попытался, - избавиться от последнего коммита (того, который вернул первоначальный). Это было бы что-то похожее на git reset --hard, но опять же, нет способа сделать это. Я могу hg update -C, но это больше похоже на git checkout, так как коммит все еще там.

А также, hg update -C -r X возвращает меня к ревизии X, но когда я проверяю hg log, у меня нет возможности узнать, в какой ревизии я сейчас нахожусь. Единственный способ - это проверить мою историю bash, верно? Должен быть способ узнать это.

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

Полагаю, я просто хочу знать, каковы РЕАЛЬНЫЕ эквивалентности в hg для git reset --hard и git reset --soft ...

Спасибо.

Ответы [ 5 ]

9 голосов
/ 13 ноября 2010

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

Если, однако, вы просто не можете оставить это изменение (веские причины: он содержит пароль, который вы не можете изменить, плохая причина: он просто не сработал), у вас есть несколько вариантов:

  • strip: мне не нравится strip, она изменяет репозиторий и не помещает материал обратно в рабочий каталог. По умолчанию полоска отключена.
  • клон: просто сделайте hg clone -r LASTCHANGESETYOULIKE oldrepo newrepo, и теперь у newrepo есть все, вплоть до LASTCHANGESETYOULIKE. Заархивируйте oldrepo и переименуйте newrepo в oldrepo.
  • откат: это одноуровневая отмена ртутного мира. Это отменило бы ваш коммит сразу после того, как вы это сделали, но не сработало бы, если бы вы делали какие-либо другие попытки или коммиты, которые у вас есть.
7 голосов
/ 15 ноября 2010

Вот как это сделать git reset --soft.Предположим, у вас есть график, подобный следующему:

... --- [A] --- [B] --- [X] --- [-X]

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

$ hg update B
$ hg revert --all --rev X # working copy now looks just like in X
$ hg strip --force X      # get rid of X and -X

Если хотите, вы можете создать для этого псевдоним Mercurial 1.7:

[alias]
softreset = !hg update 'p1($1)' &&
             hg revert --all --rev $1 &&
             hg strip --force $1

Грязная рабочая копия после hg revert делает необходимым использование hg strip --force.Эта новая команда используется как

$ hg softreset 10

, которая удалит 10 и любых потомков, оставив изменения в 10 в рабочей копии.Конечно, вы можете пойти дальше и реализовать команду hg reset:

[alias]
reset = !test "$1" = "--hard" && hg strip $2 || hg softreset $2

Самая большая проблема с этими псевдонимами - плохая обработка ошибок.Расширение, написанное на Python, было бы гораздо более надежным и поддерживаемым - возможно, вы могли бы сделать такое расширение «перезагрузки» и опубликовать его в Bitbucket:)

3 голосов
/ 13 ноября 2010

См. hg strip из расширения mq.

1 голос
/ 14 ноября 2010

У вас уже есть несколько хороших ответов, но пара дополнительных замечаний:

  • Если у вас есть незафиксированные локальные изменения, shelve отменит их для вас для последующего поиска
  • Если ваша ревизия была перенесена в другой репозиторий, то, за исключением редактирования обоих репозиториев, возврат является вашей единственной возможностью
  • Откат позволяет вам создать новую ревизию, которая является обратной к исходной ревизии, получаяизбавление от нежелательных изменений без изменения истории хранилища
  • Откат, как правило, является лучшим вариантом, если вы еще не отправили удаленное хранилище, поскольку оно уничтожает набор изменений, оставляя рабочую копию нетронутой
  • Полоса избавится от целой ветви изменений, но, как и откаты, она останется без изменений, если вы не перенесли изменения в другое место
  • То же самое относится к клонированию хранилища до предыдущей ревизии.- другие инструменты проще в любом случае
0 голосов
/ 13 ноября 2010

Не уверен насчет мерзавцев, но если вы не нажали, вы можете использовать hg rollback.Если вы нажали, на самом деле вы ничего не можете с этим поделать.

Что касается текущей ревизии, см. hg id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...