"bzr uncommit" эквивалент в Mercurial? - PullRequest
12 голосов
/ 28 мая 2009

Bazaar имеет замечательную команду uncommit, которая просто отменяет последний коммит. Есть ли в Mercurial аналог?

Редактировать : команда uncommit Bazaar не изменяет файлы - она ​​удаляет последний коммит и связанные с ним данные (полезно, например, когда вы слишком поздно замечаете опечатку в сообщении фиксации или в файле не было добавлено, что должно было быть).

Например:

$ bzr ci -m "Fixed a proooblem" <-- problem is misspelt
$ bzr uncommit
...
$ bzr ci -m "Fixed a problem" <-- Exactly as if the first commit was correct.

Ответы [ 5 ]

23 голосов
/ 28 мая 2009

Вам нужна команда hg rollback, но посмотрите, используете ли вы Mercurial 2.2 или более позднюю версию ниже.

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

% hg commit -m 'My elaburate bugfix.' foo.c foo.h
% hg rollback
% hg commit -m 'My elaborate bugfix.' foo.c foo.h

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

Осторожно: hg rollback более мощный, чем простая «незафиксированная» функция, и вы можете использовать ее, чтобы выбросить работу , если вы не будете осторожны. Чтобы выбросить коммит, сделайте

$ hg commit -m 'My big and very difficult bugfix'
$ hg pull --update
$ hg rollback

Теперь вы потеряли последний сделанный вами коммит, и поскольку вы обновили рабочую копию до какой-то другой ревизии, изменения в этом коммите пропали . Поэтому вы должны использовать hg rollback только для отмены фиксации, если вы уверены, что hg commit действительно была последней командой, работавшей с рабочей копией.

Кроме того, если вы не передали сообщение коммита в командной строке, вы не можете просто дважды нажать стрелку вверх, чтобы повторить коммит после отката. Однако Mercurial 1.5 и более поздние версии сохранят ваше последнее сообщение о коммите в .hg/last-message.txt, чтобы вы всегда могли найти его снова после отката.

Mercurial 2.2 имеет новый --amend флаг для hg commit. Это позволит вам дополнить последний коммит новыми изменениями. Он просто включает изменения, перечисленные в hg status, в родительский коммит, как если бы вы откатились и зафиксировали снова.

8 голосов
/ 28 мая 2009

Может быть hg backout tip? Я рекомендую http://hgbook.red -bean.com / read / Find-and-Fixing-errors.html для всех подробностей о hg backout, чем он отличается от hg revert и многих связанных тем, но если Я понимаю, что делает uncommit, кажется, что оно точно эквивалентно hg backout tip.

Редактировать: в комментарии, который вы теперь уточнили, вы хотите "удалить историю" - это сложно (если, конечно, вы не ОЧЕНЬ быстро играете на ничью; -) ... снова по книге о красных бобах:

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

Так что, если вы просто хотите попытаться"заставить его исчезнуть" (и вам повезло, что его еще ни где-то не подтолкнули или не потянули), тогда hg rollback может быть лучше подойти!

0 голосов
/ 31 мая 2010

Существует также команда "hg strip" из расширения "mq". Это почти точный эквивалент "bzr uncommit". Однако будьте осторожны, когда вы ранее перенесли свой ошибочный коммит в другой репозиторий, он будет воссоздан с ближайшим извлечением из него.

0 голосов
/ 28 мая 2009

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

Однако, вы могли бы сделать это с помощью пары ручных шагов. Когда вы вызываете hg revert, его поведение по умолчанию - брать файлы в наборе изменений, которые вы возвращаете, и переименовывать их в filename.ext.orig, где ext - исходное расширение файла. Затем возвращенные версии получают исходное имя файла. Итак, вы можете запустить hg revert, удалить файлы с исходными именами и удалить .orig из имен файлов резервных копий. Затем повторно подтвердите с вашим исправленным сообщением журнала. Только не делайте этого с какой-либо ревизией, кроме подсказки, потому что вы, вероятно, получите много измененных файлов и забудете, какие из них принадлежали к какой ревизии.

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

Дайте мне знать, если вам нужны дальнейшие объяснения. Мне приходилось делать это время от времени, поэтому я знаком с процессом.

0 голосов
/ 28 мая 2009

Разве "hg revert" не делает это?

...