Git 🌙
Chapters â–Ÿ 2nd Edition

3.5 Les branches avec Git - Branches de suivi Ă  distance

Branches de suivi Ă  distance

Les rĂ©fĂ©rences distantes sont des rĂ©fĂ©rences (pointeurs) vers les Ă©lĂ©ments de votre dĂ©pĂŽt distant tels que les branches, les tags, etc
​ Vous pouvez obtenir la liste complĂšte de ces rĂ©fĂ©rences distantes avec la commande git ls-remote (remote), ou git remote show (remote). NĂ©anmoins, une maniĂšre plus courante consiste Ă  tirer parti des branches de suivi Ă  distance.

Les branches de suivi Ă  distance sont des rĂ©fĂ©rences (des pointeurs) vers l’état des branches sur votre dĂ©pĂŽt distant. Ce sont des branches locales qu’on ne peut pas modifier ; elles sont modifiĂ©es automatiquement pour vous lors de communications rĂ©seau. Les branches de suivi Ă  distance agissent comme des marques-pages pour vous indiquer l’état des branches sur votre dĂ©pĂŽt distant lors de votre derniĂšre connexion.

Elles prennent la forme de (distant)/(branche). Par exemple, si vous souhaitiez visualiser l’état de votre branche master sur le dĂ©pĂŽt distant origin lors de votre derniĂšre communication, il vous suffirait de vĂ©rifier la branche origin/master. Si vous Ă©tiez en train de travailler avec un collĂšgue et qu’il avait publiĂ© la branche iss53, vous pourriez avoir votre propre branche iss53 ; mais la branche sur le serveur pointerait sur le commit de origin/iss53.

Cela peut ĂȘtre un peu dĂ©concertant, essayons d’éclaircir les choses par un exemple. Supposons que vous avez un serveur Git sur le rĂ©seau Ă  l’adresse git.notresociete.com. Si vous clonez Ă  partir de ce serveur, la commande clone de Git le nomme automatiquement origin, tire tout son historique, crĂ©e un pointeur sur l’état actuel de la branche master et l’appelle localement origin/master. Git crĂ©e Ă©galement votre propre branche master qui dĂ©marre au mĂȘme endroit que la branche master d’origine, pour que vous puissiez commencer Ă  travailler.

Note
origin n’est pas spĂ©cial

De la mĂȘme maniĂšre que le nom de branche master n’a aucun sens particulier pour Git, le nom origin n’est pas spĂ©cial. Comme master est le nom attribuĂ© par dĂ©faut Ă  votre branche initiale lorsque vous lancez la commande git init ce qui est la seule raison pour laquelle ce nom est utilisĂ© aussi largement, origin est le nom utilisĂ© par dĂ©faut pour un dĂ©pĂŽt distant lorsque vous lancez git clone. Si vous lancez Ă  la place git clone -o booyah, votre branche de suivi Ă  distance par dĂ©faut s’appellera booyah/master.

DĂ©pĂŽts dstant et local aprĂšs un clonage
Figure 30. DĂ©pĂŽts distant et local aprĂšs un clonage

Si vous travaillez sur votre branche locale master et que dans le mĂȘme temps, quelqu’un publie sur git.notresociete.com et met Ă  jour cette mĂȘme branche master, alors vos deux historiques divergent. Tant que vous restez sans contact avec votre serveur distant, votre pointeur vers origin/master n’avance pas.

Les travaux locaux et distants peuvent diverger
Figure 31. Les travaux locaux et distants peuvent diverger

Lancez la commande git fetch <distant> pour synchroniser vos travaux (dans notre cas, git fetch origin). Cette commande recherche le serveur hébergeant origin (dans notre cas, git.notresociete.com), y récupÚre toutes les nouvelles données et met à jour votre base de donnée locale en déplaçant votre pointeur origin/master vers une nouvelle position, plus à jour.

`git fetch` met à jour vos références de suivi à distance
Figure 32. git fetch met Ă  jour vos branches de suivi Ă  distance

Pour dĂ©montrer l’usage de multiples serveurs distants et le fonctionnement des branches de suivi Ă  distance pour ces projets distants, supposons que vous avez un autre serveur Git interne qui n’est utilisĂ© que par une Ă©quipe de dĂ©veloppeurs. Ce serveur se trouve sur git.equipe1.notresociete.com. Vous pouvez l’ajouter aux rĂ©fĂ©rences distantes de votre projet en lançant la commande git remote add comme nous l’avons dĂ©crit au chapitre Les bases de Git. Nommez ce serveur distant equipeun qui sera le raccourci pour l’URL complĂšte.

Ajout d’un nouveau serveur en tant que rĂ©fĂ©rence distante
Figure 33. Ajout d’un nouveau serveur en tant que rĂ©fĂ©rence distante

Maintenant, vous pouvez lancer git fetch equipeun pour rĂ©cupĂ©rer l’ensemble des informations du serveur distant equipeun que vous ne possĂ©dez pas. Comme ce serveur contient dĂ©jĂ  un sous-ensemble des donnĂ©es du serveur origin, Git ne rĂ©cupĂšre aucune donnĂ©e mais initialise une branche de suivi Ă  distance appelĂ©e equipeun/master qui pointe sur le mĂȘme commit que celui vers lequel pointe la branche master de equipeun.

Branche de suivi Ă  distance pour `equipeun/master`
Figure 34. Branche de suivi Ă  distance equipeun/master

Pousser les branches

Lorsque vous souhaitez partager une branche avec le reste du monde, vous devez la pousser sur un serveur distant sur lequel vous avez accĂšs en Ă©criture. Vos branches locales ne sont pas automatiquement synchronisĂ©es sur les serveurs distants — vous devez pousser explicitement les branches que vous souhaitez partager. De cette maniĂšre, vous pouvez utiliser des branches privĂ©es pour le travail que vous ne souhaitez pas partager et ne pousser que les branches sur lesquelles vous souhaitez collaborer.

Si vous possĂ©dez une branche nommĂ©e correctionserveur sur laquelle vous souhaitez travailler avec d’autres, vous pouvez la pousser de la mĂȘme maniĂšre que vous avez poussĂ© votre premiĂšre branche. Lancez git push (serveur distant) (branche) :

$ git push origin correctionserveur
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
 * [new branch]      correctionserveur -> correctionserveur

Il s’agit en quelque sorte d’un raccourci. Git dĂ©veloppe automatiquement le nom de branche correctionserveur en refs/heads/correctionserveur:refs/heads/correctionserveur, ce qui signifie "Prendre ma branche locale correctionserveur et la pousser pour mettre Ă  jour la branche distante correctionserveur`". Nous traiterons plus en dĂ©tail la partie `refs/heads/ au chapitre Les tripes de Git mais gĂ©nĂ©ralement, vous pouvez l’oublier. Vous pouvez aussi lancer git push origin correctionserveur:correctionserveur, qui rĂ©alise la mĂȘme chose — ce qui signifie « Prendre ma branche correctionserveur et en faire la branche correctionserveur distante ». Vous pouvez utiliser ce format pour pousser une branche locale vers une branche distante nommĂ©e diffĂ©remment. Si vous ne souhaitez pas l’appeler correctionserveur sur le serveur distant, vous pouvez lancer Ă  la place git push origin correctionserveur:branchegeniale pour pousser votre branche locale correctionserveur sur la branche branchegeniale sur le dĂ©pĂŽt distant.

Note
Ne renseignez pas votre mot de passe Ă  chaque fois

Si vous utilisez une URL en HTTPS, le serveur Git vous demandera votre nom d’utilisateur et votre mot de passe pour vous authentifier. Par dĂ©faut, vous devez entrer ces informations sur votre terminal et le serveur pourra alors dĂ©terminer si vous ĂȘtre autorisĂ© Ă  pousser.

Si vous ne voulez pas entrer ces informations Ă  chaque fois que vous poussez, vous pouvez mettre en place un "cache d’identification" (credential cache). Son fonctionnement le plus simple consiste Ă  garder ces informations en mĂ©moire pour quelques minutes mais vous pouvez configurer ce dĂ©lai en lançant la commande git config --global credential.helper cache.

Pour davantage d’informations sur les diffĂ©rentes options de cache d’identification disponibles, vous pouvez vous rĂ©fĂ©rer au chapitre Stockage des identifiants.

La prochaine fois qu’un de vos collĂšgues rĂ©cupĂšre les donnĂ©es depuis le serveur, il rĂ©cupĂ©rera, au sein de la branche de suivi Ă  distance origin/correctionserveur, une rĂ©fĂ©rence vers l’état de la branche correctionserveur sur le serveur :

$ git fetch origin
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/schacon/simplegit
 * [new branch]      correctionserveur    -> origin/correctionserveur

Il est important de noter que lorsque vous rĂ©cupĂ©rez une nouvelle branche depuis un serveur distant, vous ne crĂ©ez pas automatiquement une copie locale Ă©ditable. En d’autres termes, il n’y a pas de branche correctionserveur, seulement un pointeur sur la branche origin/correctionserveur qui n’est pas modifiable.

Pour fusionner ce travail dans votre branche de travail actuelle, vous pouvez lancer la commande git merge origin/correctionserveur. Si vous souhaitez crĂ©er votre propre branche correctionserveur pour pouvoir y travailler, vous pouvez faire qu’elle repose sur le pointeur distant :

$ git checkout -b correctionserveur origin/correctionserveur
Branch correctionserveur set up to track remote branch correctionserveur from origin.
Switched to a new branch 'correctionserveur'

Cette commande vous fournit une branche locale modifiable basĂ©e sur l’état actuel de origin/correctionserveur.

Suivre les branches

L’extraction d’une branche locale Ă  partir d’une branche distante crĂ©e automatiquement ce qu’on appelle une "branche de suivi" (tracking branch) et la branche qu’elle suit est appelĂ©e "branche amont" (upstream branch). Les branches de suivi sont des branches locales qui sont en relation directe avec une branche distante. Si vous vous trouvez sur une branche de suivi et que vous tapez git push, Git sĂ©lectionne automatiquement le serveur vers lequel pousser vos modifications. De mĂȘme, un git pull sur une de ces branches rĂ©cupĂšre toutes les rĂ©fĂ©rences distantes et fusionne automatiquement la branche distante correspondante dans la branche actuelle.

Lorsque vous clonez un dĂ©pĂŽt, il crĂ©e gĂ©nĂ©ralement automatiquement une branche master qui suit origin/master. C’est pourquoi les commandes git push et git pull fonctionnent directement sans autre configuration. Vous pouvez nĂ©anmoins crĂ©er d’autres branches de suivi si vous le souhaitez, qui suivront des branches sur d’autres dĂ©pĂŽts distants ou ne suivront pas la branche master. Un cas d’utilisation simple est l’exemple prĂ©cĂ©dent, en lançant git checkout -b [branche] [nomdistant]/[branche]. C’est une opĂ©ration suffisamment courante pour que Git propose l’option abrĂ©gĂ©e --track :

$ git checkout --track origin/correctionserveur
Branch correctionserveur set up to track remote branch correctionserveur from origin.
Switched to a new branch 'correctionserveur'

En fait, c’est tellement habituel qu’il y a mĂȘme un raccourci de ce racccouci. Si le nom de branche que vous essayez d’extraire (a) n’existe pas et (b) correspond Ă  un seul nom sur un seul distant, Git va crĂ©er une branche de suivi pour vous :

$ git checkout correctionserveur
Branch serverfix set up to track remote branch correctionserveur from origin.
Switched to a new branch 'correctionserveur'

Pour créer une branche locale avec un nom différent de celui de la branche distante, vous pouvez simplement utiliser la premiÚre version avec un nom différent de branche locale :

$ git checkout -b cs origin/correctionserveur
Branch cs set up to track remote branch correctionserveur from origin.
Switched to a new branch 'cs'

À prĂ©sent, votre branche locale cs poussera vers et tirera automatiquement depuis origin/correctionserveur.

Si vous avez dĂ©jĂ  une branche locale et que vous voulez l’associer Ă  une branche distante que vous venez de rĂ©cupĂ©rer ou que vous voulez changer la branche distante que vous suivez, vous pouvez ajouter l’option -u ou --set-upstream-to Ă  la commande git branch Ă  tout moment.

$ git branch -u origin/correctionserveur
Branch correctionserveur set up to track remote branch correctionserveur from origin.
Note
Raccourci vers upstream

Quand vous avez une branche de suivi configurĂ©e, vous pouvez faire rĂ©fĂ©rence Ă  sa branche amont grĂące au raccourci @{upstream} ou @{u}. Ainsi, si vous ĂȘtes sur la branche master qui suit origin/master, vous pouvez utiliser quelque chose comme git merge @{u} au lieu de git merge origin/master si vous le souhaitez.

Si vous voulez voir quelles branches de suivi vous avez configurĂ©es, vous pouvez passer l’option -vv Ă  git branch. Celle-ci va lister l’ensemble de vos branches locales avec quelques informations supplĂ©mentaires, y compris quelle est la branche suivie et si votre branche locale est devant, derriĂšre ou les deux Ă  la fois.

$ git branch -vv
  iss53     7e424c3 [origin/iss53: ahead 2] forgot the brackets
  master    1ae2a45 [origin/master] deploying index fix
* correctionserveur f8674d9 [equipe1/correction-serveur-ok: ahead 3, behind 1] this should do it
  test   5ea463a trying something new

Vous pouvez constater ici que votre branche iss53 suit origin/iss53 et est "devant de deux", ce qui signifie qu’il existe deux commits locaux qui n’ont pas Ă©tĂ© poussĂ©s au serveur. On peut aussi voir que la branche master suit origin/master et est Ă  jour. On peut voir ensuite que notre branche correctionserveur suit la branche correction-serveur-ok sur notre serveur equipe1 et est "devant de trois" et "derriĂšre de un", ce qui signifie qu’il existe un commit qui n’a pas Ă©tĂ© encore intĂ©grĂ© localement et trois commits locaux qui n’ont pas Ă©tĂ© poussĂ©s. Finalement, on peut voir que notre branche test ne suit aucune branche distante.

Il est important de noter que ces nombres se basent uniquement sur l’état de votre branche distante la derniĂšre fois qu’elle a Ă©tĂ© synchronisĂ©e depuis le serveur. Cette commande n’effectue aucune recherche sur les serveurs et ne travaille que sur les donnĂ©es locales qui ont Ă©tĂ© mises en cache depuis ces serveurs. Si vous voulez mettre complĂštement Ă  jour ces nombres, vous devez prĂ©alablement synchroniser (fetch) toutes vos branches distantes depuis les serveurs. Vous pouvez le faire de cette façon :

$ git fetch --all; git branch -vv

Tirer une branche (Pulling)

Bien que la commande git fetch rĂ©cupĂšre l’ensemble des changements prĂ©sents sur serveur et qui n’ont pas dĂ©jĂ  Ă©tĂ© rapatriĂ©s localement, elle ne modifie en rien votre rĂ©pertoire de travail. Cette commande rĂ©cupĂšre simplement les donnĂ©es pour vous et vous laisse les fusionner par vous-mĂȘme. Cependant, il existe une commande appelĂ©e git pull qui consiste essentiellement en un git fetch immĂ©diatement suivi par un git merge dans la plupart des cas. Si vous disposez d’une branche de suivi configurĂ©e comme illustrĂ© dans le chapitre prĂ©cĂ©dent, soit par une configuration explicite soit en ayant laissĂ© les commandes clone ou checkout les crĂ©er pour vous, git pull va examiner quel serveur et quelle branche votre branche courante suit actuellement, synchroniser depuis ce serveur et ensuite essayer de fusionner cette branche distante avec la vĂŽtre.

Il est gĂ©nĂ©ralement prĂ©fĂ©rable de simplement utiliser les commandes fetch et merge explicitement plutĂŽt que de laisser faire la magie de git pull qui peut s’avĂ©rer source de confusion.

Suppression de branches distantes

Supposons que vous en avez terminĂ© avec une branche distante ‒ disons que vous et vos collaborateurs avez terminĂ© une fonctionnalitĂ© et l’avez fusionnĂ©e dans la branche master du serveur distant (ou la branche correspondant Ă  votre code stable). Vous pouvez effacer une branche distante en ajoutant l’option --delete Ă  git push. Si vous souhaitez effacer votre branche correctionserveur du serveur, vous pouvez lancer ceci :

$ git push origin --delete correctionserveur
To https://github.com/schacon/simplegit
 - [deleted]         correctionserveur

En rĂ©sumĂ©, cela ne fait que supprimer le pointeur sur le serveur. Le serveur Git garde gĂ©nĂ©ralement les donnĂ©es pour un temps jusqu’à ce qu’un processus de nettoyage (garbage collection) passe. De cette maniĂšre, si une suppression accidentelle a eu lieu, les donnĂ©es sont souvent trĂšs facilement rĂ©cupĂ©rables.

scroll-to-top