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?
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.
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
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
Pour ceux qui sont enclins à utiliser l'interface graphique
Tortoise Hg
-> File
-> Settings
puis cochez rebase
.Redémarrer l'interface utilisateur de la tortue
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.
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.
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
Accédez à la branche et à la révision, vous déplacerez les modifications de Right Mouse
-> Modify History
-> Rebase
Cliquez sur Rebase
et priez pour qu'il n'y ait pas de conflits, fusionnez si vous le devez.
Poussez les modifications, à ce stade, toutes les révisions doivent toujours être draft
.
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
.
J'espère que cela vous fera gagner du temps.