Подтвердить что ты не робот

"bzr uncommit" эквивалентен в Mercurial?

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

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

Например:

$ 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.
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Вам нужна команда 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 является более мощным, чем простая функция "uncommit", и вы можете использовать его для отбросить работу, если вы не будете осторожны. Чтобы выбросить фиксацию, выполните

$ 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, в родительский коммит, как если бы вы снова вернулись и снова зафиксировали.

Ответ 3

Не делает ли это "hg revert"?

Ответ 4

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

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

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

Сообщите мне, если вам нужно дополнительное объяснение. Мне приходилось делать это иногда, поэтому я знаком с процессом.

Ответ 5

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