Aller au contenu
Développement medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Branches distantes et tracking

9 min de lecture

origin/main n’est pas une branche distante : c’est un marqueur local mis à jour par git fetch. Cette confusion est la source de nombreuses erreurs — branches qui « ne se mettent pas à jour », pushs rejetés, upstreams manquants. Ce guide vous explique la mécanique des branches distantes, vous montre comment les synchroniser, lire leur état et configurer vos upstreams correctement.

Prérequis : Les branches Git en bref et Merge et résolution de conflits.

  • Comprendre origin/main et le mécanisme de tracking branch
  • Distinguer fetch et pull pour synchroniser votre dépôt local
  • Pousser une branche locale vers le remote et configurer le suivi
  • Supprimer une branche distante proprement après fusion
TypeExempleDescriptionModifiable ?
Branche localemain, feature/loginPointeur sur vos commits locauxOui
Référence distanteorigin/main, origin/developCopie locale de l’état du remote, mise à jour par fetchNon (lecture seule)
Upstreamorigin/main lié à mainLe remote + branche que suit votre branche locale

Concrètement :

Votre machine Serveur (GitHub)
───────────────────────────── ─────────────────
main → commit A main → commit A
origin/main → commit A (copie locale, mise à jour par fetch)
Après git fetch (quelqu'un a pushé B sur le serveur) :
main → commit A main → commit B
origin/main → commit B ← la copie est mise à jour
votre main est en retard de 1 commit

Quand vous clonez un dépôt, Git :

  1. Télécharge tous les objets (commits, arbres, blobs)
  2. Crée des références distantes pour chaque branche du remote (ex. origin/main, origin/develop)
  3. Crée une branche locale main qui suit origin/main
  4. Vous place sur main
Remote (GitHub) : Local après clone :
main → C3 origin/main → C3
develop → C5 origin/develop → C5
main → C3 (tracking origin/main)
HEAD → main

Le nom origin est la convention par défaut pour le remote principal. Ce n’est qu’un alias configurable.

Les branches de forme origin/main, origin/develop sont des remote-tracking branches. Elles sont en lecture seule : vous ne pouvez pas faire de commit dessus directement.

Fenêtre de terminal
# Voir toutes les branches (locales + distantes)
git branch -a

Sortie :

* main
feature/auth
remotes/origin/main
remotes/origin/develop
remotes/origin/feature/auth

Les remotes/origin/... sont les références distantes. Elles sont mises à jour uniquement par git fetch ou git pull.

git fetch télécharge les nouveaux commits du remote et met à jour les références distantes, sans modifier vos branches locales :

Fenêtre de terminal
git fetch origin
Avant fetch : Après fetch :
origin/main → C3 origin/main → C5 (mis à jour)
main → C3 + C4 (local) main → C3 + C4 (inchangé)

Votre branche main locale n’a pas bougé. Pour intégrer les changements distants :

Fenêtre de terminal
# Option 1 : merge
git merge origin/main
# Option 2 : rebase (historique linéaire)
git rebase origin/main
CommandeActionModifie la branche locale ?
git fetchTélécharge les commits distantsNon
git pullgit fetch + git mergeOui
git pull --rebasegit fetch + git rebaseOui

Une tracking branch (branche de suivi) est une branche locale liée à une branche distante. Cette liaison permet à Git d’afficher des informations comme « 2 commits d’avance, 1 commit de retard ».

Fenêtre de terminal
# Créer et suivre une branche distante existante
git switch --track origin/feature/api
# Raccourci (si le nom n'existe qu'en remote) :
git switch feature/api
Fenêtre de terminal
git branch -u origin/feature/auth
# ou
git branch --set-upstream-to=origin/feature/auth
Fenêtre de terminal
git branch -vv

Sortie :

feature/auth a1b2c3d [origin/feature/auth: ahead 2] Ajouter JWT
* main i7j8k9l [origin/main] Merge PR #42
fix/header e4f5g6h [origin/fix/header: behind 1] Corriger z-index
  • ahead 2 : vous avez 2 commits locaux non poussés
  • behind 1 : le remote a 1 commit que vous n’avez pas
  • Pas d’indication : synchronisé
Fenêtre de terminal
git push -u origin feature/login

Le -u (ou --set-upstream) crée la branche sur le remote et configure le tracking. Les push suivants n’ont besoin que de :

Fenêtre de terminal
git push
Fenêtre de terminal
git push --all origin

Après le merge d’une PR, supprimez la branche distante pour garder un remote propre :

Fenêtre de terminal
git push origin --delete feature/login

Vérification :

Fenêtre de terminal
git branch -a | grep feature/login
# Aucun résultat = suppression réussie

N’oubliez pas de supprimer la branche locale aussi :

Fenêtre de terminal
git branch -d feature/login

Si vous travaillez sur un fork, vous avez généralement deux remotes :

Fenêtre de terminal
# Ajouter le dépôt original comme remote "upstream"
git remote add upstream https://github.com/original/repo.git
# Vérifier les remotes
git remote -v

Pour synchroniser votre fork :

Fenêtre de terminal
git fetch upstream
git switch main
git merge upstream/main
git push origin main
SymptômeCause probableSolution
There is no tracking information for the current branchPas de tracking configurégit branch -u origin/ma-branche
! [rejected] (non-fast-forward)Remote a divergégit pull --rebase puis git push
fatal: 'origin/feature' not foundBranche supprimée sur le remotegit fetch --prune pour nettoyer
ahead N, behind MDésynchronisation locale/remotegit pull --rebase pour rattraper le retard, puis git push
  • origin/main est une référence locale, pas la branche distante elle-même
  • git fetch met à jour les références distantes sans toucher à vos branches
  • git pull = git fetch + git merge (ou --rebase)
  • git push -u crée la branche distante et configure le tracking
  • git branch -vv montre ahead/behind pour chaque branche
  • git push origin --delete supprime une branche sur le remote

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn