46 votes

Gérer les branches de la version dans Mercurial

Récemment, je suis passé de SVN à Mercurial. Je me demande maintenant comment réaliser mon flux de travail de branchement dans Mercurial selon les bonnes pratiques, en espérant que les autres développeurs comprennent ce qui se passe dans le dépôt.

Voici le déroulement des opérations :

  1. Habituellement, j'ai un tronc/une branche par défaut où le travail sur la série de versions actuelles a lieu. Disons que c'est la 1.x. En même temps, j'utilise une branche 2.x pour travailler sur la prochaine version majeure. Les changements dans cette branche peuvent être radicaux, donc la fusion avec la branche trunk/default/1.x n'a pas de sens ici.
    • Après un certain temps, le travail sur la 2.x peut être terminé et la version 2.0 est publiée. Je veux maintenant que la branche 2.x soit la nouvelle branche par défaut/tronc et que la branche par défaut/tronc actuelle soit la branche 1.x.
    • En répétant ce processus, il peut y avoir une nouvelle branche 3.x. Comme précédemment, si la version 3.0 est publiée, la 3.x devrait devenir la nouvelle branche par défaut, tandis que la branche 2.x devrait (à nouveau) devenir la branche par défaut actuelle.

Ma question est la suivante no si ce flux de travail est bon (je suppose qu'il n'est pas fondamentalement mauvais). Ma question est de savoir si la façon dont je réalise cela dans Mercurial peut être considérée comme une bonne pratique ou s'il existe de meilleures possibilités.

Voici donc comment je compte gérer les branches dans Mercurial ...

Commencer à partir d'un dépôt avec une seule branche qui contient le code de la série de versions actuelles 1.x :

$ hg init
$ echo "hello world" > file1.txt
$ hg ci -A -m "Initial commit of 1.x code"

Commencer à travailler sur la version 2.x :

$ hg branch 2.x
$ hg ci -m "Create new branch for 2.x development"
$ echo "Big new feature for 2.x" > file2.txt
$ hg ci -A -m "Add big new feature"

Pendant ce temps, faites un peu de travail dans la série de versions actuelles (1.x) :

$ hg up default
$ echo "Minor adjustments specific for 1.x" > file3.txt
$ hg ci -A -m "Minor adjustments"

Après un certain temps, la version 2.0 est prête, youpi ! Faire par défaut à la branche 1.x y 2.x a par défaut :

$ hg up default
$ hg branch 1.x
$ hg ci -m "Make default branch to 1.x branch"
$ hg up 2.x
$ hg ci --close-branch -m "Close branch 2.x"
$ hg branch --force default
$ hg ci -m "Make former 2.x branch to new default"

Maintenant, créez une nouvelle branche 3.x et y travailler, travailler aussi sur par défaut . Après un certain temps, la version 3.0 est prête et il est à nouveau temps de gérer les noms des branches :

$ hg up default
$ hg branch --force 2.x # (reuse previously closed 2.x branch name)
$ hg ci -m "Make default branch to 2.x branch"
$ hg up 3.x
$ hg ci --close-branch -m "Close branch 3.x"
$ hg branch --force default
$ hg ci -m "Make former 3.x branch to new default"

Le repo peut maintenant ressembler à ceci ('o' sont les têtes) :

o Branch default (3.x)
|
| o Branch 2.x
 \|
  | o Branch 1.x
   \|
    |
    .

Le point principal dont je ne suis pas sûr est si réutilisation de noms de branches et jongler avec le nom de la branche par défaut est une bonne pratique.

Beaucoup de texte pour cette question - désolé - mais je voulais être clair sur ce que je fais.

47voto

Steve Losh Points 11958

Voilà ce que je ferais :

Faire default votre branche "mainline". L'extrémité de cette branche est la version "actuellement publiée au public" de votre code. Les corrections de bogues critiques peuvent être commises directement dans cette branche et fusionnées dans les branches de développement.

Pour commencer à travailler sur la version 2.0, faites un 2.0-dev branche. Envoyez les changements pour la 2.0 dans cette branche, et fusionnez les corrections de bogues critiques de la branche principale ( default ) en elle. Une fois que vous avez terminé avec 2.0, fusionnez 2.0-dev en default et marquer le résultat comme 2.0 .

En procédant de cette manière, vous n'avez pas à vous soucier de jongler avec les noms des branches et vous pouvez fusionner les corrections de bogues critiques de la ligne principale dans les branches de développement assez facilement.

Elle est également efficace lorsque vous travaillez sur plusieurs versions futures à la fois (disons 2.1 et 3.0). Vous pouvez périodiquement fusionner les modifications de la 2.1 dans la 3.0 pour maintenir la 3.0 à jour.

Vous obtiendrez un graphique comme celui-ci :

$ hg glog -l 1000
@       changeset:  25:efc0096f47c0  tip
|       summary:    Added tag 3.0 for changeset d1a7fc3d7d77
|
o       changeset:  24:d1a7fc3d7d77  3.0
|\      summary:    Merge in the redesign changes.
| |
| o     changeset:  23:b5b69d24c8f7 3.0-dev
| |     summary:    Finish 3.0 redesign.
| |
| o     changeset:  22:4c2f98fac54b 3.0-dev
|/|     summary:    Merge in the latest changes to 2.1/mainline.
| |
o |     changeset:  21:37df04521032
| |     summary:    Added tag 2.1 for changeset 39ecc520fc0a
| |
o |     changeset:  20:39ecc520fc0a  2.1
|\ \    summary:    2.1 development is done.
| | |
| o |   changeset:  19:208f3f9236af 2.1-dev
| | |   summary:    Finish the 2.1 work.
| | |
| | o   changeset:  18:4a024009a9d6 3.0-dev
| | |   summary:    More redesign work.
| | |
| | o   changeset:  17:00c416888c25 3.0-dev
| |/|   summary:    Merge in changes from the 2.1 branch to keep the redesign current.
| | |
| o |   changeset:  16:a57e781a0db1 2.1-dev
| | |   summary:    More 2.1 work.
| | |
| | o   changeset:  15:ddeb65402a61 3.0-dev
| | |   summary:    More redesign work.
| | |
+---o   changeset:  14:90f5d7a8af9a 3.0-dev
| | |   summary:    Merge in the fire fixes.
| | |
| o |   changeset:  13:78a949b67bb9 2.1-dev
|/| |   summary:    Merge in the fire fixes.
| | |
o | |   changeset:  12:6dfe9d856202
| | |   summary:    Oh no everything is on fire, fix it in the mainline.
| | |
| o |   changeset:  11:86767671dcdb 2.1-dev
| | |   summary:    Smaller changes for 2.1.
| | |
| | o   changeset:  10:25dec81d2546 3.0-dev
| | |   summary:    Work more on the redesign.
| | |
+---o   changeset:  9:42c7d689fb24 3.0-dev
| |     summary:    Start working on a complete redesign.
| |
| o     changeset:  8:3da99186ca7d 2.1-dev
|/      summary:    Start working on 2.1.
|
o       changeset:  7:9ba79361827d
|       summary:    Added tag 2.0 for changeset 755ed5c5e291
|
o       changeset:  6:755ed5c5e291  2.0
|\      summary:    Merge in the dev branch for 2.0.
| |
| o     changeset:  5:44a833fcc838 2.0-dev
| |     summary:    Finish work on 2.0.
| |
| o     changeset:  4:d7ba6aae1651 2.0-dev
|/|     summary:    Merge in the critical fix.
| |
o |     changeset:  3:968049f1b33a
| |     summary:    Fix a critical bug on the main branch.
| |
| o     changeset:  2:917869609b25 2.0-dev
| |     summary:    More work on the new version.
| |
| o     changeset:  1:f95798b9cb2e 2.0-dev
|/      summary:    Start working on version 2.0.
|
o       changeset:  0:8a3fb044d3f4
        summary:    Initial commit.

2voto

Alex Povar Points 1236

Je pense que vous devriez y réfléchir : un modèle de branchement git réussi .

Je ne suis pas un grand fan de git, mais ce modèle est très utile pour mercurial aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X