La commande git pull est utilisée pour faire un fetch du contenu d'un dépôt distant pour le télécharger, puis pour mettre à jour immédiatement le dépôt local qui correspond à ce contenu. Faire un merge des changements en amont dans votre dépôt local est une tâche courante dans les workflows Git. La commande git pull est en fait la combinaison de deux autres commandes, git fetch suivie de git merge. Lors de la première étape, git pull exécute une commande git fetch étendue à la branche locale vers laquelle HEAD pointe. Une fois le contenu téléchargé, git pull entre un workflow de merge. Un nouveau commit de merge est créé et HEAD est mis à jour pour pointer vers le nouveau commit.

Utilisation de la commande git pull

Fonctionnement

La commande git pull exécute d'abord git fetch qui télécharge le contenu du dépôt distant spécifié. Ensuite, une commande git merge est exécutée pour faire un merge des réfs et des heads du contenu distant dans un nouveau commit de merge local. Pour mieux démontrer le processus de pull et de merge, considérons l'exemple suivant. Imaginons que nous ayons un dépôt avec une branche master et une origine distante.

Dans ce scénario, git pull téléchargera tous les changements à partir du point où la branche locale et la branche master ont divergé. Dans cet exemple, ce point est E. git pull fera un fetch des commits distants divergents qui sont A-B-C. Le processus de pull créera alors un nouveau commit de merge local inclura le contenu des nouveaux commit distants divergents.

Dans le diagramme ci-dessus, nous voyons le nouveau commit H. Ce commit est un nouveau commit de merge qui contient le contenu des commit A-B-C distants et possède un message de log combiné. Cet exemple est l'une des quelques stratégies de merge git pull. Une option --rebase peut être transmise à git pull pour utiliser une stratégie de merge de rebase au lieu d'un commit de merge. L'exemple suivant montrera comment fonctionne un pull de rebase. Supposons que nous sommes à un point de départ de notre premier diagramme, et que nous avons exécuté la commande git pull --rebase.

Dans ce diagramme, nous pouvons maintenant voir qu'un pull de rebase ne crée pas le nouveau commit H. Au lieu de cela, le rebase a copié les commits distants A--B--C et les a ajoutés à l'historique local du commit origin/master.

Options communes

git pull <remote>

Fetcher la copie de la branche courante du remote spécifié et la merger immédiatement dans la copie locale. Le process est identique à git fetch <copie-distante> suivi de git merge origin/<branche-actuelle>.

git pull --no-commit <remote>

Comme l'invocation par défaut, fait un fetch du contenu distant mais ne crée pas de nouveau commit de merge.

git pull --rebase <remote>

Au lieu d'utiliser git merge pour intégrer la branche distante avec la branche locale, utilisez git rebase.

git pull --verbose

Fournit une sortie « verbose » lors d'un pull qui affiche le contenu téléchargé et les détails du merge.

Discussion sur la commande git pull

Vous pouvez considérer git pull comme la version Git de svn update. Cela permet de synchroniser en toute facilité votre dépôt local avec les changements en amont. Le schéma suivant explique toutes les étapes du process d'extraction.

Vous pensez d'abord que votre dépôt est synchronisé, mais git fetch révèle que la version d'origine du master a évolué depuis la dernière fois que vous l'avez consultée. Ensuite, git merge intègre immédiatement le master distant dans le master local.

Git pull et synchronisation

git pull est l'une des nombreuses commandes qui revendiquent la responsabilité de « synchroniser » le contenu distant. La commande git remote est utilisée pour spécifier les points de terminaison distants sur lesquels les commandes de synchronisation agiront. La commande git push permet de télécharger du contenu sur un dépôt distant.

La commande git fetch peut être confondue avec git pull. Elles sont toutes deux utilisées pour télécharger du contenu distant. Une distinction de sécurité importante peut être faite entre les commandes git pull et git fetch. git fetch peut être considéré comme l'option « sûre », alors que git pull peut être considéré comme l'option « dangereuse ». git fetch téléchargera le contenu distant et ne changera pas l'état du dépôt local. Alternativement, git pull téléchargera le contenu distant et tentera immédiatement de changer l'état local pour qu'il corresponde à ce contenu. Ceci peut involontairement provoquer un conflit d'état avec le dépôt local.

Pull via l'option rebase

L'option --rebase peut être utilisée pour obtenir un historique linéaire en évitant les commits de merge superflus. De nombreux développeurs préfèrent le rebase au merge, puisque cela revient à dire, « Je veux donner la priorité à mes changements. » En ce sens, utiliser git pull avec le flag --rebase s'apparente plus à svn update qu'à un git pull brut.

En effet, faire un pull avec --rebase est un workflow si courant qu'il existe une option de configuration dédiée :

git config --global branch.autosetuprebase always

Une fois cette commande lancée, toutes les commandes git pull s'intègrent via git rebase au lieu de git merge.

Exemples de Git pull

Les exemples suivants montrent comment utiliser git pull dans des scénarios courants :

Comportement par défaut

git pull

Exécuter l'invocation par défaut de git pull équivaut à git fetch origin HEAD et git merge HEADHEAD est la réf pointant vers la branche actuelle.

Commande git pull sur des branches distantes

git checkout new_feature
git pull <remote repo>

Cet exemple effectue d'abord un checkout et passe à la branche <new-feature>. Ensuite, la commande git pull est exécutée avec le dépôt <remote repo>. Ceci aura pour effet implicite de réduire la branche newfeature de <remote repo>. Une fois le téléchargement terminé, il initiera une commande git merge.

Git pull de rebase à la place de merge

L'exemple suivant montre comment effectuer une synchronisation avec la branche principale du dépôt centralisé :

git checkout master
git pull --rebase origin

Cette opération donne simplement la priorité à vos changements locaux par rapport aux contributions des autres personnes.