web-dev-qa-db-fra.com

Mercurial se déplace vers une nouvelle branche

J'ai un certain nombre de modifications que j'ai validées dans mon référentiel local, mais qui n'ont pas encore été poussées. Puisqu'une fonctionnalité prend plus de temps que prévu, je veux échanger ces modifications sur une branche nommée avant de pousser. Comment puis-je faire ceci?

123
Casebash

Comme suggéré par Mark, le MqExtension est une solution à votre problème. À mon humble avis, un flux de travail plus simple consiste à utiliser extension de rebase . Supposons que vous ayez une histoire comme celle-ci:

@  changeset:   2:81b92083cb1d
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   1:8bdc4508ac7b
|  summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

Cela signifie que la révision 0 est la base sur laquelle vous avez commencé à travailler sur votre fonctionnalité. Maintenant, vous voulez avoir des révisions 1-2 sur une branche nommée, disons my-feature. Mettre à jour la révision 0 et créez cette branche:

$ hg up 0
$ hg branch my-feature
$ hg ci -m "start new branch my-feature"

L'histoire ressemble maintenant à ceci:

@  changeset:   3:b5939750b911
|  branch:      my-feature
|  tag:         tip
|  parent:      0:d554afd54164
|  summary:     start new branch my-feature
|
| o  changeset:   2:81b92083cb1d
| |  summary:     my new feature: edit file a
| |
| o  changeset:   1:8bdc4508ac7b
|/   summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

Utilisez la commande rebase pour déplacer les révisions 1-2 sur la révision 3:

$ hg rebase -s 1 -d 3

Il en résulte le graphique suivant:

@  changeset:   3:88a90f9bbde7
|  branch:      my-feature
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   2:38f5adf2cf4b
|  branch:      my-feature
|  summary:     my new feature: add file b
|
o  changeset:   1:b5939750b911
|  branch:      my-feature
|  summary:     start new branch my-feature
|
o  changeset:   0:d554afd54164
   summary:     initial

C'est comme ça .. comme mentionné dans les commentaires à la réponse de Mark, se déplacer en général sur des ensembles de modifications déjà poussés est une mauvaise idée, à moins que vous ne travailliez dans une petite équipe où vous êtes en mesure de communiquer et d'appliquer votre manipulation d'historique.

152
Oben Sonne

Vous pouvez utiliser le MqExtension . Disons que les changements à déplacer sont les révisions 1-3:

hg qimport -r 1:3    # convert revisions to patches
hg qpop -a           # remove all them from history
hg branch new        # start a new branch
hg qpush -a          # Push them all back into history
hg qfin -a           # finalize the patches
30
Mark Tolonen

Je préfère la solution de correctif décrire ici par Mark Tolonen

Ce que j'ai:

hg log -G

#default branch
@  changeset:   3:cb292fcdbde1
|
o  changeset:   2:e746dceba503
|
o  changeset:   1:2d50c7ab6b8f
|
o  changeset:   0:c22be856358b

Ce que je veux:

  @  changeset:   3:0e85ae268e35
  |  branch:      feature/my_feature
  |
  o  changeset:   2:1450cb9ec349
  |  branch:      feature/my_feature
  |
  o  changeset:   1:7b9836f25f28
  |  branch:      feature/my_feature
  |
 /
|
o  changeset:   0:c22be856358b

commandes mercurials:

hg export -o feature.diff 1 2 3
hg update 0
hg branch feature/my_feature
hg import feature.diff

Voici l'état de mon référentiel local

@  changeset:   6:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   5:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   4:7b9836f25f28
|  branch:      feature/my_feature
|
| o  changeset:   3:cb292fcdbde1
| |
| o  changeset:   2:e746dceba503
| |
| o  changeset:   1:2d50c7ab6b8f
|/
|
o  changeset:   0:c22be856358b

Maintenant, je dois supprimer les révisions 1 2 et 3 de ma branche par défaut. Vous pouvez le faire avec la commande strip de l'extension de mq. hg strip supprime l'ensemble de modifications et tous ses descendants du référentiel.

Activez l'extension en ajoutant les lignes suivantes à votre fichier de configuration (.hgrc ou Mercurial.ini):

vim ~/.hgrc et ajouter :

[extensions]
mq =

Et maintenant, supprimez ce référentiel sur la révision 1.

hg strip 1

et nous voici

@  changeset:   3:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   2:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   1:7b9836f25f28
|  branch:      feature/my_feature
|
o  changeset:   0:c22be856358b

note: les changesets sont différents mais les révisions sont les mêmes

9
Guillaume Vincent

Pour ceux qui sont enclins à utiliser l'interface graphique

  1. Aller à Tortoise Hg -> File -> Settings puis cochez rebase.

enter image description here

  1. Redémarrer l'interface utilisateur de la tortue

  2. Créez une nouvelle branche où vous déplacerez les modifications. Cliquez sur le nom de la branche actuelle -> choisissez Open a new named branch -> choisissez le nom de la branche.

enter image description here

  1. Si les modifications que vous souhaitez déplacer n'ont pas été apportées public (par exemple draft) passez à 5. (Si les modifications ont déjà été publiées et que vous n'êtes pas un développeur senior, vous devez en parler à une personne senior ( obtenir un bouc émissaire) car vous pourriez tout gâcher, je ne prends aucune responsabilité :)).

Accédez à View -> Show Console (ou Ctrl + L) puis écrivez dans la console hg phase -f -d 2 - où 2 est la révision la plus basse, vous vous déplacerez vers une nouvelle branche.

  1. Accédez à la branche et à la révision (devrait être la révision la plus élevée si vous déplacez les modifications vers la nouvelle branche créée à l'étape 3.) Right Mouse -> Update

  2. Accédez à la branche et à la révision, vous déplacerez les modifications de Right Mouse -> Modify History -> Rebase

enter image description here

  1. Cliquez sur Rebase et priez pour qu'il n'y ait pas de conflits, fusionnez si vous le devez.

  2. Poussez les modifications, à ce stade, toutes les révisions doivent toujours être draft.

  3. Accédez à la révision la plus élevée dans la branche dans laquelle vous déplaciez les modifications vers Right Mouse -> Change Phase to -> Public.

enter image description here

J'espère que cela vous fera gagner du temps.

5
Matas Vaitkevicius