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), хотя бы на примере этого рецепта, посмотрев, что делают команды с логом и рабочей копией.

1

Они же изменятся при перебазировании — получится два набора очень похожих изменений, что может порядочно нагадить в дальнейшем. ;)

Comments: 9 (already: 0) Comment post

Вот запарил.. Лучше допиши книжку вот тут http://hgbook.red-bean.com/hgbookch7.html#x11-1520007.6

Хрюндель , 16:14

man hgignore почитай, он довольно понятно написан.

Alexander Solovyov , 16:45

а теперь представляем себе ситуацию, что нам хочется часть изменений чужих завернуть в branches… Да, репозиторий уже опубликован. Вот что делать то? В git я просто говорю push -f и он перебивает header’ы веток.

catap , 19:01

Не понял вопроса. В какие бранчи? Те бранчи, которые ты имеешь в git’е, в меркуриале тоже есть — вон первый glog их показал. Точно так же с помощью -f ты их можешь получить. А про что ты спрашиваешь — я не понимаю. :(

Alexander Solovyov , 20:19

Понял. Они такие же как в git’е, только не именованные, да?

catap , 21:02

Именно. :-) Т.е. в гите ты должен указать явно, что хочешь получить бранч, а в меркуриале ты его получаешь автоматом, но без имени.

А то, что в меркуриале называется named branch, в гите отсутствует. И я до сих пор их смысла не совсем понял — может просто не сталкивался с use-case’ом.

Alexander Solovyov , 21:19

Вот у меня такая же проблема. Я не доконца понимаю что такое named branch в mercurial и какой их вещественный смысл.

catap , 14:48 (after 6 days)

Пока вроде всё понятно, хотелось бы ещё узнать о принципах и механизме работы mq.

Вася , 19:40 (after 30 days)

Да, неплохая идея… Наверное, соберусь и напишу в ближайшее время, заодно сам глубже покопаюсь. :-)

Alexander Solovyov , 20:29 (after 30 days)

Comment form for «Rebase для бедных в Mercurial»

Required. 30 chars of fewer.

Required.

Comment post