web-dev-qa-db-fra.com

En quoi un tag est-il différent d'une branche dans Git? Lequel devrais-je utiliser, ici?

J'ai quelques difficultés à comprendre comment utiliser les balises par rapport à branches dans - git .

Je viens de déplacer la version actuelle de notre code de cvs à git , et je vais maintenant travailler sur un sous-ensemble de ce code pour une fonctionnalité particulière. Quelques autres développeurs travailleront également sur ce problème, mais tous les développeurs de notre groupe ne vont pas s'intéresser à cette fonctionnalité. Devrais-je créer une branche ou un tag? Dans quelles situations devrais-je utiliser l'un par rapport à l'autre?

575
Bialecki

Un tag représente une version d'une branche particulière à un moment donné. Un branche représente un thread de développement distinct pouvant être exécuté en même temps que d'autres efforts de développement sur la même base de code. Les modifications apportées à une branche peuvent éventuellement être fusionnées dans une autre branche pour les unifier.

Habituellement, vous aurez taguer une version particulière pour pouvoir la recréer, par exemple , c'est la version que nous avons envoyée à XYZ Corp . Une branche est plus une stratégie pour fournir des mises à jour continues sur une version particulière du code tout en continuant à faire du développement dessus. Vous allez créer une branche de la version livrée, poursuivre le développement sur la ligne principale, mais apporter des corrections de bugs à la branche qui représente la version livrée. Finalement, vous fusionnerez ces corrections de bogues dans la ligne principale. Vous utiliserez souvent à la fois des branches et des balises. Différentes balises peuvent s’appliquer à la ligne principale et à ses branches pour indiquer des versions particulières (livrées aux clients, par exemple) le long de chaque branche que vous souhaitez recréer - pour la livraison, le diagnostic de bogues, etc.

C'est en fait plus compliqué que cela - ou aussi compliqué que vous voulez le faire - mais ces exemples devraient vous donner une idée des différences.

490
tvanfosson

Du point de vue théorique:

  • Les balises sont des noms symboliques pour un révision donné. Ils pointent toujours vers le même objet (généralement: vers la même révision); ils ne changent pas.
  • les branches sont des noms symboliques pour ligne de développement. Les nouveaux commits sont créés en haut de la branche. Le pointeur de branche avance naturellement, pointant vers les commits les plus récents et les plus récents.

Du point de vue technique:

  • les balises résident dans refs/tags/ espace de noms et peuvent pointer vers objets de balises (balises annotées et éventuellement signées par GPG) ou directement vers objet commit ​​(balise légère moins utilisée pour les noms locaux), ou dans de très rares cas même jusqu'à objet tree ou objet blob (par exemple, GPG Signature).
  • des branches résident dans refs/heads/ espace de noms et ne peuvent pointer que vers commit objects. Le pointeur HEAD doit faire référence à une branche (référence symbolique) ou directement à une validation (détaché HEAD ou à une branche non nommée).
  • Les branches de suivi à distance résident dans refs/remotes/<remote>/ espace de noms et suivent les branches ordinaires du référentiel distant <remote>.

Voir aussi gitglossary manpage:

branche

Une "branche" est une ligne de développement active. Le commit le plus récent sur une branche est appelé la pointe de cette branche. La pointe de la branche est référencée par une tête de branche, qui avance à mesure que des développements supplémentaires sont effectués sur la branche. Un seul référentiel git peut suivre un nombre arbitraire de branches, mais votre arbre de travail est associé à une seule d'entre elles (la branche "actuelle" ou "extraite"), et HEAD pointe sur cette branche.

balise

Une référence pointant sur une balise ou un objet commit. Contrairement à une tête, une balise n'est pas modifiée par un commit. Les balises (pas les objets de balises) sont stockées dans $GIT_DIR/refs/tags/. [...] Une balise est généralement utilisée pour marquer un point particulier de la chaîne d'ascendance du commit.

objet tag

Un objet contenant une référence pointant vers un autre objet, qui peut contenir un message comme un objet de validation. Il peut également contenir une signature (PGP), auquel cas il est appelé "objet de balise signée".

505
Jakub Narębski

Si vous considérez votre référentiel comme un livre qui décrit les progrès de votre projet ...

Branches

Vous pouvez considérer une branche comme l’un de ces favoris :

enter image description here

Un nouveau référentiel n'a qu'un seul de ceux-ci (appelé master), qui passe automatiquement à la dernière page (pensez commit) que vous avez écrite. Cependant, vous êtes libre de créer et d'utiliser davantage de signets afin de marquer d'autres points d'intérêt dans le livre afin de pouvoir y revenir rapidement.

En outre, vous pouvez toujours déplacer un signet particulier vers une autre page du livre (en utilisant git-reset, par exemple); les points d’intérêt varient généralement dans le temps.

Mots clés

Vous pouvez considérer les balises comme des en-têtes de chapitre .

bookmarks

Il peut contenir un titre (think tags annotés ) ou non. Une balise est similaire mais différente d’une branche, en ce sens qu’elle marque un point d’intérêt historique pour le livre. Pour conserver son aspect historique, une fois que vous avez partagé un tag (c’est-à-dire que vous l’avez poussé vers une télécommande partagée), vous n’êtes pas censé le faire déplacez-le à un autre endroit du livre.

137
jub0bs

Ce que vous devez comprendre, venant de CVS, est que vous ne créez plus de répertoires lors de la configuration d’une branche.
Plus de "balise collante" (qui peut être appliquée à un seul fichier), ni de "balise de branche".
La branche et les balises sont deux objets différents dans Git, et elles s'appliquent toujours au rapport all .

Vous ne devriez plus (avec SVN cette fois) structurer explicitement votre référentiel avec:

branches
   myFirstBranch
     myProject
       mySubDirs
   mySecondBranch
     ...
tags
   myFirstTag
     myProject
       mySubDirs
   mySecondTag
   ...

Cette structure provient du fait que CVS est un système de révision et non un système de versions (voir Contrôle de la source ou contrôle de révision? ).
Cela signifie que les branches sont émulées via des balises pour CVS et des copies de répertoire pour SVN.

Votre question a du sens si vous êtes habitué à extraire une étiquette et que commence à y travailler .
Ce que vous ne devriez pas;)
Une balise est supposée représenter un contenu immuable , utilisé uniquement pour y accéder, avec la garantie d'obtenir le même contenu à chaque fois.

Dans Git, l'historique des révisions consiste en une série de commits, formant un graphique.
Une branche est un chemin de ce graphe

x--x--x--x--x # one branch
    \ 
     --y----y # another branch
       1.1
        ^
        |
        # a tag pointing to a commit
  • Si vous extrayez une étiquette, vous devrez créer une branche pour pouvoir commencer à travailler à partir de celle-ci.
  • Si vous extrayez une branche, vous verrez directement la dernière validation de la branche ('HEAD') de cette branche.

Voir réponse de Jakub Narębski pour tous les détails techniques, mais franchement, à ce stade, vous n'avez pas (encore) besoin de tous les détails;)

Le point principal est: une balise étant un simple pointeur sur une validation, vous ne pourrez jamais modifier son contenu. Vous avez besoin d'une branche.


Dans votre cas, chaque développeur travaillant sur une fonctionnalité spécifique:

  • devraient créer leur propre branche dans leur référentiel respectif
  • suivre les branches depuis les référentiels de leurs collègues (celui qui travaille sur la même fonctionnalité)
  • tirer/pousser afin de partager votre travail avec vos pairs.

Au lieu de suivre directement les branches de vos collègues, vous pouvez suivre uniquement la branche d'un référentiel central "officiel" vers lequel tout le monde pousse son travail afin d'intégrer et de partager le travail de chacun pour cette fonctionnalité particulière.

42
VonC

Les branches sont en bois et poussent dans le tronc de l’arbre. Les étiquettes sont faites de papier (dérivé du bois) et pendent comme des ornements de Noël à divers endroits de l’arbre.

Votre projet est l'arborescence et votre fonctionnalité qui sera ajoutée au projet se développera sur une branche. La réponse est branche.

37
Jason

La meilleure façon d’expliquer est que les tags agissent comme des branches en lecture seule. Vous pouvez utiliser une branche comme balise, mais vous pouvez la mettre à jour par inadvertance avec de nouveaux commits. Les balises sont assurées de pointer vers le même commit tant qu'elles existent.

15
Vassili Gorshkov

Les tags peuvent être soit signé ou non signé ; les branches ne sont jamais signées.

Les étiquettes signées ne peuvent jamais se déplacer car elles sont liées de manière cryptographique (avec une signature) à un commit particulier. Les balises non signées ne sont pas liées et il est possible de les déplacer (mais le déplacement des balises n'est pas un cas d'utilisation normal).

Les branches peuvent non seulement passer à un commit différent mais sont attendues . Vous devez utiliser une branche pour votre projet de développement local. Cela n’a pas de sens de s’engager dans un référentiel Git "sur une balise".

14
Greg Hewgill

Le Git Parable explique comment un DVCS typique est créé et pourquoi ses créateurs ont fait ce qu'ils ont fait. Aussi, vous voudrez peut-être jeter un oeil à Git for Computer Scientist ; il explique ce que fait chaque type d'objet dans Git, y compris les branches et les balises.

10
Bombe

J'aime penser aux branches comme où vous allez, balises as où vous avez été.

Une étiquette ressemble à un signet d'un point important du passé, tel qu'une version.

Alors qu’une branche est une trajectoire particulière du projet, le marqueur de branche avance avec vous. Lorsque vous avez terminé, vous fusionnez/supprimez la branche (c'est-à-dire le marqueur). Bien entendu, à ce stade, vous pouvez choisir de baliser ce commit.

9
Gazzer

Une balise est utilisée pour marquer une version, plus spécifiquement, elle référence un instant dans une branche. Une branche est généralement utilisée pour ajouter des fonctionnalités à un projet.

6
Number45

facile:

Les balises doivent toujours pointer vers la même version d'un projet, tandis que les responsables doivent progresser au fur et à mesure du développement.

Manuel de l'utilisateur Git

3
Bar Horing

la réponse simple est:

branch: le pointeur de branche en cours se déplace avec chaque commit dans le référentiel

mais

tag: le commit qu'un point de tag ne change pas, en fait, le tag est un instantané de ce commit.

0
jsina