40 votes

Git pull origin master ne met pas à jour origin/master?

According to the documentation, git pull effectue un git fetch puis un git merge, cependant dans ce cas effectuer git pull origin master devrait effectuer un git fetch origin master non? Cependant, il ne semble pas le faire. Voici un exemple.

Supposons que mon origin remote master (sur GitHub dans mon cas) ait l'historique suivant :

commit 1111111 : mon premier commit
commit 2222222 : un commit de quelqu'un d'autre

et que je n'ai que mon premier commit en local comme le montre ce qui suit

git checkout master
git log --pretty=format:'%h' -n 1
1111111

git checkout origin/master
git log --pretty=format:'%h' -n 1
1111111

À partir de là, je fais mon pull et regarde les résultats comme suit :

git checkout master
git pull origin master

git log --pretty=format:'%h' -n 1
2222222

git checkout origin/master
git log --pretty=format:'%h' -n 1
1111111

Comme on peut le voir, le pull a effectivement mis à jour ma branche master avec le(s) nouveau(x) commit(s) de l'origin remote, mais mon origin/master local est toujours là où il était. Ce qui me force à faire ce qui suit

git fetch origin master

git checkout origin/master
git log --pretty=format:'%h' -n 1
2222222

Est-ce le comportement correct pour git pull ou aurais-je mal configuré quelque chose ? J'ai parcouru la page de manuel de git pull et je n'ai rien vu qui suggère cela mais j'aurais pu le manquer.

0 votes

Voir si cela vous aide à comprendre. stackoverflow.com/questions/2452226/… ou celui-ci stackoverflow.com/questions/2883840/…

0 votes

Vous voudrez peut-être envisager de faire git fetch suivi de git merge. Vous finirez généralement avec moins de surprises et aurez plus de contrôle sur la manière de fusionner.

31voto

Jefromi Points 127932

C'est un peu bizarre, mais si vous utilisez git pull [remote] , il ne met en fait pas à jour les références distantes. Cela a un sens si vous y réfléchissez d'une certaine manière : puisque vous spécifiez une référence spécifique à récupérer, il n'a pas besoin de rechercher des informations sur vos branches distantes, donc il ne sait pas intrinsèquement quelle branche distante il devrait mettre à jour. Bien sûr, il pourrait le deviner, et je ne serais pas surpris si cela était corrigé à terme, mais c'est le comportement actuel. (Il peut y avoir des messages sur la liste de diffusion à ce sujet - je ne sais pas.)

Vous pouvez facilement contourner cela. Si vous utilisez git pull origin/master, puisque vous spécifiez ce qu'il faut récupérer via une branche distante, il devrait mettre à jour cette branche distante. Et si vous êtes déjà sur votre branche master (ou toute autre branche suivant origin/master), vous pouvez simplement faire git pull et laisser les valeurs par défaut se remplir, et il mettra à jour les branches distantes.

Cela est documenté dans la page de manuel de git-pull, de manière concise sous EXEMPLES mais aussi ailleurs. La partie pertinente :

Fusionner dans la branche actuelle la branche distante next :

$ git pull origin next

Cela laisse une copie de next temporairement dans FETCH_HEAD, mais ne met pas à jour les branches de suivi distantes. En utilisant des branches de suivi distantes, la même opération peut être effectuée en invoquant fetch et merge :

$ git fetch origin
$ git merge origin/next

0 votes

C'est enfoui quelque part dans la page de manuel git-pull, je pense. Je vais essayer de le retrouver plus tard si je m'en souviens.

0 votes

@KennethBaltrinic: C'est dans la section des exemples, et peut être déduit du reste de la documentation également.

4 votes

Le contournement ne semble pas fonctionner pour moi : git pull --rebase origin/master dit que origin/master n'est pas un dépôt distant. Et git pull --rebase origin origin/master n'a pas pu trouver git pull --rebase origin/master.

1voto

John Drinane Points 139

J'ai également rencontré ce problème - j'ai exécuté "git pull" alors que j'étais sur une branche, puis j'ai vérifié le journal et il n'avait pas été mis à jour. Confus, j'ai en fait lu le résultat de git pull et il mentionne spécifiquement que vous devez indiquer à git où fusionner et cela se fait par une commande du type "git pull [remote] [branche locale]" c'est-à-dire pour moi c'était "git pull origin newfeature1".

Première tentative de commande avec problème :

Z:\Abusers\jd\repo1> git pull
remote: Enumerating objects: 15, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 16 (delta 7), reused 15 (delta 7), pack-reused 1
Unpacking objects: 100% (16/16), done.
From github.abc.com:group1/repo1
   06aefba..e5ed6ee  develop    -> origin/develop
   af689cb..b8667a6  newfeature1-> origin/newfeature1
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull  

If you wish to set tracking information for this branch you can do so with:

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

Commande fonctionnelle :

Z:\Abusers\jd\repo1> git pull origin newfeature1
From github.abc.com:group1/repo1
* branch            newfeature1-> FETCH_HEAD
Updating af689cb..b8667a6
Fast-forward
.../file1.py                |   2 +-
abc/yes1/cool1.a        | Bin 0 -> 106329 bytes
.../abc.py                    |   7 ++++---
3 files changed, 5 insertions(+), 4 deletions(-)
create mode 100644 abc/yes1/cool1.a

0voto

Nishant Ranjan Points 21

Il semble que vous avez bifurqué le dépôt et que votre branche bifurquée n'est pas mise à jour avec le dernier code

0voto

Kikaxa Points 147

Si vous exécutez pull à partir de quelque chose d'autre que origin par exemple,

git pull  ...

Même si l'URL est en réalité le même référentiel/URL que origin, git ne mettra pas à jour les branches de suivi à distance pour le dépôt distant origin - essentiellement un "conteneur" de dépôt par défaut qui n'est pas lié à l'arborescence de travail dans cette invocation de git.

Pour corriger cela, vous devriez ajouter la correspondance (refspec) entre le dépôt distant<->local (origin) qui est par défaut +refs/heads/*:refs/remotes/origin/*:

git pull  +refs/heads/*:refs/remotes/origin/*

-1voto

Gentle Points 134

J'ai essayé toutes les solutions possibles que j'ai pu trouver sur stackoverflow mais rien n'a fonctionné pour moi jusqu'à ce que j'essaie simplement ceci et cela a fonctionné comme par magie.

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