git fetch
Télécharger des objets et des références depuis un autre dépôt
La commande 'git fetch' télécharge les commits, fichiers et références d’un dépôt distant dans votre dépôt local. Elle permet de voir sur quoi les autres ont travaillé sans fusionner ces modifications dans vos branches locales. Contrairement à 'git pull', fetch est sans danger - il ne modifie jamais votre répertoire de travail ni votre branche courante. Après un fetch, vous pouvez relire les modifications et décider de les fusionner ou non.
Synopsis
git fetch [<options>] [<repository> [<refspec>...]]
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)...]
git fetch --all [<options>]Options
Choisir la bonne option
Fetch ou pull
Comprendre la différence essentielle entre fetch et pull
| Commande | Télécharge les commits | Met à jour la branche locale | Sans danger à tout moment |
|---|---|---|---|
git fetch | Oui | Non - seulement le suivi distant | Oui - ne touche jamais au répertoire de travail |
git pull | Oui | Oui - fusionne dans la courante | Prudence - peut provoquer des conflits |
git pull --rebase | Oui | Oui - rebase la courante | Prudence - réécrit les commits locaux |
Options de fetch pour le nettoyage
Des options pour garder votre dépôt en ordre
| Commande | Retire les branches périmées | Récupère les tags | Cas d’usage |
|---|---|---|---|
git fetch | No | Certains (accessibles) | Mise à jour standard |
git fetch --prune | Oui | Certains (accessibles) | Nettoyer les branches supprimées |
git fetch --tags | No | Tous les tags | Récupérer les tags de release |
git fetch --prune --tags | Oui | Tous les tags | Nettoyer les branches + récupérer tous les tags (les tags locaux sont gardés) |
Portée du fetch
Contrôler ce qui est récupéré
| Commande | Récupère depuis | Idéal pour |
|---|---|---|
git fetch | Dépôt distant par défaut (origin) | Usage le plus courant |
git fetch origin | Un dépôt distant précis | Quand vous avez plusieurs dépôts distants |
git fetch --all | Tous les dépôts distants | Synchroniser un fork avec upstream |
git fetch origin main | Une seule branche | Téléchargement minimal |
Exemples
Fetch depuis le dépôt distant par défaut
git fetchTélécharge les nouveaux commits du dépôt distant par défaut (en général 'origin') sans fusionner.
Fetch depuis un dépôt distant précis
git fetch originFaire explicitement un fetch depuis le dépôt distant 'origin'.
Fetch de tous les dépôts distants
git fetch --allFaire un fetch de tous les dépôts distants configurés d’un coup.
Fetch et élagage des branches périmées
git fetch --pruneFaire un fetch et retirer les branches de suivi distantes qui n’existent plus sur le dépôt distant.
Exemples de workflows
git fetch originTélécharger les modifications distantes sans fusionner
git log main..origin/mainVoir les commits distants absents de votre branche locale
git diff main...origin/mainRelire les modifications de code faites à distance
git merge origin/mainFusionner quand vous êtes prêt
git remote add upstream <original-repo-url>Ajouter le dépôt original comme upstream (une seule fois)
git fetch upstreamRécupérer les dernières nouveautés du dépôt original
git checkout mainPasser sur votre branche main
git merge upstream/mainFusionner les modifications d’upstream dans votre fork
git push origin mainPousser le fork à jour vers votre GitHub
git fetch --pruneFaire un fetch et retirer les branches de suivi distantes périmées
git branch -vvVoir les branches locales et leur état de suivi
git branch -d old-featureSupprimer les branches locales qui suivaient des branches distantes supprimées
Dépannage
fatal: 'origin' does not appear to be a git repository
Cause : Aucun dépôt distant nommé 'origin' n’est configuré
Vérifiez les dépôts distants avec 'git remote -v'. Ajoutez-en un avec 'git remote add origin <url>'
Fetch fait mais ma branche locale ne s’est pas mise à jour
Cause : Fetch ne met à jour que les branches de suivi distantes, pas les branches locales
C’est normal ! Lancez 'git merge origin/main' ou 'git pull' pour mettre à jour votre branche locale
error: cannot lock ref - unable to update local ref
Cause : Une référence de suivi distante périmée entre en collision avec un nouveau nom de branche (par ex. 'feature' et 'feature/login')
Lancez 'git remote prune origin' ou 'git fetch --prune' pour retirer les références périmées, puis refaites un fetch
Des branches distantes supprimées apparaissent toujours
Cause : Il faut élaguer les branches de suivi distantes périmées
Utilisez 'git fetch --prune' ou 'git remote prune origin'
Le fetch est très lent ou télécharge trop
Cause : Vous récupérez tout l’historique alors que seuls les commits récents vous servent
Utilisez 'git fetch --depth=1' pour un fetch superficiel, ou ne récupérez qu’une branche précise
Astuces et pièges
Bonnes pratiques
- ✓Faites un fetch avant de commencer à travailler pour voir s’il y a des modifications distantes à connaître
- ✓Utilisez --prune régulièrement pour débarrasser votre dépôt des branches périmées
- ✓Préférez fetch + merge à pull quand vous voulez relire les modifications avant de les intégrer
- ✓Configurez 'git config fetch.prune true' pour élaguer à chaque fetch
- ✓Utilisez 'git fetch --all' quand vous travaillez avec des forks, pour synchroniser à la fois origin et upstream
Erreurs fréquentes
- ✗S’attendre à ce que fetch mette à jour votre répertoire de travail - il ne met à jour que les branches de suivi distantes, pas vos branches locales.
- ✗Oublier de faire un merge ou un rebase après le fetch - fetch télécharge mais n’intègre pas les modifications.
- ✗Ne pas utiliser --prune régulièrement, ce qui laisse des branches de suivi distantes périmées encombrer votre dépôt.
- ✗Confondre fetch et pull - pull = fetch + merge, alors que fetch n’est que l’étape de téléchargement.
FAQ
Fetch télécharge les commits mais ne change pas vos branches locales. Pull = fetch + merge (ou rebase). Fetch est plus sûr, car il vous laisse relire les modifications avant de les intégrer.
Fetch ne met à jour que les branches de suivi distantes (comme origin/main), pas vos branches locales. Il faut un merge ou un rebase pour mettre à jour votre branche locale.
Utilisez 'git log main..origin/main' pour voir les commits distants absents de votre branche locale, ou 'git diff main...origin/main' pour voir les modifications de code faites à distance.
Fetch quand vous voulez d’abord relire les modifications ou que vous travaillez sur des branches importantes. Pull pour des mises à jour rapides quand vous faites confiance aux modifications entrantes.
Utilisez 'git fetch origin branch-name' pour ne récupérer que cette branche. Utile pour les gros dépôts où vous n’avez pas besoin de tout.
Il retire les branches de suivi distantes qui n’existent plus sur le dépôt distant. Garde votre dépôt propre quand vos collègues suppriment des branches fusionnées.