85 votes

Différences entre les commandes "git pull" lors de l'extraction à partir de l'origine ?

Quelles sont les différences entre ces commandes ?

# 1
git pull
# 2
git pull origin
# 3
git pull origin master
# 4
git pull origin/master
# 5
git pull origin HEAD:master

86voto

michas Points 6206

git pull est une commande de commodité, qui permet de faire plusieurs choses en même temps. Il s'agit en fait d'une combinaison de git fetch qui se connecte au dépôt distant et récupère les nouvelles modifications, et git merge (ou git rebase ) qui incorpore les nouveaux commits dans votre branche locale. En raison des deux commandes différentes impliquées, la signification de git pull n'est pas toujours évidente.

Vous pouvez configurer une branche locale en amont. Après un nouveau clonage, vous aurez une branche locale "master", une branche distante "origin" et votre branche master aura "origin/master" comme amont. Je suppose que cette configuration est la suivante. (Vous pouvez voir votre configuration en amont avec git branch -vv ou en consultant le fichier .git/config).

J'en viens maintenant à vos questions :

  1. git pull = git fetch origin + git merge origin/master (ou quel que soit votre amont)
  2. git pull origin = git pull (à condition que l'origine soit votre télécommande en amont)
  3. git pull origin master = git fetch origin master + git merge FETCH_HEAD
  4. git pull origin/master : invalide à moins que vous n'ayez un serveur distant appelé "origin/master"
  5. git pull origin HEAD:master : Tente de réinitialiser directement votre maître local à ce que HEAD pointe sur l'origine. (Ne faites pas cela.)

18voto

Noufal Ibrahim Points 32200

A pull est en fait un fetch (qui récupère des commits et des objets associés d'un dépôt distant vers le vôtre), puis une opération qui les "applique" à votre copie de travail. La deuxième étape est, par défaut, réalisée à l'aide d'une commande merge mais vous pouvez définir le pull.rebase à la variable true et il rebasera à la place.

Deux questions se posent dans le cadre de la pull commandement. La première question est la suivante : qu'est-ce qui est recherché exactement ? Et la seconde, comment appliquer ces changements à ma copie de travail ? Commençons par la première. La forme complète de la commande est

git pull [options] [repository] [<refspec>...]

Les options sont des drapeaux qui contrôlent le comportement (par exemple --rebase pour faire de la pull travailler en tant que fetch + rebase même si pull.rebase es false ).

repository est le nom (ou l'URL) de la source distante à extraire.

refspecs sont une manière succincte de spécifier les références que vous souhaitez récupérer sur le site distant et l'endroit où vous souhaitez les placer dans votre copie de travail actuelle.

Prenons d'abord la forme la plus explicite.

 git pull origin branch1:branch2

Cela revient à dire qu'il faut retirer les modifications de la référence branch1 sur l'ordinateur distant appelé origin puis les fusionner (ou les rebaser) dans la branche locale branch2 . Si je dis par exemple git pull origin master:dev J'obtiendrai une branche locale appelée dev qui pointera vers le même commit que master . Les détails de la spécification des refspecs sont les suivants aquí . Vous pouvez utiliser un * pour indiquer plusieurs refspecs. Par exemple, git pull origin refs/heads/*:refs/heads/* va extraire toutes les branches (stockées sous heads ) dans le dépôt local et les fusionner dans des branches locales portant les mêmes noms.

Maintenant, nous allons supprimer les arguments un par un pour discuter du fonctionnement par défaut. Tout d'abord, nous pouvons supprimer la destination de notre refspec et dire simplement git pull origin branch1 . Il s'agit d'abord de fetch la branche éloignée branch1 dans votre dépôt local. Il sera disponible en tant que référence temporaire appelée FETCH_HEAD . Ensuite, il exécutera git merge FETCH_HEAD qui fusionnera cette branche avec votre branche active actuelle (i.e. HEAD ). C'est souvent le cas lorsque vous êtes dans une branche locale et que vous souhaitez récupérer les modifications d'une branche distante dans cette branche.

Maintenant, laissons tomber le branch1 et de dire simplement git pull origin . Maintenant, git sait où aller chercher ( origin ) mais ne sait pas quoi chercher. Il y a des valeurs par défaut pour cela. Le cas le plus fréquent est celui où votre fichier de configuration contient un élément branch.<name>.merge (il s'agit d'une entrée appelée merge à l'intérieur d'une section comme [branch "master"] ). Si c'est le cas, il utilisera les refspecs qui s'y trouvent pour l'opération.

Si nous abandonnons le origin complètement et simplement dire git pull il vérifiera la configuration pour voir s'il y a un fichier branch.<name>.remote qui spécifie la télécommande à utiliser. Ceci, ajouté à ce qui précède, vous indique ce qu'il faut tirer.

Les points 4 et 5 ne sont pas des cas d'utilisation normaux. Le premier a du sens si vous avez une télécommande appelée origin/master ce qui est peu probable. origin/master es généralement une référence locale qui permet de suivre l'évolution de la master sur le site distant origin . Le second essaiera de récupérer les changements sur HEAD sur l'ordinateur distant (la branche par défaut qui est généralement master ), puis les fusionner dans votre master . Bien que vous puissiez vouloir le faire régulièrement, cette commande n'est pas très conventionnelle et je ne l'ai pas souvent vue utilisée.

J'ai omis quelques détails, mais ils devraient suffire à assurer votre sécurité et votre confort dans votre travail quotidien. Pour tous les détails, vous pouvez consulter la page du manuel de git pull .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X