С Mercurial, как я могу" сжать " серию наборов изменений в один перед нажатием?
допустим, у меня есть локальный и удаленный ртутный репозиторий. Теперь, я начинаю работать над функцией. Я работаю над этим, и когда я думаю, что это сделано, я совершаю набор изменений. Протестировав его немного больше, я обнаружил, что могу еще больше улучшить эту функцию, настроив что-то в коде. Я делаю изменения и совершаю их. Через 20 минут я обнаружил, что в этой новой функции есть ошибка, поэтому я исправляю ее и фиксирую это тоже.
теперь у меня есть 3 набора изменений, которые я действительно хотел бы нажать на пульт репозиторий как один набор изменений с сообщением "реализация функции X", например.
Как я могу сделать это без особых хлопот? Я считаю, что я мог бы сделать это с патчами, но это похоже на большую работу.
10 ответов:
как о Крах Расширение?
The histedit
Да, вы можете сделать это с патчами: Предположим, что ваша работа находится в наборах изменений от 100 до 110 включительно
создать патч:
% hg export -o mypatch 100:110 --gitобновление до 99:
% hg update 99применить патч с --no-commit (в противном случае вы получите все ваши наборы изменений обратно):
% hg import --no-commit mypatchприменить все изменения в один раз:
% hg commitтеперь у вас есть две головы (110 и 111), которые должны быть эквивалентны с точки зрения файлов, которые они производят в вашем рабочем каталоге-возможно, diff их для здравомыслия, прежде чем удалять старые:
% hg strip 100хорошо, теперь, когда я все это изложил, это кажется длинным, но, сделав это несколько раз сам, я не нахожу это слишком большой рутиной...
Если вы используете TortoiseHg, используйте can просто выберите две ревизии (используйте CTRL для выбора не последующих), щелкните правой кнопкой мыши и выберите "История Сжимать".
после этого вы получите новый список изменений в новой голове, начиная с первого изменения, выбранного ранее, он будет содержать все списки изменений потомков между выбранными вами.
вы можете просто удалить старые списки изменений, если они вам больше не нужны: используйте MQ расширения для оно. Опять же, в TortoiseHg: щелкните правой кнопкой мыши на первом списке изменений, который должен быть разделен со всеми его потомками, "Изменить Историю - > Strip".
мой предпочтительный метод использования mq для этого складывания-использование TortoiseHg как описано здесь. Однако, это можно легко сделать из командной строки Вот так:
hg qimport -r <first>:<last> -- where <first> and <last> are the first and last changesets -- in the range of revisions you want to collapse hg qpop <first>.diff -- remove all except for the first patch from the queue -- note: mq names patches <#>.diff when it imports them, so we're using that here hg qfold <next>.diff -- where <next> is <first>+1, then <first>+2, until you've reached <last> hg qfinish -a -- apply the folded changeset back into the repository(может быть, есть лучший способ сделать шаг qfold, но я не знаю об этом, так как обычно использую TortoiseHg для этой операции.)
сначала это кажется немного сложным, но как только вы начали использовать mq, это довольно просто и естественно-плюс вы можете делать все виды других вещи с mq, которые могут быть довольно удобными!
hg collapseиhg histeditлучшие способы. Или, скорее, были бы лучшие способы, если бы они работали надежно... Я получилhisteditаварии с дампом стека в течение трех минут.Collapseне намного лучше.Я подумал, что могу поделиться двумя другими BKMs:
hg rebase --collapseэто расширение распространяется с Mercurial. У меня не было проблем с этим. Вы можете играть в некоторые игры, чтобы обойти
hg rebaseограничения -- в принципе, ему не нравится перебазирование к предку в той же ветви, именованной или по умолчанию, хотя он позволяет это делать, если перебазирование между (именованными) ветвями.переместить в хранилище (
foo/.hg) в рабочий каталог (bar) и его файлы. А не наоборот.некоторые люди говорили о создании двух деревьев клонов и копировании файлов между ними. Или латать между ними. Вместо этого, его легче переместить
.hgсправочники.hg clone project work ... lots of edits ... hg pull, merge, resolve hg clone project, clean mv work/.hg .hg.work mv clean/.hg work/.hg cd work ... if necessary, pull, nerge, reconcile - but that would only happen because of a race hg pushэто работает до тех пор, как истинный репозиториев
.hgдеревья, не зависят от рабочего каталога и его файлов.если они не являются независимыми...
Я никогда не использовал Mercurial, но это звучит очень похоже на то, что Мартин Фаулер говорил о своем блоге не так давно:
HistEdit будет делать то, что вы хотите, но это, вероятно, перебор. Если единственное, что вам нужно, это сложить некоторые наборы изменений вместе Крах Расширение сделает работу.
Предположим, у вас есть два неопубликованных
THISиTHATкоммиты в Mercurial и как их объединить в один коммит наTHISточка::... --> THIS --> ... --> THAT --> ... --> LASTубедитесь, что ваши коммиты не публикуются::
$ hg glog -r "draft() & ($THIS | $THAT)"обновление
LASTcommit::$ hg upи импорт совершает до
THISв MQ::$ hg qimport $THIS::.Un-применить все патчи и применять только первый
THIS::$ hg qpop -a $ hg qpush $ hg qapplied ... THIS ...вступить с
THAT::$ hg qfold $THATNAMEПримечание найти имя
THATNAMEuse::$ hg qseriesприменить все патчи и переместить их в хранилище истории::
$ hg qpush -a $ hg qfinish -aмой блог по теме соединение двух коммитов в Mercurial.
Comments