2010-02-10 4 views
233

J'ai fini de travailler sur une branche de fonctionnalité feature-x. Je veux fusionner les résultats à la branche default et fermer feature-x afin de se débarrasser de celui-ci dans la sortie de hg branches.Comment fermer correctement une branche de fonctionnalité dans Mercurial?

je suis venu 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 (changests 40 - 41) est fermé, mais il y a une nouvelle tête, la branche de fermeture changeset 44, qui sera listé 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 
| 

Mise à jour: Il apparaît que depuis la version 1.5 Mercurial ne montre plus les têtes de branches fermées dans la sortie de hg heads.

Est-il possible de fermer une branche fusionnée sans laisser plus de tête? Y a-t-il une manière plus correcte de fermer une branche de fonctionnalité?

questions connexes:

+0

@Andrey: mais l'article souligné ne parle PAS seulement de "--close-branche". Il montre * quatre * façons d'élaguer votre branche. Si vous n'en voulez plus, vous pouvez cloner comme expliqué dans l'article. Le seul "problème" est si pour une raison quelconque vous voulez le fermer, mais gardez le autour. – SyntaxT3rr0r

+1

@WizardOfOdds Oui, j'ai lu tout l'article sur l'élagage des branches mortes. Je veux que la branche reste dans l'historique des révisions, pas pour la jeter. Auparavant, je fusionnais simplement les branches d'entités dans 'default' sans les" fermer ". Il en résultait 0 nouvelles têtes mais de telles branches étaient visibles dans les 'branches hg 'pour toujours (comme les branches inactives). –

+0

Pour développer des fonctionnalités, j'ai tendance à cloner tout le dépôt et à le fusionner une fois la fonction terminée. Je n'aime pas avoir les restes de branches (fermées) dans l'histoire. – DanMan

Répondre

211

Une façon est de simplement laisser les branches fonctionnelles fusionnées ouvert (et inactif):

$ 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 façon est de fermer une succursale de fonction avant de fusionner en utilisant un supplément commit:

$ 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 il laisse une branche ouverte. Le second ne laisse pas de têtes/branches ouvertes, mais nécessite un commit supplémentaire.On peut combiner la dernière validation réelle à la branche feature avec cette validation supplémentaire en utilisant --close-branch, mais il faut savoir à l'avance quel commit sera le dernier.

Mise à jour: Depuis Mercurial 1.5, vous pouvez fermer la branche à tout moment afin de ne pas apparaître dans les deux hg branches et hg heads plus. La seule chose qui pourrait vous ennuyer est que techniquement le graphique de révision aura encore une révision de plus sans childen.

Mise à jour 2: Depuis Mercurial 1.8 marque-pages sont devenus une caractéristique essentielle de Mercurial. Les signets sont plus pratiques pour la dérivation que les branches nommées. Voir aussi cette question:

+1

Il n'est pas nécessairement vrai que 'Bookmarks sont plus pratiques pour la branche que les branches nommées '. Hg signets ne sont pas la même chose que les branches Git. Ils sont remplis de nombreux cas de bordure qui les rendent impropres à la fonctionnalité. Par exemple: lorsque vous clonez un dépôt, vous vous retrouverez avec le dernier commit dans la branche 'default'. Si vous utilisez des signets, cet ensemble de modifications correspond à un signet aléatoire (instable). Si vous utilisez des branches nommées, vous obtiendrez le dernier commit dans la branche stable/default, ce qui est généralement ce que vous voulez. Les signets arriveront un jour, mais ils ne sont pas encore là. – Gili

+0

J'utilise les signets comme des balises privées qui ne sont visibles que dans mon référentiel local. Ils agissent comme des rappels de changesets que j'ai besoin de revisiter. – Gili

+0

J'ai essayé de suivre cette approche, mais j'ai toujours une erreur en essayant de pousser: 'abort: push crée de nouvelles branches distantes:'. Qu'est-ce que j'ai pu faire de mal? – kasperd

11

EDIT aïe, trop tard ... Je sais lire votre commentaire indiquant que vous voulez conserver la fonctionnalité x changeset autour, de sorte que le approche de clonage ici ne fonctionne pas.

Je vais toujours laisser la réponse ici car cela peut aider les autres.

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

Pour autant que je comprends que vous avez cela et voulez vous débarrasser de la « fonction-x » tête une fois pour toutes:

@ 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 vous faites ceci:

hg clone . ../cleanedrepo --rev 7 

Et vous aurez les points suivants, et vous verrez cette fonction-x est en effet disparu:

@ 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 

je peut-être mal compris ce que vous vouliez, mais S'il vous plaît ne mod pas vers le bas, je pris le temps de reproduire votre cas d'utilisation:)

+0

Oui, je ne veux pas supprimer l'historique. Quoi qu'il en soit, merci. –

76

IMHO il y a deux cas pour les branches qui ont été oublié de fermer

Cas 1: branche n'a pas été fusionnées en défaut

dans ce cas je mets à jour la branche et fais un autre commit avec --close-branche, malheureusement ceci élit la branche pour devenir le nouveau tip et donc avant de le pousser vers d'autres clones je m'assure que le réel Le pourboire reçoit plus de changements et les autres ne sont pas confus au sujet de cet étrange conseil.

hg up myBranch 
hg commit --close-branch 

Cas n ° 2: branche a été absorbée par défaut

Cette affaire est pas très différent du cas 1 et il peut être résolu en reproduisant les étapes pour le cas 1 et deux supplémentaires.

Dans ce cas, je mets à jour le changement de branche, fais un autre commit avec --close-branche et fusionne le nouveau changeset qui est devenu le tip par défaut. la dernière opération crée une nouvelle astuce dans la branche par défaut - HOORAY!

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

Espérons que cela aidera les futurs lecteurs.

+3

Bonne réponse claire pour un débutant Mercurial comme moi. Et merci de ne pas utiliser "ci" qui n'est pas répertorié comme l'une des commandes par hg help, donc je ne sais pas ce que cela signifie :) –

+7

@ MB: dans ce cas, 'hg help ci' expliquera ça à toi. –

6

Il est étrange, que personne n'a suggéré encore la façon la plus robuste de la fermeture d'une des branches de fonction ... Vous pouvez combiner simplement commit de fusion avec le drapeau --close-branche (c.-à-livrez des fichiers modifiés et fermer la branchez simultanément):

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

Alors, c'est tout. Pas de tête supplémentaire sur le revgraph. Pas de commit supplémentaire.

+0

Je l'ai mentionné dans ma réponse: "" "On peut combiner le dernier commit réel à la branche feature avec ce commit supplémentaire en utilisant --close-branch, mais il faut savoir à l'avance quel commit sera le dernier." "" –

+0

Ok, je vois. Je ne comprends tout simplement pas la dernière partie de la phrase ("mais il faut savoir ..."), alors je pensais que cela signifiait quelque chose de différent. Aussi, je voudrais noter que cette méthode n'est pas supportée par la plupart des outils graphiques (TortoiseHG, SourceTree etc.). – tav

+0

@AndreyVlasovskikh Le but de cette réponse est de fermer la branche dans la fusion plutôt que dans la dernière validation de la branche de fonctionnalité. – kasperd

Questions connexes