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

173

Quelqu'un peut-il expliquer 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, elle pousse et tire 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 explicitement "git pull".

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

Je lis " The Pragmatic Guide to Git " (excellent livre, au fait), et ils semblent suggérer que le suivi des branches est une bonne chose et qu'après avoir créé votre première télécommande (origine, dans ce cas), vous devriez configurez votre branche principale comme une branche de suivi, mais cela ne explique malheureusement pas pourquoi une branche de suivi est une bonne chose ou quels avantages vous obtenez en configurant votre branche principale comme une branche de suivi de votre référentiel d'origine .

Quelqu'un peut-il s'il vous plaît m'éclairer (en anglais)?

jerhinesmith
la source
6
Une note terminologique: le mot track , dans Git, est très surchargé. Certains fichiers sont suivis et certains ne sont pas suivis; certains noms de branche sont appelés branches de suivi à distance; et vous pouvez utiliser l' --trackoption pour créer une branche (locale) dont l'une de ces branches de suivi à distance est définie en amont . La terminologie a quelque peu évolué entre 2006 et 2019, de sorte que des personnes différentes peuvent parfois signifier quelque chose de différent par chacun de ces mots.
torek le
Je recommande personnellement d'utiliser l'expression noms de suivi à distance à la place des branches de suivi à distance , en partie parce que le mot branche est également plutôt surchargé. Les noms de suivi à distance sont ceux qui ressemblent à origin/master: ils sont dans votre référentiel, mais ils sont la façon dont votre Git se souvient des noms de branche comme on le voit dans un autre dépôt Git sur à origin. Si vous utilisez alors le mot amont , qui est le terme plus moderne, de dire que votre mastera origin/masterfixé comme en amont , vous pouvez éviter toute cette confusion terminologique.
torek le

Réponses:

141

Le 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 qu'on appelle une branche de suivi. Les succursales de suivi sont des succursales locales qui ont une relation directe avec une succursale distante. Si vous êtes sur une branche et un type de suivi git push, Git sait automatiquement vers quel serveur et quelle branche pousser. En outre, l'exécution git pullsur l'une de ces branches récupère toutes les références distantes, puis fusionne automatiquement dans la branche distante correspondante.

Lorsque vous clonez un référentiel, il crée généralement automatiquement une branche maître qui suit l'origine / maître. C'est pourquoi git pushet git pulltravaillez hors de la boîte sans autres arguments. Cependant, vous pouvez configurer d'autres branches de suivi si vous le souhaitez - celles qui ne suivent pas les branches à l'origine et ne suivent pas la branche principale. Le cas simple est l'exemple que vous venez de voir, en cours d'exécution git checkout -b [branch] [remotename]/[branch]. Si vous avez la version 1.6.2 ou ultérieure de Git, vous pouvez également utiliser le --trackraccourci:

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

Pour configurer une branche locale avec un nom différent 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"

Désormais, votre branche locale sfva automatiquement pousser vers et depuis origin/serverfix.

BONUS: git statusinfos supplémentaires

Avec une branche de suivi, git statusvous dira si vous êtes loin derrière votre branche de suivi - utile pour vous rappeler que vous n'avez pas encore poussé vos modifications! 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)

ou

$ 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)

Assaf Lavie
la source
21
Je voulais juste clarifier ceci: "L'extraction d'une branche locale à partir d'une branche distante crée automatiquement ce qu'on appelle une branche de suivi." C'est trompeur. Sans l'option --track, toute branche que vous créez ne sera pas suivie.
JohnO
@JohnO, pourrait vouloir aborder cela avec le gars de Pro Git. L'ensemble du livre est le résultat d'une collaboration d'édition massive de l'IIRC.
Assaf Lavie le
2
@ JohnO, d'après: sbf5.com/~cduan/technical/git/git-4.shtml --track est activé par défaut et n'est donc pas nécessaire.
Hank Lin
50

Vous trouverez ci-dessous mes notes d'apprentissage personnelles sur les branches de suivi GIT, j'espère qu'elles seront utiles pour les futurs visiteurs:

entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici


Suivi des branches et "git fetch":

entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

hagrawal
la source
Merci pour les notes! Voudriez-vous les partager tous si possible? Merci;
Aditya
@Aditya: Cette question est pour le suivi des succursales et j'ai posté toutes mes notes sur ce sujet. Si je trouve une autre question pertinente où je peux publier mes autres notes GIT, alors je serai heureux de le faire.
hagrawal le
Merci! Ce que je voulais dire, c'était de les publier sur votre blog ou quelque chose :). Merci encore pour les belles notes!
Aditya le
@Aditya: Ah, je vois. Vous savez maintenant ce que vous voulez dire. Je suis en retard sur mon site Web, mais je n'en ai pas encore créé un pour moi-même.
hagrawal
43

Le livre Pro Git mentionne :

Les succursales de suivi sont des succursales locales qui ont une relation directe avec une succursale distante

Pas exactement. La question SO « Avoir du mal à comprendregit-fetch » comprend:

Il n'y a pas un tel concept de succursales de suivi locales , seulement des succursales de suivi à distance .
Il en origin/masterva de même pour une branche de suivi à distance pour masterle originrepo.

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

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

Ensuite, vous pouvez considérer mastercomme une branche de suivi locale : Elle suit la branche de suivi à distance origin/master qui, à son tour, suit la branche principale du dépôt en amont origin .

texte alternatif

VonC
la source
Clarification de l'image: Mon ordinateur est 2 commits avant l'origine. C'est de là que viennent ces deux engagements hors du maître. Image: progit.org/book/ch3-5.html
idbrii
Est-ce que j'interprète correctement: si j'ai des télécommandes définies localement pour l'origine et l'amont, ma branche principale locale suivra l'origine directement et indirectement en amont? Par exemple: quand je git statusrecevrai un message de suivi de validation en ce qui concerne les dépôts d'origine et en amont? (Settup: j'ai cloné le repo de quelqu'un localement, poussé mon clone vers un nouveau repo sur mon compte GitHub et défini localement l'origine et les télécommandes en amont de mon repo github et du repo cloné cloné respectivement).
SherylHohman
3
@SherylHohman Non: une succursale locale ne suivra rien "directement" ou "indirectement". Il suivra la branche de suivi à distance que vous lui attribuerez. Dans le cas d'un fork, la meilleure pratique consiste à suivre en amont (le dépôt d'origine) pour les branches communes (comme master), et à suivre l'origine (votre fork distant) pour les nouvelles branches (vos branches PR ou feature): voir stackoverflow.com/ a / 21847690/6309
VonC
2
@VonC - La déclaration "Il n'y a pas un tel concept de branches de suivi locales, seulement des branches de suivi à distance." est intéressant car il y a une telle terminologie contradictoire autour des branches. Ce lien souvent référencé web.archive.org/web/20130419172453/http://www.gitguys.com/ ... fait la distinction entre les "branches de suivi" et "branches de suivi à distance". Ils appellent origine / maître une «branche de suivi à distance» - je suis d'accord - mais ensuite ils appellent «maître» une «branche de suivi» aussi. Qu'est-ce que le suivi principal? Ont-ils tort ou s'agit-il d'un problème de terminologie?
Howiecamp
2
@Howiecamp ce qu'ils appellent une "branche de suivi appelée maître" est simplement un maître de branche locale avec une origine / maître de branche de suivi à distance associée, ici pour mémoriser le dernier SHA1 extrait de l'origine concernant sa branche maître distante. C'est donc un "raccourci" pour désigner "une branche locale avec une branche amont"
VonC
7

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

git branch --set-upstream-to origin/Development new-branch
agrublev
la source