La commande git pull est utilisée pour faire un fetch du contenu d'un dépôt distant et 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 principale 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 principale 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 qui 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, puis réécrit les commits locaux E--F--G pour qu'ils apparaissent à la suite des premiers dans l'historique local du commit origin/master.

Options communes

git pull <remote>

Fetch the specified remote’s copy of the current branch and immediately merge it into the local copy. This is the same as git fetch followed by git merge origin/.

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>

Comme dans le pull précédent, 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

You can think of git pull as Git's version of svn update. It’s an easy way to synchronize your local repository with upstream changes. The following diagram explains each step of the pulling process.

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

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ée comme l'option « sûre », alors que git pull peut être considérée comme l'option « dangereuse ». git fetch téléchargera le contenu distant et ne changera pas l'état du dépôt local. En revanche, 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.

In fact, pulling with --rebase is such a common workflow that there is a dedicated configuration option for it:

git config --global branch.autosetuprebase always

After running that command, all git pull commands will integrate via git rebase instead of git merge.

Exemples de Git pull

Les exemples suivants illustrent l'utilisation de la commande 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 . Ensuite, la commande git pull est exécutée avec le dépôt transmis. Ceci aura pour effet implicite de faire un pull de la branche newfeature depuis . Une fois le téléchargement terminé, une commande git merge est exécutée.

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.