Как я могу удалить некоторые коммиты в Mercurial, которые были применены к неправильной ветке, а затем воспроизвести их на правильной?

Мой коллега дважды совершал фиксацию в своем репозитории не в той ветке.

Каков наиболее эффективный способ взять эти две фиксации, избавиться от них, а затем правильно зафиксировать их в нужной ветке? (изменения не были внесены)

В идеале мы хотели бы сделать это из TortoiseHG, но, конечно, мы будем использовать командную строку, если это лучший вариант.


person Neil Trodden    schedule 23.07.2010    source источник
comment
Это может помочь на стороне TortoiseHg: stackoverflow.com/questions/2963250/   -  person VonC    schedule 23.07.2010


Ответы (3)


Расширение Mercurial Queues (mq) может помочь.

Учитывая историю изменений, которая выглядит так:

@  changeset:   3:9dc681b56325
|  summary:     file4
|
o  changeset:   2:6675b3f86aa7
|  summary:     file3
|
| o  changeset:   1:4a3209ed5b2f
|/   summary:     file2
|
o  changeset:   0:6ab45ac3bd6d
   summary:     file1

Следующие команды перемещают набор изменений файла 'file4' в другую ветку (заголовок 'file2'):

hg qimport -r 3     // convert revision 3 to a patch
hg qpop             // remove it
hg update 1         // switch to the other branch head
hg qpush            // push the change back
hg qfin -a          // convert the applied patch back to a changeset

В результате чего:

@  changeset:   3:3faa754edb0b
|  summary:     file4
|
| o  changeset:   2:6675b3f86aa7
| |  summary:     file3
| |
o |  changeset:   1:4a3209ed5b2f
|/   summary:     file2
|
o  changeset:   0:6ab45ac3bd6d
   summary:     file1

Обратите внимание, что хеш набора изменений для версии 3 изменился из-за того, что набор изменений теперь имеет другого родителя. Более поздние версии TortoiseHg также поддерживают расширение MQ.

person Mark Tolonen    schedule 29.07.2010

Из того, что я выяснил, лучше всего использовать трансплантат. Он применяет изменение к любой другой ревизии, которую вы хотите.

http://mercurial.aragost.com/kick-start/tasks.html#transplanting-changes

Решение моей проблемы состояло в том, чтобы обновить ветку, в которой должны были быть применены два изменения, трансплантировать два набора изменений и затем использовать mq для удаления изменений. Все это можно сделать и в tortoisehg.

person Neil Trodden    schedule 23.07.2010

В этом случае лучше использовать hg rebase.

https://www.mercurial-scm.org/wiki/RebaseExtension

person user133536    schedule 19.06.2013
comment
Обычно это самый простой способ разрешить эту ситуацию. - person StayOnTarget; 14.03.2019