204 votes

Qu'est-ce qu'une branche de suivi ?

Quelqu'un peut-il expliquer ce qu'est une "branche de suivi" telle qu'elle s'applique à git ?

Voici la définition de git-scm.com :

Une " branche de suivi " dans Git est une branche locale qui est connectée à une branche distante. Lorsque vous poussez et tirez sur cette branche branche, elle pousse et tire automatiquement automatiquement vers la branche distante à laquelle elle est connectée.

Utilisez ceci si vous tirez toujours de la même branche amont dans la nouvelle branche et si vous ne voulez pas utiliser la fonction "git pull" explicitement.

Malheureusement, étant nouveau dans git et venant de SVN, cette définition n'a absolument aucun sens pour moi.

Je suis en train de lire " Le guide pragmatique de Git " (excellent livre, d'ailleurs), et ils semblent suggérer que les branches de suivi sont une bonne chose et qu'après avoir créé votre premier remote (origin, dans ce cas), vous devriez configurer votre branche master pour qu'elle soit une branche de suivi, mais ils ne couvrent malheureusement pas pourquoi une branche de suivi est une bonne chose o quels avantages vous obtenez en configurant votre branche master pour être une branche de suivi de votre dépôt d'origine .

Quelqu'un peut-il m'éclairer (en anglais) ?

7 votes

Une remarque terminologique : le mot piste dans Git, est très surchargé. Certains fichiers sont traqué et certains sont non suivi ; certains noms de branches sont appelés branches de suivi à distance ; et vous pouvez utiliser le --track pour créer une branche (locale) dont l'une des branches de suivi à distance est définie comme sa branche de suivi à distance. en amont . La terminologie a quelque peu évolué entre 2006 et 2019, de sorte que différentes personnes mai signifient parfois quelque chose de différent par chacun de ces mots.

0 votes

Je recommande personnellement d'utiliser la phrase Noms de repérage à distance à la place de Branches de suivi à distance en partie parce que le mot branche est également assez surchargé. Les noms de suivi à distance sont ceux qui ressemblent à origin/master : ils sont dans votre dépôt, mais c'est la façon dont Git se souvient de noms des branches comme on le voit dans certains autre Dépôt Git à l'adresse origin . Si vous utilisez ensuite le mot en amont qui est le terme plus moderne, pour dire que votre master a origin/master comme son en amont vous pouvez éviter toute cette confusion terminologique.

0 votes

@torek, le terme "branche de suivi à distance" ne peut pas être remplacé par l'expression "noms de suivi à distance", car les branches de suivi ont un état physique, qui peut être différent de celui des branches locales et distantes.

178voto

Assaf Lavie Points 20181

El Livre ProGit a une très bonne explication :

Suivi des branches

L'extraction d'une branche locale à partir d'une branche distante crée automatiquement ce que l'on appelle une branche de suivi. Les branches de suivi sont des branches locales qui ont une relation directe avec une branche distante. Si vous êtes sur une branche de suivi et que vous tapez git push Git sait automatiquement vers quel serveur et quelle branche pousser. De plus, l'exécution de git pull alors qu'il se trouve sur l'une de ces branches récupère toutes les références distantes et fusionne ensuite automatiquement dans la branche distante correspondante.

Lorsque vous clonez un dépôt, il crée généralement automatiquement une branche maître qui suit origin/master. C'est pourquoi git push y git pull fonctionnent sans aucun autre argument. Cependant, vous pouvez configurer d'autres branches de suivi si vous le souhaitez - celles qui ne suivent pas les branches d'origine et ne suivent pas la branche maîtresse. Le cas simple est l'exemple que vous venez de voir, en exécutant git checkout -b [branch] [remotename]/[branch] . Si vous disposez de la version 1.6.2 de Git ou d'une version ultérieure, vous pouvez également utiliser la commande --track en abrégé :

$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"

Pour mettre en place une branche locale avec un nom différent de celui de la branche distante, vous pouvez facilement utiliser la première version avec un nom de branche locale différent :

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"

Maintenant, votre branche locale sf sera automatiquement poussé vers et tiré de origin/serverfix .

BONUS : extra git status info

Avec une branche de suivi, git status vous indiquera à quel point vous êtes en retard sur votre branche de suivi - utile pour vous rappeler que vous n'avez pas encore poussé vos changements ! Cela ressemble à ceci :

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

o

$ git status
On branch dev
Your branch and 'origin/dev' have diverged,
and have 3 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

0 votes

@JohnO, vous devriez en parler avec le gars de Pro Git. Le livre entier est le résultat d'une collaboration massive d'édition IIRC.

3 votes

@ JohnO, selon : sbf5.com/~cduan/technical/git/git-4.shtml --Le suivi est activé par défaut et n'est donc pas nécessaire.

69voto

hagrawal Points 2143

Vous trouverez ci-dessous mes notes d'apprentissage personnelles sur le suivi des branches dans GIT, en espérant qu'elles seront utiles aux futurs visiteurs :

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here


Suivi des branches et "git fetch" :

enter image description here enter image description here enter image description here

1 votes

Merci pour les notes ! Pourriez-vous les partager toutes si possible ? Merci ;

0 votes

@Aditya : Cette question concerne le suivi des branches et j'ai posté toutes mes notes sur ce sujet. Si je trouve une autre question pertinente où je peux poster mes autres notes GIT, alors je serai heureux de le faire.

0 votes

Merci ! Je voulais dire les poster sur ton blog ou autre :). Merci encore pour les belles notes !

45voto

VonC Points 414372

Le livre Pro Git mentionne :

Les branches de suivi sont des branches locales qui ont une relation directe avec une branche distante.

Pas exactement. La question de l'OS " J'ai du mal à comprendre git-fetch "comprend :

Il n'y a pas de tel concept de suivi local les branches, seulement suivi à distance branches.
Alors origin/master est une branche de suivi à distance pour master dans le origin repo.

Mais en fait, une fois que vous avez établi une relation amont-branche entre :

  • une branche locale comme master
  • et une branche de suivi à distance comme origin/master

Vous pouvez alors envisager master en tant que branche locale de suivi : Il permet de suivre le branche de suivi à distance origin/master qui, à son tour, suit la branche maîtresse de l'archive repo amont origin .

alt text

En d'autres termes : "distant" dans "branche de suivi à distance" signifie une local copie (suivi) de la branche distante, pour se souvenir de ce qui a été récupéré en dernier.
Comme Michael Freidgeim ajoute dans les commentaires :

L'expression "succursales de suivi à distance" prête à confusion.

Le mot le plus précis serait :

" branche de suivi à distance localisée localement ".

Sinon, quelqu'un pourrait interpréter que la "branche de suivi à distance" est située sur le serveur d'origine.

0 votes

Clarification de l'image : Mon ordinateur a 2 commits d'avance sur origin. C'est de là que viennent ces deux commits de master. Image : progit.org/book/ch3-5.html

0 votes

Est-ce que j'interprète correctement : Si j'ai localement des remotes définis pour l'origine et l'amont, alors ma branche principale locale suivra directement l'origine et l'amont indirectement ? git status Je recevrai un message de suivi de commit concernant à la fois le dépôt d'origine et le dépôt en amont (Settup : J'ai cloné localement le repo de quelqu'un, j'ai poussé mon clone vers un nouveau repo sur mon compte GitHub, et j'ai défini localement les remotes origin et upstream à mon repo github et au repo cloné respectivement).

3 votes

@SherylHohman Non : une branche locale ne suivra rien "directement" ou "indirectement". Elle suivra la branche de suivi à distance que vous lui attribuerez. Dans le cas d'un fork, la meilleure pratique est de suivre upstream (le repo original) pour les branches communes (comme master), et de suivre origin (votre fork distant) pour les nouvelles branches (vos branches PR ou feature) : voir stackoverflow.com/a/21847690/6309

10voto

agrublev Points 508

C'est ainsi que j'ai ajouté une branche de suivi afin de pouvoir en tirer des informations dans ma nouvelle branche :

git branch --set-upstream-to origin/Development new-branch

2voto

Eliptical view Points 421

TL;DR Rappelez-vous, tous les git branches sont eux-mêmes utilisés pour suivi de l'historique d'un ensemble de dossiers. Par conséquent, Chaque branche n'est-elle pas en fait une "branche de suivi" ? car c'est à cela que servent ces branches : suivre l'historique des fichiers dans le temps. Ainsi, nous devrions probablement appeler les "branches" git normales, "branches de suivi", mais nous ne le faisons pas. Au lieu de cela, nous raccourcissons leur nom en "branches".

C'est donc en partie pour cette raison que le terme "branche de traçage" est si déroutant : pour les non-initiés, il peut facilement signifier deux choses différentes.

Dans git, le terme "Tracking-branch" est un nom court pour le terme plus complet : "Remote-tracking-branch" .

Il est probablement préférable, au début, de remplacer les termes plus formels jusqu'à ce que vous soyez plus à l'aise avec ces concepts.

Reformulons votre question comme suit :

Qu'est-ce qu'un " Remote -Suivant-branche ?"

Le mot clé ici est "Remote" (à distance), alors passez à l'endroit où vous êtes confus et je décrirai ce qu'est une branche de suivi à distance et comment elle est utilisée.


Pour mieux comprendre terminologie git dont branches y suivi de qui peut être très déroutant au départ, je pense que le plus simple est d'abord d'être parfaitement clair sur ce qu'est git et la structure de base de comment cela fonctionne . Sans une solide compréhension comme celle-ci, je vous promets que vous vous perdrez dans les nombreux détails, car git est très complexe (traduction : beaucoup de gens l'utilisent pour des choses très importantes).

Ce qui suit est une introduction/vue d'ensemble, mais vous trouverez peut-être que cet excellent article également informatif.


CE QU'EST GIT, ET À QUOI IL SERT

Un dépôt git est comme un album de photos de famille : Il contient des instantanés historiques montrant comment les choses étaient dans le passé. Un "instantané" est un enregistrement de quelque chose, à un moment donné dans le temps.

Un dépôt git n'est pas limité à contenir des photos de famille humaine. Il peut plutôt être utilisé pour enregistrer et organiser tout ce qui évolue ou change au fil du temps .

L'idée de base est de créer un livre pour que nous puissions facilement regarder en arrière dans le temps,

  • pour comparer les temps passés, avec le présent, ou d'autres moments dans le temps, et
  • pour recréer le passé.

Lorsque vous vous embourbez dans la complexité et la terminologie, essayez de vous rappeler que un dépôt git est la première et la plus importante, un référentiel d'instantanés et, comme un album photo, il sert à la fois à stocker et à organiser ces instantanés.


INSTANTANÉS ET SUIVI

traqué - suivre une personne ou un animal en cherchant la preuve qu'il est allé quelque part ( dictionnaire.cambridge.org )

Dans git, " votre projet " fait référence à une arborescence de fichiers (un ou plusieurs, éventuellement organisés en arborescence à l'aide de sous-répertoires), dont vous souhaitez conserver l'historique.

Git, via un processus en 3 étapes, enregistre un " instantané " de l'arborescence des répertoires de votre projet à un moment donné dans le temps.

Chaque instantané git de votre projet, est ensuite organisé par " liens " pointant vers des instantanés précédents de votre projet.

Un par un, lien par lien, nous pouvons remonter dans le temps pour trouver n'importe quel cliché de vous ou de votre patrimoine.

Par exemple Nous pouvons commencer par la photo la plus récente de vous, puis, à l'aide d'un lien, remonter dans le temps pour trouver une photo de vous prise hier ou la semaine dernière, ou lorsque vous étiez bébé, ou même qui était votre mère, etc.

C'est ce que l'on appelle " suivi de Dans cet exemple, il s'agit de suivre votre vie, de voir où vous avez laissé une empreinte et d'où vous venez.


COMMETS

Un engagement est similaire à une page de votre album photo contenant un seul cliché, en ce sens qu'elle ne contient pas seulement le cliché, mais aussi les méta-informations associées à ce cliché. Il comprend :

  • une adresse ou un lieu fixe où l'on peut trouver ce commit, similaire à son numéro de page,
  • un instantané de votre projet (de l'arborescence de vos fichiers) à un moment donné,
  • une légende ou un commentaire indiquant ce qu'est la photo ou ce qu'elle représente,
  • la date et l'heure de cet instantané,
  • qui a pris la photo, et enfin,
  • un, ou plus , liens en remontant dans le temps jusqu'à des instantanés précédents, comme celui d'hier, ou celui de nos parents. En d'autres termes, les "liens" sont semblables à des pointeurs vers les numéros de page d'autres photos plus anciennes de moi-même ou, à ma naissance, vers mes parents immédiats.

Un engagement est la partie la plus importante d'un album photo bien organisé.


L'ARBRE GÉNÉALOGIQUE AU FIL DU TEMPS, AVEC LES BRANCHES ET LES FUSIONS

Désambiguïsation : Le terme "arbre" ici ne fait pas référence à l'arbre des répertoires de fichiers, tel qu'il est utilisé ci-dessus, mais plutôt à un arbre généalogique de commits parents et enfants liés au fil du temps.

La structure de l'arbre généalogique de git est calquée sur nos propres arbres généalogiques humains.

Dans ce qui suit, pour aider à comprendre les liens d'une manière simple, je ferai référence à :

  • a parent-commission comme un simple " parent ", et
  • a enfant-commission comme un simple " enfant "ou "enfants" au pluriel.

Vous devriez le comprendre instinctivement, car il est basé sur l'arbre de vie :

  • Un parent pourrait ont un ou plusieurs enfants qui les pointent du doigt dans le passé, et
  • les enfants en ont toujours un ou plus les parents qu'ils désignent.

Ainsi, tous les commits, sauf les tout nouveaux commits (on pourrait dire les "commits juvéniles"), ont un ou plusieurs enfants qui pointent vers eux.

  • Si aucun enfant ne pointe vers un parent, alors ce commit n'est qu'une " conseil de culture ", ou l'endroit d'où naîtra le prochain enfant.

  • Avec un seul enfant pointant vers un parent, il s'agit d'une simple relation parent <-- enfant.

Diagramme linéaire d'une chaîne simple, monoparentale, s'enchaînant à rebours dans le temps :

(older) ... <--link1-- Commit1 <--link2-- Commit2 <--link3-- Commit3 (newest)

BRANCHES

branche - Une "branche" est une ligne active de développement. Le commit le plus récent sur une branche est appelé l'extrémité de cette branche. L'extrémité de la branche est référencée par une tête de branche, qui se déplace qui avance au fur et à mesure que des développements supplémentaires sont effectués sur la branche. Un seul dépôt Git peut piste un nombre arbitraire de branches, mais votre arbre de travail n'est associé qu'à l'une d'entre elles (la branche "courante" ou "checke"). "check out"), et HEAD pointe vers cette branche. ( gitglossary )

Une branche git fait également référence à deux choses :

  • un nom donné à une pointe de croissance, (un identifiant), et
  • la branche actuelle dans le graphe des liens entre les commits.

Plus d'un enfant pointant vers un--> parent est ce que git appelle " ramification ".

NOTE : En réalité, tout enfant, de tout parent, qu'il soit premier, deuxième ou troisième, etc., peut être considéré comme sa propre petite branche, avec sa propre pointe de croissance. Ainsi, une branche n'est pas nécessairement une longue chose avec de nombreux noeuds, mais plutôt une petite chose, créée avec juste un ou plusieurs commits d'un parent donné.

Le premier enfant d'un parent peut être considéré comme faisant partie de cette même branche, tandis que les enfants successifs de ce parent sont ce que l'on appelle normalement des " enfants ". branches ".

En réalité, tous les enfants (pas seulement le premier) se ramifient à partir de leur parent, ou vous pourriez dire que lien mais je dirais que chaque lien est en fait la partie centrale de une branche .

Formellement, une "branche" git est juste un nom comme "foo" par exemple, donné à une extrémité croissante spécifique d'une hiérarchie familiale. C'est un type de ce qu'on appelle un " réf. ". (Les étiquettes et les télécommandes que j'expliquerai plus tard sont également des références).

réf. - Un nom qui commence par refs/ (par exemple refs/heads/master) qui pointe vers un nom d'objet ou un autre ref (ce dernier est appelé un ref symbolique). Par commodité, une ref peut parfois être abrégée en lorsqu'elle est utilisée comme argument d'une commande Git ; voir gitrevisions(7) pour plus de détails. détails. Les références sont stockées dans le référentiel.

L'espace de nom ref est hiérarchique. Différentes sous-hiérarchies sont utilisées à des fins différentes (par exemple, la hiérarchie refs/heads/ est utilisée pour représenter les branches locales). Il existe quelques refs spéciales qui ne commencent pas par refs/. ne commencent pas par refs/. L'exemple le plus notable est HEAD. ( gitglossary )

(Vous devriez jeter un coup d'œil à l'arborescence des fichiers dans votre répertoire .git. C'est là que la structure de git est enregistrée).

Ainsi, par exemple, si votre nom est Tom, les commits liés entre eux qui ne comprennent que des instantanés de vous, pourraient constituer la branche que nous nommons "Tom".

Ainsi, alors que l'on peut penser qu'une branche d'arbre est constituée de tout son bois, dans git, une branche est juste un nom donné à ses extrémités en croissance, et non à l'ensemble du bois qui y mène.

L'extrémité de croissance spéciale et sa branche, qu'un arboriste (un gars qui taille les arbres fruitiers) appellerait le "leader central", est ce que git appelle " maître ".

La branche principale existe toujours.

Diagramme linéaire de : Commit1 avec 2 enfants (ou ce que nous appelons un git " branche ") :

                parent      children

                        +-- Commit <-- Commit <-- Commit (Branch named 'Tom')
                       /
                      v
(older) ... <-- Commit1 <-- Commit                       (Branch named 'master')    

N'oubliez pas qu'un lien uniquement pointe de l'enfant vers le parent. Il n'y a pas de lien pointant dans l'autre sens, c'est-à-dire de l'ancien au nouveau, c'est-à-dire du parent à l'enfant.

Un commit parent n'a donc aucun moyen direct de lister ses commits enfants, ou en d'autres termes, ce qui a été dérivé de lui.


FUSION

Les enfants ont un ou plus les parents.

  • Avec un seul parent, il s'agit d'un simple engagement parent <-- enfant.

  • Avec plus d'un parent, c'est ce que git appelle " fusionner ". Chaque enfant peut renvoyer à plus d'un parent en même temps, tout comme avoir une mère ET un père, et pas seulement une mère.

Diagramme linéaire de : Commit2 avec 2 parents (ou ce que nous appelons un git " fusionner ", c'est-à-dire la procréation à partir de parents multiples) :

                parents     child

           ... <-- Commit
                        v
                         \
(older) ... <-- Commit1 <-- Commit2  

REMOTE

Ce mot est également utilisé pour signifier 2 choses différentes :

  • un référentiel distant, et
  • le nom de l'alias local d'un référentiel distant, c'est-à-dire un nom qui pointe vers un référentiel distant à l'aide d'une URL.

référentiel distant - Un référentiel qui est utilisé pour suivre le même projet mais qui réside ailleurs. Pour communiquer avec les dépôts distants, voir fetch ou push. ( gitglossary )

(Le dépôt distant peut même être un autre dépôt git sur notre propre ordinateur). En fait, il y a deux URL pour chaque nom distant, une pour pousser (c'est-à-dire télécharger des commits) et une pour tirer (c'est-à-dire télécharger des commits) de ce dépôt git distant.

A " à distance " est un nom (un identifiant) auquel est associée une URL qui pointe vers un dépôt git distant. (Il a été décrit comme un alias pour une URL, bien que ce soit plus que cela).

Vous pouvez configurer plusieurs dépôts distants si vous voulez tirer ou pousser vers plusieurs dépôts distants.

Mais souvent, vous n'en avez qu'un seul, et son nom par défaut est "origin" (c'est-à-dire l'origine amont à partir de laquelle vous avez cloné).

origine - La valeur par défaut en amont dépôt. La plupart des projets ont au moins un projet amont qu'ils suivent. Par défaut, origin est utilisé à cette fin. Les nouvelles mises à jour amont seront récupérées dans Branches de suivi à distance nommé origin/name-of-upstream-branch, que vous pouvez voir en utilisant git branch -r. ( gitglossary )

L'origine représente l'endroit d'où vous avez cloné le référentiel.
Ce référentiel distant est appelé le référentiel "amont", et votre référentiel cloné est appelé le référentiel "aval".

en amont - Dans le développement de logiciels, l'expression "en amont" désigne une direction vers les auteurs ou les mainteneurs originaux d'un logiciel distribué sous forme de code source. wikipedia

branche amont - La branche par défaut qui est fusionnée avec la branche en question (ou sur laquelle la branche en question est rebasée). Elle est configurée via branch..remote et branch..merge. Si la branche amont de A est origin/B, on dit parfois "A suit origin/B". ( gitglossary )

En effet, la majeure partie de l'eau s'écoule généralement vers vous.
De temps en temps, il se peut que vous repoussiez un logiciel vers le dépôt amont, afin qu'il puisse ensuite être transmis à tous ceux qui l'ont cloné.

BRANCHE DE SUIVI À DISTANCE

Une branche de suivi à distance est d'abord un simple nom de branche, comme tout autre nom de branche.

Il pointe vers une pointe de croissance locale, c'est-à-dire un commit récent dans le fichier votre dépôt git local.

Mais notez qu'il pointe également vers le même commit dans le référentiel distant à partir duquel vous avez cloné le commit.

Branche de suivi à distance - Une référence qui est utilisée pour suivre les changements d'un autre dépôt. Elle ressemble typiquement à refs/remotes/foo/bar (indiquant qu'elle suit une branche nommée bar dans un dépôt distant nommé foo), et correspond au côté droit d'une spécification de référence de récupération configurée. Une branche de suivi à distance ne doit pas contenir de modifications directes ou avoir de commits locaux. ( gitglossary )

Disons que le dépôt distant que vous avez cloné a juste 2 commits, comme ceci : parent42 <== child-of-4, et vous le clonez et maintenant votre dépôt git local a exactement les deux mêmes commits : parent4 <== child-of-4.
Votre branche de suivi à distance nommée origine pointe maintenant vers child-of-4.

Maintenant, disons qu'un commit est ajouté au distant, de sorte qu'il ressemble à ceci : parent42 <== enfant-de-4 <== nouveau-bébé. Pour mettre à jour votre dépôt local, en aval, vous devrez récupérer new-baby, et l'ajouter à votre dépôt git local. Maintenant, votre branche locale de suivi à distance pointe vers new-baby. Vous comprenez l'idée, le concept d'une branche de suivi à distance est simplement de garder la trace de ce qui était auparavant l'extrémité d'une branche distante qui vous intéresse.


LE SUIVI EN ACTION

Tout d'abord, nous commençons à suivre un fichier avec git.

enter image description here

Voici les commandes de base impliquées dans le suivi des fichiers :

$ mkdir mydir &&  cd mydir &&  git init             # create a new git repository

$ git branch                                        # this initially reports no branches
                                                    #  (IMHO this is a bug!)

$ git status -bs       # -b = branch; -s = short    # master branch is empty
## No commits yet on master

# ...
$ touch foo                                         # create a new file

$ vim foo                                           # modify it (OPTIONAL)

$ git add         foo; commit -m 'your description'  # start tracking foo 
$ git rm  --index foo; commit -m 'your description'  # stop  tracking foo 
$ git rm          foo; commit -m 'your description'  # stop  tracking foo & also delete foo

LE SUIVI À DISTANCE EN ACTION

$ git pull    # Essentially does:  get fetch; git merge    # to update our clone

Il y a encore beaucoup à apprendre sur la récupération, la fusion, etc., mais cela devrait vous mettre sur la bonne voie, je l'espère.

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