2009-05-28 5 views
12

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

Edit: 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. 

ответ

8

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

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

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

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

+0

Закрыть, но не совсем. 'bzr revert' оставит все файлы на месте, готовые к повторной передаче. –

+0

Вы имеете в виду «bzr uncommit»? –

+0

ошибка, да, это правильно ... Спасибо. –

0

не "рт.ст. Revert" делать ли это?

+0

Вы правы. hg revert - эквивалентная команда. –

+0

Он вернет файлы, но мне бы хотелось, чтобы вся запись (сообщение и все) была удалена из истории. –

+0

Или, может быть, нет чего-то «hg help revert» не показывает мне ...? –

0

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

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

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

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

+0

Спасибо за комментарий, но я думаю, что 'hg rollback' - это то, что я ищу. –

+0

Из справочной команды hg по откату «Это также восстановит повреждение во время последней транзакции». Разве это не то, чего вы пытаетесь избежать? –

+0

@Marc: нет, он тоже хочет вернуть себя. Это то, что отслеживает добавленные файлы, например. Итак, «hg add foo.c; hg commit; hg rollback» оставит foo.c добавленным в соответствии с «статусом hg». –

23

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

0

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

+0

Извините, это неверно - 'hg strip' удалит изменения из репозитория, а' bzr uncommit' вернет репозиторий и рабочее дерево в состояние, в котором они находились непосредственно перед фиксацией. –

+0

Ну, именно поэтому я использовал слово «почти» - единственное различие, похоже, является состоянием рабочего каталога. Я просто подумал, что это стоит упомянуть, так как это единственный эквивалент Mercurial для «bzr uncommit» (и, к сожалению, неочевидный, поэтому его трудно найти), способный удалять несколько наборов изменений НЕ сразу после фиксации. Согласно документам Bazaar, bzr uncommit может это сделать. Если вы знаете другую команду Mercurial, способную удалить несколько изменений (например, «bzr uncommit -r 1»), пожалуйста, сообщите мне. Я был бы рад узнать об этом. –

Смежные вопросы