Tout d'abord, comme le soulignent @AndrewFinnell et @KenLiu, dans SVN, les noms de répertoire eux-mêmes ne signifient rien - "tronc, branches et balises" sont simplement une convention commune utilisée par la plupart des référentiels. Tous les projets n'utilisent pas tous les répertoires (il est raisonnablement courant de ne pas utiliser de "balises" du tout), et en fait, rien ne vous empêche de les appeler comme vous voulez, bien que briser la convention soit souvent déroutant.
Je décrirai probablement le scénario d'utilisation le plus courant des branches et des balises, et je donnerai un exemple de scénario d'utilisation.
Tronc : La principale zone de développement. C'est là que réside votre prochaine version majeure du code, et dispose généralement de toutes les nouvelles fonctionnalités.
Branches : chaque fois que vous publiez une version majeure, une branche est créée. Cela vous permet de corriger les bogues et de créer une nouvelle version sans avoir à publier les fonctionnalités les plus récentes - éventuellement inachevées ou non testées.
Tags : chaque fois que vous publiez une version (version finale, version candidate (RC) et bêta), vous créez un tag pour celle-ci. Cela vous donne une copie ponctuelle du code tel qu'il était à cet état, vous permettant de revenir en arrière et de reproduire les bogues si nécessaire dans une ancienne version, ou de rééditer une ancienne version exactement comme elle était. Les branches et les balises dans SVN sont légères - sur le serveur, il ne fait pas une copie complète des fichiers, juste un marqueur indiquant "ces fichiers ont été copiés lors de cette révision" qui ne prend que quelques octets. Dans cet esprit, vous ne devriez jamais vous soucier de créer une balise pour tout code publié. Comme je l'ai dit plus tôt, les balises sont souvent omises et, à la place, un journal des modifications ou un autre document clarifie le numéro de révision lorsqu'une version est effectuée.
Par exemple, disons que vous démarrez un nouveau projet. Vous commencez à travailler dans "trunk", sur ce qui sera finalement publié en version 1.0.
- trunk / - version de développement, bientôt 1.0
- branches / - vide
Une fois la version 1.0.0 terminée, vous branchez le tronc dans une nouvelle branche "1.0" et créez une balise "1.0.0". Maintenant, travaillez sur ce qui sera finalement 1.1 continue dans le tronc.
- trunk / - version de développement, bientôt 1.1
- branches / 1.0 - version 1.0.0
- tags / 1.0.0 - 1.0.0 version de sortie
Vous rencontrez des bogues dans le code, les corrigez dans le tronc, puis fusionnez les correctifs dans la branche 1.0. Vous pouvez également faire le contraire et corriger les bogues dans la branche 1.0, puis les fusionner à nouveau dans le tronc, mais les projets se limitent généralement à la fusion à sens unique pour réduire les risques de manquer quelque chose. Parfois, un bogue ne peut être corrigé qu'en 1.0 car il est obsolète en 1.1. Cela n'a pas vraiment d'importance: vous voulez seulement vous assurer que vous ne publiez pas 1.1 avec les mêmes bugs qui ont été corrigés dans 1.0.
- trunk / - version de développement, bientôt 1.1
- branches / 1.0 - prochaine version 1.0.1
- tags / 1.0.0 - 1.0.0 version de sortie
Une fois que vous avez trouvé suffisamment de bogues (ou peut-être un bogue critique), vous décidez de faire une version 1.0.1. Vous créez donc une balise "1.0.1" à partir de la branche 1.0 et libérez le code. À ce stade, le tronc contiendra ce qui sera 1.1 et la branche "1.0" contient le code 1.0.1. La prochaine fois que vous publierez une mise à jour 1.0, ce sera 1.0.2.
- trunk / - version de développement, bientôt 1.1
- branches / 1.0 - prochaine version 1.0.2
- tags / 1.0.0 - 1.0.0 version de sortie
- tags / 1.0.1 - 1.0.1 version de sortie
Finalement, vous êtes presque prêt à publier la version 1.1, mais vous voulez d'abord faire une bêta. Dans ce cas, vous effectuez probablement une branche "1.1" et une balise "1.1beta1". Maintenant, le travail sur ce qui sera 1.2 (ou 2.0 peut-être) continue dans le tronc, mais le travail sur 1.1 continue dans la branche "1.1".
- trunk / - version de développement, bientôt 1.2
- branches / 1.0 - prochaine version 1.0.2
- branches / 1.1 - version 1.1.0 à venir
- tags / 1.0.0 - 1.0.0 version de sortie
- tags / 1.0.1 - 1.0.1 version de sortie
- tags / 1.1beta1 - version 1.1 beta 1
Une fois que vous avez publié la version 1.1 finale, vous créez une balise "1.1" à partir de la branche "1.1".
Vous pouvez également continuer à maintenir la version 1.0 si vous le souhaitez, en portant des corrections de bogues entre les trois branches (1.0, 1.1 et trunk). L'important est que pour chaque version principale du logiciel que vous gérez, vous disposez d'une branche qui contient la dernière version du code pour cette version.
Une autre utilisation des branches est pour les fonctionnalités. C'est là que vous branchez le tronc (ou l'une de vos branches de version) et travaillez sur une nouvelle fonctionnalité de manière isolée. Une fois la fonctionnalité terminée, vous la fusionnez et supprimez la branche.
- trunk / - version de développement, bientôt 1.2
- branches / 1.1 - version 1.1.0 à venir
- branches / ui-rewrite - branche de fonction expérimentale
L'idée est que vous travaillez sur quelque chose de perturbateur (qui empêcherait ou gênerait d'autres personnes de faire leur travail), quelque chose d'expérimental (qui pourrait même ne pas arriver), ou peut-être juste quelque chose qui prend beaucoup de temps (et vous avez peur que si elle contient une version 1.2 lorsque vous êtes prêt à créer une branche 1.2 à partir du tronc), vous pouvez le faire de manière isolée dans la branche. Généralement, vous le maintenez à jour avec le tronc en y fusionnant tout le temps les modifications, ce qui facilite la réintégration (fusionnez de nouveau dans le tronc) lorsque vous avez terminé.
Notez également que le schéma de versionnage que j'ai utilisé ici n'est que l'un des nombreux. Certaines équipes font des corrections de bogues / versions de maintenance comme 1.1, 1.2, etc., et des changements majeurs comme 1.x, 2.x, etc. L'utilisation ici est la même, mais vous pouvez nommer la branche "1" ou "1 .x "au lieu de" 1.0 "ou" 1.0.x ". (De plus, le versionnage sémantique est un bon guide sur la façon de faire les numéros de version).