web-dev-qa-db-fra.com

Comment déplacer un ensemble de modifications vers une nouvelle branche dans Mercurial

Je souhaite déplacer un ensemble de modifications d'une branche à une autre. En gros, j'ai actuellement:

A -> B -> C -> D # default branch

Et je veux:

A # default branch
 \-> B -> C -> D # some_new_branch

Où some_new_branch n'existe pas encore. J'ai l'habitude de git, donc je suppose qu'il y a un moyen simple "Mercurial" qui me manque.

57
David Cournapeau

Une façon consiste à exporter un patch pour B, C, D; mise à jour vers A; branche; appliquer le patch:

hg export -o patch B C D
hg update A
hg branch branchname
hg import patch

Pour supprimer B, C, D de la branche par défaut, utilisez la commande strip de l'extension mq.

69
Mark Tolonen

Cela ressemble un peu à une opération de sélection de cerise dans git. Transplant Extension peut être ce que vous cherchez.

11
crazyscot

Avec Mercurial Queue:

# mark revisions as draft in case they were already shared
#hg phase --draft --force B:D
# make changesets a patch queue commits
# (patches are stored .hg/patches)
hg qimport -r B:D
# pop changesets from current branch
hg qpop -a
# 
hg branch some_new_branch
# Push changesets to new branch
hg qpush -a
# and make them commits
hg qfinish -a

Sans commentaire:

hg qimport -r B:D
hg qpop -a
hg branch some_new_branch
hg qpush -a
hg qfinish -a
7
anatoly techtonik

Alternative à la greffe ou au patch, vous pouvez utiliser greffe .

hg update A
hg branch branchname
hg graft -D "B:D"
hg strip B

Notez que changer l'histoire est une mauvaise pratique. Vous ne devez vous déshabiller que si vous n'avez pas encore poussé. Sinon, vous pouvez toujours annuler vos modifications.

6
Kbii