Rebase для бедных в Mercurial
Пока честный rebase для меркуриала находится в стадии проекта для GSoC, я расскажу про то, как его сделать с помощью существующих инструментов — всё же это бывает полезно.
Итак, что у нас есть? У нас есть какой-то проект, разрабатывающийся где-то там (вне пределов текущего репозитория ;), и локальные изменения (ещё нигде не опубликованные — это важный момент1), которые ответвляются не от последней ревизии, а где-то чуть раньше. Выглядит это всё так:
o [4:90fba61256bd] by Outer Developer
| third commit
|
o [3:1bd353a07bad] by Outer Developer
| second commit
|
| @ [2:1685d3c280ff] by Alexander Solovyov
| | my second
| |
| o [1:337f09cca099] by Alexander Solovyov
|/ my first
|
o [0:7573fff4d9c9] by Outer Developer
initial commit
Что хочется увидеть? Хочется увидеть, как изменения из моего репозитория
будут ответвляться от 90fb, а не от 7573.
Что делать?
Первым делом понадобится включить плагин mq. Он изначально предназначен совсем не для того, что я сейчас собираюсь делать, поэтому действия выходят слегка многословными, но ведь интересует-то результат?
Весь сценарий — вытащить изменения из рабочей копии в очередь патчей, применить патчи к последней ревизии и экспортировать их как чейнджсеты.
$ hg qimport -r 1:2 # импортируем в очередь необходимые чейнджсеты (превращая их в патчи mq)
$ hg qpop -a # отменяем импортированные патчи от рабочей копии
$ hg up -C tip # обновляемся до последней ревизии с потерей изменений
$ hg qpush -a # применяем патчи к рабочей копии
$ hg qdelete -r qbase:qtip # экспортируем все патчи в обычные чейнджсеты
qtip и qbase — это такие специальные виртуальные теги (в обычном
состоянии есть только один подобный — tip), которые вводит mq. qbase
— это первый из применённых патчей, qtip — соответственно, последний. Из
интересных тегов ещё есть qparent — это чейнджсет, родительский для
qbase.
Вот это и всё — теперь история репозитория выглядит вот так:
@ [4:55550600d079] by Alexander Solovyov
| my second
|
o [3:2a783dd32af9] by Alexander Solovyov
| my first
|
o [2:90fba61256bd] by Outer Developer
| third commit
|
o [1:1bd353a07bad] by Outer Developer
| second commit
|
o [0:7573fff4d9c9] by Outer Developer
initial commit
Как быть?
Ещё раз замечу — использовать такое можно только пока изменения не
опубликованы — mq изменяет историю (точно так же, как это делает
rebase). Но в отдельных случаях бывает такое бывает полезно или просто
нужно. ;)
P.S.В статье я не касаюсь механизма и принципов работы mq — может, напишу
об этом в будущем. А пока есть два пути — почитать hgbook и
поэкспериментировать самому (начав с hg help mq), хотя бы на примере этого
рецепта, посмотрев, что делают команды с логом и рабочей копией.
Они же изменятся при перебазировании — получится два набора очень похожих изменений, что может порядочно нагадить в дальнейшем. ;)

Comments: 9 Subscribe (already: 0) Comment post
Вот запарил.. Лучше допиши книжку вот тут http://hgbook.red-bean.com/hgbookch7.html#x11-1520007.6
man hgignoreпочитай, он довольно понятно написан.а теперь представляем себе ситуацию, что нам хочется часть изменений чужих завернуть в branches… Да, репозиторий уже опубликован. Вот что делать то? В git я просто говорю push -f и он перебивает header’ы веток.
Не понял вопроса. В какие бранчи? Те бранчи, которые ты имеешь в git’е, в меркуриале тоже есть — вон первый
glogих показал. Точно так же с помощью-fты их можешь получить. А про что ты спрашиваешь — я не понимаю. :(Понял. Они такие же как в git’е, только не именованные, да?
Именно. :-) Т.е. в гите ты должен указать явно, что хочешь получить бранч, а в меркуриале ты его получаешь автоматом, но без имени.
А то, что в меркуриале называется named branch, в гите отсутствует. И я до сих пор их смысла не совсем понял — может просто не сталкивался с use-case’ом.
Вот у меня такая же проблема. Я не доконца понимаю что такое named branch в mercurial и какой их вещественный смысл.
Пока вроде всё понятно, хотелось бы ещё узнать о принципах и механизме работы mq.
Да, неплохая идея… Наверное, соберусь и напишу в ближайшее время, заодно сам глубже покопаюсь. :-)
Comment form for «Rebase для бедных в Mercurial»