web-dev-qa-db-fra.com

Comment fermer correctement une branche de fonctionnalités dans Mercurial?

J'ai fini de travailler sur une branche de fonctionnalité feature-x. Je souhaite fusionner les résultats dans la branche default et fermer feature-x afin de s'en débarrasser dans la sortie de hg branches.

Je suis arrivé avec le scénario suivant, mais il a quelques problèmes:

$ hg up default
$ hg merge feature-x
$ hg ci -m merge
$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch

Ainsi, la branche feature-x (les modifications 40-41) est fermée, mais il y a une nouvelle tête , le changement de branche fermante 44, qui sera répertorié dans hg heads à chaque fois:

$ hg log ...
o  44 Closed branch feature-x
|
| @  43 merge
|/|
| o  42 Changeset C
| |
o |  41 Changeset 2
| |
o |  40 Changeset 1
|/
o  39 Changeset B
|
o  38 Changeset A
|

Update : Il semble que depuis la version 1.5, Mercurial ne montre plus les têtes des branches fermées dans la sortie de hg heads.

Est-il possible de fermer une branche fusionnée sans laisser une tête de plus? Existe-t-il un moyen plus approprié de fermer une branche de fonctionnalité?

Questions connexes:

237
Andrey Vlasovskikh

Une solution consiste simplement à laisser les branches de fonctions fusionnées ouvertes (et inactives):

$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
feature-x  41:...
    (2 branches)

$ hg branches -a
default    43:...
    (1 branch)

Une autre méthode consiste à fermer une branche de fonctionnalité avant la fusion à l'aide d'un commit supplémentaire:

$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch
$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
    (1 branch)

Le premier est plus simple, mais laisse une branche ouverte. La seconde ne laisse pas de têtes/branches ouvertes, mais nécessite un commit supplémentaire. On peut combiner la dernière validation réelle dans la branche de fonctionnalité avec cette validation supplémentaire en utilisant --close-branch, mais il faut savoir à l'avance quelle validation sera la dernière.

Mise à jour : Depuis Mercurial 1.5, vous pouvez fermer la branche à tout moment. Elle ne sera donc plus affichée à la fois dans hg branches et hg heads. . La seule chose qui pourrait vous déranger, c'est que techniquement, le graphe de révision comportera encore une révision sans enfants.

Mise à jour 2 : Depuis Mercurial 1.8 , les signets sont devenus une caractéristique essentielle de Mercurial. Les signets sont plus pratiques pour créer des branches que les branches nommées. Voir aussi cette question:

217
Andrey Vlasovskikh

à mon humble avis, il y a deux cas pour les branches qui ont été oubliés de fermer

Cas 1: la branche n'a pas été fusionnée par défaut

dans ce cas, je mets à jour la branche et fais un autre commit avec --close-branch, malheureusement, cette branche choisit la branche pour devenir la nouvelle astuce et donc avant de la transmettre à d'autres clones, je m'assure que la véritable astuce reçoit quelques modifications supplémentaires et d'autres ne soyez pas confus à propos de cette astuce étrange.

hg up myBranch
hg commit --close-branch

Cas 2: la branche a été fusionnée par défaut

Ce cas n’est pas très différent du cas 1 et il peut être résolu en reproduisant les étapes du cas 1 et deux autres.

dans ce cas, je mets à jour le jeu de modifications de branche, fais un autre commit avec --close-branch et fusionne le nouveau jeu de modifications devenu le conseil par défaut. la dernière opération crée un nouveau conseil dans la branche par défaut - HOORAY!

hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch

J'espère que cela aidera les futurs lecteurs.

79
Nachbars Lumpi

EDIT Aïe, trop tard ... Je connais votre commentaire qui indique que vous souhaitez conserver l'ensemble de modifications feature-x afin que la méthode de clonage ne fonctionne pas.

Je vais quand même laisser la réponse ici car cela pourrait aider les autres.

Si vous voulez vous débarrasser complètement de "la fonctionnalité X", parce que, par exemple, cela n'a pas fonctionné, vous pouvez le cloner. C’est l’une des méthodes expliquées dans cet article et elle fonctionne, et elle traite spécifiquement des têtes.

Autant que je sache, vous avez ceci et vous voulez vous débarrasser une fois pour toutes de la tête "feature-x":

@    changeset:   7:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| | o  changeset:   5:013a3e954cfd
| |/   summary:     Closed branch feature-x
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

Alors tu fais ça:

hg clone . ../cleanedrepo --rev 7

Et vous aurez ce qui suit, et vous verrez que feature-x est bel et bien parti:

@    changeset:   5:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

J'ai peut-être mal compris ce que vous vouliez, mais s'il vous plaît, ne modifiez pas, j'ai pris le temps de reproduire votre cas d'utilisation:)

11
SyntaxT3rr0r

Il est étrange que personne n'ait encore suggéré le moyen le plus robuste de fermer une branche de fonctionnalités ... Vous pouvez simplement combiner fusionner la validation avec --close -indicateur de branche (c'est-à-dire valider les fichiers modifiés et fermer la branche simultanément):

hg up feature-x
hg merge default
hg ci -m "Merge feature-x and close branch" --close-branch
hg branch default -f

Donc c'est tout. Aucune tête supplémentaire sur le graphique. Pas de commit supplémentaire.

7
tav