git pull

Partager et mettre à jour

Récupérer depuis un autre dépôt ou une branche locale et intégrer


La commande 'git pull' récupère le contenu d’un dépôt distant et l’intègre aussitôt dans votre branche locale. C’est en gros 'git fetch' suivi de 'git merge' (ou de 'git rebase' avec l’option --rebase). C’est la façon la plus courante de synchroniser votre dépôt local avec les modifications des autres. Quand vous lancez git pull, Git télécharge d’abord tous les nouveaux commits du dépôt distant, puis les intègre dans votre branche courante. Si votre branche est simplement en retard, il fait un fast-forward ; si les deux côtés ont de nouveaux commits, le Git moderne s’arrête et vous demande de choisir entre merge et rebase (--no-rebase / --rebase, ou le réglage pull.rebase). En cas de modifications en conflit, Git s’arrête et vous demande de résoudre les conflits avant de terminer la fusion.

Synopsis

git pull [--rebase | --no-rebase] [--ff-only | --ff | --no-ff] [--commit | --no-commit] [--autostash | --no-autostash] [-q | --quiet] [-v | --verbose] [--depth=<depth>] [--prune] [--tags | --no-tags] [--recurse-submodules[=yes|on-demand|no]] [<repository> [<refspec>...]]
[ ] facultatif| ou<arg> valeur à remplacer... répétable--flag option

Options

Cliquez sur une option pour la déplier

Débutant (7)

Le nom du dépôt distant par défaut. Quand vous clonez un dépôt, Git nomme automatiquement le dépôt distant 'origin'. Vous pouvez faire un pull depuis origin en le précisant, ou compter sur la configuration de suivi par défaut.

Si nécessaireNomme explicitement le dépôt distant et la branche ; un simple git pull utilise l’upstream

Exemple

git pull origin main

Après le fetch, rebaser la branche courante sur la branche upstream. Cela donne un historique linéaire en rejouant vos commits locaux par-dessus les commits récupérés, sans commits de fusion.

RecommandéRejoue vos commits non poussés par-dessus, en gardant un historique linéaire

Exemple

git pull --rebase origin main

Raccourci de --rebase=false. Passe outre toute configuration qui rebase par défaut et force un merge au lieu d’un rebase pour intégrer les modifications récupérées. Crée un commit de fusion si les historiques ont divergé.

Si nécessaireFusionne explicitement quand les branches ont divergé ou que la config utilise rebase par défaut

Exemple

git pull --no-rebase origin main

Ne mettre à jour que si la branche locale peut avancer en fast-forward (aucun commit local en avance sur le distant). Échoue si les historiques ont divergé, ce qui évite les fusions accidentelles et vous invite à décider comment intégrer.

RecommandéNe crée jamais de fusions surprises ; s’arrête pour vous laisser choisir quand les branches divergent

Exemple

git pull --ff-only origin main

Mode verbeux. Affiche le détail du fetch et de la fusion, notamment quelles références sont mises à jour et les statistiques de transfert d’objets.

Si nécessairePour déboguer ce que font fetch et la fusion

Exemple

git pull -v origin main

Masquer la sortie pendant le fetch et la fusion. Seules les erreurs sont affichées. Utile dans les scripts qui doivent rester silencieux.

Si nécessairePour les scripts ; masque la progression et la sortie de la fusion

Exemple

git pull -q origin main

Mettre automatiquement de côté les modifications locales avant le pull et les réappliquer une fois le pull terminé (fonctionne avec les pulls par merge et par rebase ; si la réapplication entre en conflit, vos modifications restent en sécurité dans le stash). Parfait quand vous avez des modifications non committées mais devez vous synchroniser.

Si nécessairePratique avec du travail non commité ; en cas de conflit à la réapplication, il reste dans le stash

Exemple

git pull --rebase --autostash origin main

Intermédiaire (6)

Faire la fusion mais s’arrêter avant de créer le commit de fusion. Permet d’examiner, voire de modifier, le résultat avant de committer.

Si nécessaireS’arrête avant le commit de fusion pour que vous puissiez inspecter le résultat

Exemple

git pull --no-commit origin main

Avant le fetch, retirer les références de suivi distantes qui n’existent plus sur le dépôt distant. Aide à débarrasser votre dépôt local des branches périmées. N’élague que si les refspecs configurés du dépôt distant sont utilisés - 'git pull --prune origin main' n’élague rien.

Si nécessaireNettoie les références de suivi distantes périmées ; ne fait rien avec un refspec explicite

Exemple

git pull --prune

Récupérer tous les tags du dépôt distant en plus de ce qui serait récupéré normalement. Utile pour synchroniser les tags de release.

Si nécessaireRécupère aussi les tags hors de l’historique récupéré ; rarement utile

Exemple

git pull --tags origin main

Désactiver le suivi automatique des tags : par défaut, les tags qui pointent sur les commits téléchargés sont aussi récupérés. Passe outre le réglage remote.<name>.tagOpt. Utile quand vous ne voulez que les mises à jour de branches.

Si nécessaireIgnore le suivi automatique des tags pour des mises à jour de branches seulement

Exemple

git pull --no-tags origin main

Limiter la récupération au nombre de commits indiqué depuis la pointe de l’historique de chaque branche distante. Crée ou approfondit un clone superficiel. Utile pour les gros dépôts.

Si nécessaireGarde un clone superficiel superficiel (CI) ; les commandes basées sur l’historique voient moins

Exemple

git pull --depth=1 origin main

Récupérer tous les dépôts distants. Au lieu d’un seul dépôt distant, récupère depuis tous ceux configurés avant de fusionner.

Si nécessaireRécupère depuis chaque dépôt distant mais ne fusionne que l’upstream courant

Exemple

git pull --all

Avancé (4)

Contrôler si les sous-modules sont récupérés et mis à jour récursivement. Valeurs : 'yes' (toujours), 'on-demand' (quand le super-projet met à jour la référence du sous-module), 'no' (jamais).

Si nécessaireSeulement dans les dépôts avec sous-modules, pour les garder synchronisés

Exemple

git pull --recurse-submodules=on-demand origin main

Convertir un dépôt superficiel en dépôt complet en récupérant tout l’historique manquant. Valable seulement pour un pull dans un clone superficiel.

Si nécessaireTransforme un clone superficiel en clone complet quand vous avez besoin de tout l’historique

Exemple

git pull --unshallow origin main

Utiliser la stratégie de fusion indiquée. Stratégies courantes : ort (par défaut), resolve, octopus, ours, subtree. recursive est encore accepté mais n’est qu’un synonyme de ort depuis Git 2.50.

Si nécessaireRarement utile ; la stratégie ort par défaut convient à presque tous les pulls

Exemple

git pull -s ort origin main

Autoriser la fusion d’historiques sans ancêtre commun. Nécessaire pour réunir deux dépôts créés indépendamment.

DéconseilléSeulement pour réunir volontairement des dépôts séparés ; sinon, cela masque une erreur

Exemple

git pull --allow-unrelated-histories origin main

Choisir la bonne option

Stratégie de pull : merge ou rebase

Le choix fondamental qui influence votre historique de commits

CommandeCrée un commit de fusionStyle d’historiqueIdéal pour
git pullDépend de la configuration (échoue en cas de divergence si rien n’est configuré)Défini par pull.rebase / pull.ffFast-forward quand on est seulement en retard
git pull --rebaseNoLinéaireBranches de fonctionnalité, historique propre
git pull --no-rebaseOui (en cas de divergence)Préserve les branchesPasser outre la config rebase, forcer merge
git pull --ff-onlyNoLinéaire (échoue en cas de divergence)Éviter toute fusion accidentelle

Options de sécurité et de contrôle

Des options pour éviter les erreurs et garder le contrôle

CommandeEmpêcheComportementQuand l’utiliser
--ff-onlyFusions inattenduesÉchoue si le fast-forward est impossibleCI/CD, branches protégées
--no-commitCommit automatiqueFusionne mais s’arrête avant le commitRelire la fusion avant de committer
--autostashErreurs de répertoire de travail modifiéStash → pull → popSynchronisation rapide avec du travail non committé
--dry-runN’importe quelles modificationsMontre ce que fetch téléchargerait ; aucune fusionPrévisualiser les références entrantes

Ce qui est récupéré

Contrôler quelles références et quel historique sont téléchargés

CommandeRécupère les tagsRécupère tout l’historiqueCas d’usage
git pullAuto (tags suivis)OuiWorkflow normal
--tagsTous les tagsOuiSynchroniser les versions publiées
--no-tagsNoOuiÉconomiser la bande passante, synchroniser une seule branche
--depth=NAuto (tags suivis)Seulement les N derniers commitsGros dépôts, builds de CI
--unshallowAuto (tags suivis)Convertit un clone superficiel en clone completBesoin de tout l’historique après un clone superficiel

Gestion des dépôts distants et des branches

Des options pour gérer plusieurs dépôts distants et les références périmées

CommandePortéeNettoieScénario
git pull origin mainUn seul dépôt distant/une seule brancheNoPull standard depuis origin
--allTous les dépôts distantsNoSynchroniser depuis origin + upstream
--pruneUn seul dépôt distantBranches suppriméesRetirer les références de suivi périmées

Scénarios avancés

Des options pour les situations complexes ou inhabituelles

CommandeRésoutNiveau de risqueScénario typique
--allow-unrelated-historiesAucun ancêtre communMoyenFusionner deux dépôts séparés
-s <strategy>Besoins de fusion particuliers (n’évite pas les conflits)FaibleImposer un algorithme de fusion
--recurse-submodulesSous-modules pas à jourFaibleProjets avec des sous-modules git

Exemples de workflows

1
git status

Vérifier les modifications non committées qui pourraient entrer en conflit

2
git stash

Mettre de côté le travail non committé si besoin (ou utiliser --autostash)

3
git pull --rebase origin main

Faire un pull avec rebase pour garder l’historique propre

4
git stash pop

Restaurer le travail mis de côté si vous l’aviez fait

1
git checkout feature-branch

Passer sur votre branche de fonctionnalité

2
git pull --no-rebase origin main

Fusionner le dernier main dans votre branche de fonctionnalité (explicitement, puisque les branches ont divergé)

3
git push origin feature-branch

Pousser la branche de fonctionnalité à jour

1
git fetch origin

Télécharger les modifications distantes sans toucher au répertoire de travail

2
git log HEAD..origin/main

Voir quels commits vous allez récupérer

3
git diff HEAD...origin/main

Relire les modifications faites à distance

4
git pull origin main

Faire le pull une fois satisfait des modifications

1
git pull --no-rebase origin main

Tenter un pull par merge - peut provoquer des conflits

2
git status

Voir quels fichiers sont en conflit (marqués 'both modified')

3
(edit conflicted files)

Ouvrir les fichiers et résoudre les marqueurs de conflit (<<<<<<<, =======, >>>>>>>)

4
git add <resolved-files>

Indexer les fichiers résolus

5
git commit

Terminer la fusion avec un commit

1
git pull --rebase --autostash origin main

Mettre automatiquement les modifications de côté, faire le pull, puis les réappliquer

Dépannage

Your local changes would be overwritten by merge

Cause : Vous avez des modifications non committées dans des fichiers que le pull modifierait

Committez d’abord vos modifications (git add . && git commit), mettez-les de côté (git stash), ou utilisez git pull --rebase --autostash

git stash && git pull && git stash pop

Refusing to merge unrelated histories

Cause : Les dépôts distant et local n’ont aucun ancêtre commun (par ex. un pull dans un dépôt tout juste initialisé)

Autoriser la fusion d’historiques sans lien, ce qui est courant quand on ajoute un dépôt distant à un dépôt local existant

git pull --allow-unrelated-histories origin main

Conflit de fusion dans un ou plusieurs fichiers

Cause : Vous et le dépôt distant avez modifié les mêmes lignes d’un fichier

Ouvrez les fichiers en conflit, cherchez les marqueurs (<<<<<<<, =======, >>>>>>>), corrigez, puis git add et git commit. Ou abandonnez avec git merge --abort

git add <resolved-file> && git commit

Not possible to fast-forward, aborting

Cause : Vous avez utilisé --ff-only (ou pull.ff=only est configuré) mais votre branche locale a divergé du dépôt distant

Utilisez plutôt un rebase (git pull --rebase) ou acceptez un commit de fusion (git pull --no-rebase)

git pull --rebase origin main

Cannot pull with rebase: You have unstaged changes

Cause : Un pull par rebase exige un arbre de travail propre, et vous avez des modifications non committées

Committez ou mettez de côté vos modifications, ou utilisez autostash pour les gérer automatiquement

git pull --rebase --autostash

No tracking information for the current branch

Cause : Votre branche n’est pas configurée pour suivre une branche distante

Définissez explicitement la branche upstream, ou précisez le dépôt distant et la branche dans la commande pull

git branch --set-upstream-to=origin/main main

'origin' does not appear to be a git repository

Cause : Aucun dépôt distant nommé 'origin' n’est configuré

Vérifiez vos dépôts distants avec git remote -v, puis ajoutez origin ou utilisez le bon nom de dépôt distant

git remote add origin <url>

You have divergent branches and need to specify how to reconcile them

Cause : Les deux côtés ont de nouveaux commits et ni pull.rebase ni pull.ff n’est configuré, donc le Git moderne refuse de deviner (les versions 2.27+ plus anciennes se contentaient d’avertir)

Précisez merge (--no-rebase) ou rebase (--rebase), ou configurez un défaut avec git config pull.rebase

git config --global pull.rebase true

Astuces et pièges

Bonnes pratiques

  • ✓Vérifiez toujours git status avant un pull pour éviter les conflits avec des modifications non committées
  • ✓Utilisez git pull --rebase pour garder un historique propre et linéaire sur les branches de fonctionnalité
  • ✓Configurez pull.rebase=true globalement si vous préférez le rebase par défaut : git config --global pull.rebase true
  • ✓Faites d’abord git fetch quand vous voulez relire les modifications avant de les intégrer
  • ✓Utilisez --ff-only pour être sûr de ne créer aucun commit de fusion par accident
  • ✓Configurez le suivi de branche avec git push -u lors du premier push pour simplifier les pulls suivants
  • ✓Utilisez --autostash quand vous avez des modifications non committées mais devez faire un pull vite
  • ✓Faites régulièrement un pull de main/master pour éviter plus tard des fusions grosses et complexes
  • ✓Résolvez les conflits tout de suite - ne laissez jamais votre dépôt dans un état de conflit
  • ✓Utilisez git pull --prune pour nettoyer les branches de suivi distantes périmées
  • ✓Envisagez git fetch + git merge pour mieux contrôler l’intégration
  • ✓Vérifiez toujours que vous êtes sur la bonne branche avant un pull pour ne pas mélanger les modifications

Erreurs fréquentes

  • ✗Faire un pull avec des modifications non committées : cela peut provoquer des conflits ou échouer complètement. Committez ou mettez de côté vos modifications d’abord, ou utilisez --autostash pour le gérer automatiquement.
  • ✗Ne pas comprendre la différence entre pull et fetch : 'git pull' fusionne automatiquement, ce qui peut surprendre. Faites d’abord 'git fetch' si vous voulez relire les modifications avant de les intégrer.
  • ✗Utiliser merge quand rebase serait plus propre : sur les branches de fonctionnalité, 'git pull --rebase' donne un historique linéaire plus propre, sans commits de fusion inutiles.
  • ✗Ignorer les conflits de fusion : après un pull avec conflits, il faut les résoudre et committer. Ne laissez jamais votre dépôt dans un état de conflit.
  • ✗Faire un pull dans la mauvaise branche : vérifiez toujours votre branche courante avec 'git status' avant un pull. Tirer dans main alors que vous visiez une branche de fonctionnalité peut poser problème.

FAQ

A:

git fetch télécharge seulement les nouveaux commits du dépôt distant sans modifier votre répertoire de travail ni vos branches locales. git pull fait un fetch ET fusionne (ou rebase) automatiquement ces modifications dans votre branche courante. Utilisez fetch quand vous voulez relire les modifications avant de les intégrer.

A:

Utilisez --rebase quand vous voulez un historique propre et linéaire (surtout sur les branches de fonctionnalité). Vos commits locaux sont rejoués par-dessus les commits récupérés au lieu de créer un commit de fusion. Utilisez le pull normal (merge) quand vous voulez préserver exactement l’historique de quand les modifications ont été faites.

A:

Le fast-forward a lieu quand votre branche locale n’a aucun commit que le dépôt distant n’a pas. Git avance simplement le pointeur de votre branche jusqu’au distant - aucun commit de fusion n’est nécessaire. Si vous avez des commits locaux, Git doit soit créer un commit de fusion, soit faire un rebase - et, sauf si vous passez --rebase/--no-rebase ou configurez pull.rebase, le Git moderne s’arrête avec « Need to specify how to reconcile divergent branches ».

A:

Utilisez git pull --rebase pour rejouer vos commits locaux par-dessus les commits distants et obtenir un historique linéaire. Ou utilisez git pull --ff-only, qui ne réussit que si un fast-forward est possible (échoue si vous avez des commits locaux en avance).

A:

Ça dépend. Avec un pull par merge, Git l’accepte si les commits entrants ne touchent pas les fichiers que vous avez modifiés ; sinon il refuse avec « Your local changes ... would be overwritten by merge ». Avec --rebase, la moindre modification non committée bloque le pull. Bonne pratique : committez d’abord vos modifications, ou utilisez git pull --rebase --autostash pour les mettre de côté et les restaurer automatiquement.

A:

Git met la fusion en pause et marque les fichiers en conflit. Ouvrez chacun d’eux, cherchez les marqueurs de conflit (<<<<<<<, =======, >>>>>>>), corrigez, puis git add du fichier et git commit pour terminer la fusion. Utilisez git merge --abort pour annuler (ou, pour git pull --rebase, git rebase --continue / git rebase --abort).

A:

Juste après le pull, lancez git reset --hard ORIG_HEAD - Git garde votre ancienne pointe dans ORIG_HEAD pour les fusions, fast-forwards et rebases. N’utilisez pas HEAD~1 : un fast-forward a pu amener plusieurs commits. --hard jette aussi les modifications non committées. Si ORIG_HEAD a bougé depuis, retrouvez l’ancienne pointe avec git reflog.

A:

En général, vous tirez depuis la mauvaise branche ou le mauvais dépôt distant. Vérifiez : git branch -vv pour les infos de suivi, git remote -v pour les dépôts distants, puis git fetch --all suivi de git log origin/main pour voir les commits distants.

A:

git pull origin main précise explicitement le dépôt distant et la branche d’où tirer. git pull (sans argument) utilise la branche de suivi configurée pour votre branche courante. Si aucun suivi n’est configuré, une erreur vous demande de les préciser.

A:

Globalement : git config --global pull.rebase true (pour rebase) ou git config --global pull.rebase false (pour merge). Vous pouvez aussi le définir par dépôt sans --global, ou par branche avec git config branch.<name>.rebase true.