Понедельник, 30 Июнь 2008
Mercurial: поменять commits местами
Захотелось мне поменять два commit’а местами. Так получилось что я в серию мелких опечаток вставил изменение функциональности, что несколько мешала отладке.
На входе имеем:
@ changeset: 3:59a8c74ba900
| tag: tip
| user: Kirill A. Korinskiy <catap@catap.ru>
| date: Mon Jun 30 18:58:48 2008 +0400
| summary: Add to b
|
o changeset: 2:46291e722ba1
| user: Kirill A. Korinskiy <catap@catap.ru>
| date: Mon Jun 30 18:58:35 2008 +0400
| summary: Add to c
|
o changeset: 1:19138e5a67f8
| user: Kirill A. Korinskiy <catap@catap.ru>
| date: Mon Jun 30 18:58:26 2008 +0400
| summary: Add to a
|
o changeset: 0:c96f648e1ada
user: Kirill A. Korinskiy <catap@catap.ru>
date: Mon Jun 30 18:58:00 2008 +0400
summary: Init repo
Первое что нам надо сделать это скинуть верх дерева в очередь патчей:
hg qimport -r 3:tip
hg qpop -a
Теперь наш репозиторий выглядит так (мы перенесли последовательность commit’ов от 3 до tip’а в серию патчей):
@ changeset: 2:46291e722ba1
| user: Kirill A. Korinskiy <catap@catap.ru>
| date: Mon Jun 30 18:58:35 2008 +0400
| summary: Add to c
|
o changeset: 1:19138e5a67f8
| user: Kirill A. Korinskiy <catap@catap.ru>
| date: Mon Jun 30 18:58:26 2008 +0400
| summary: Add to a
|
o changeset: 0:c96f648e1ada
user: Kirill A. Korinskiy <catap@catap.ru>
date: Mon Jun 30 18:58:00 2008 +0400
summary: Init repo
Теперь надо сделать up до места куда будем вставлять нашу верхушку:
hg up -C 1
И собственно вставить ее
hg qpush -a
hg qdelete -r qbase:qtip
Получаем:
@ changeset: 3:34f6257703c7
| tag: tip
| parent: 1:19138e5a67f8
| user: Kirill A. Korinskiy <catap@catap.ru>
| date: Mon Jun 30 18:58:48 2008 +0400
| summary: Add to b
|
| o changeset: 2:46291e722ba1
|/ user: Kirill A. Korinskiy <catap@catap.ru>
| date: Mon Jun 30 18:58:35 2008 +0400
| summary: Add to c
|
o changeset: 1:19138e5a67f8
| user: Kirill A. Korinskiy <catap@catap.ru>
| date: Mon Jun 30 18:58:26 2008 +0400
| summary: Add to a
|
o changeset: 0:c96f648e1ada
user: Kirill A. Korinskiy <catap@catap.ru>
date: Mon Jun 30 18:58:00 2008 +0400
summary: Init repo
Далее прыгаем до 2 ревизии (начала середины которую хотим перенести наверх):
hg up -C 2
Переносим новую голову в серию патчей:
hg qimport -r 2:2
hg qpop -a
Теперь поднимаемся до tip’а и вставляем серию патчей:
hg up -C tip
hg push -a
hg qdelete -r qbase:qtip
И получаем:
@ changeset: 3:738b73e4902f
| tag: tip
| user: Kirill A. Korinskiy <catap@catap.ru>
| date: Mon Jun 30 18:58:35 2008 +0400
| summary: Add to c
|
o changeset: 2:34f6257703c7
| user: Kirill A. Korinskiy <catap@catap.ru>
| date: Mon Jun 30 18:58:48 2008 +0400
| summary: Add to b
|
o changeset: 1:19138e5a67f8
| user: Kirill A. Korinskiy <catap@catap.ru>
| date: Mon Jun 30 18:58:26 2008 +0400
| summary: Add to a
|
o changeset: 0:c96f648e1ada
user: Kirill A. Korinskiy <catap@catap.ru>
date: Mon Jun 30 18:58:00 2008 +0400
summary: Init repo
Комментарии
Кирилл, продублируй это в hg-tricks, плз.
Продублировал. Но ты думаешь кто-то этим будет пользоваться, реально?
В принципе, может быть, я. ;)
Форма комментирования для «Mercurial: поменять commits местами»
Надо учитывать что это все круто пока не было push’а. Просто после него появится много-много heads и их придется рубить через merge.
Реально использование я вижу пока одно: когда ты делаешь push на удаленный репозиторий для тестов (который ты всегда можешь грохнуть и с него никто не кормится), что бы проще было up’иться во время этих тестов.
Как разносить коммиты по бранчам рассказывать, раз пошло такое дело?
Можно легче:
А если мы хотим перенести эти патчи в другую ветку?
Мой способ на это намекает ;)