tirez seule repo "git status" en disant la branche est en avance sur origin/master. Pourquoi?

alors voici la situation:

$ git status

# Sur la branche master

# Votre branche est en avance sur' origin/master ' par [x] commits.

#

Il ya plusieurs questions à ce sujet sur SO déjà, mais aucun ne semble aborder spécifiquement le type de scénario que j'ai. cette réponse à l'une des questions vient plus proche, mais ne pas entrer dans les détails.

je vais juste le citer mot pour mot:

si vous recevez ce message après avoir fait un" git pull remote branch", essayez de le suivre avec un"git fetch".

Fetch semble mettre à jour la représentation locale de la branche distante, ce qui ne se produit pas nécessairement lorsque vous faites une "branche distante git pull".

cette astuce fonctionne en effet. Mais "ne pas forcément?"Pourquoi pas? J'ai besoin de comprendre cela. Qu'est-ce que pull ne fait pas?

Je ne veux pas répondre à cette question, alors voici mon scénario en détail:

trois ordinateurs impliqués. Le Mac sur lequel je développe, mon serveur maison où vit le git repo (i.e. origin/master) et un compte Webfaction qui sort de ce serveur.

je ne commet et git push origin master uniquement sur le Mac. La seule commande jamais exécutée Webfaction dans le cadre du flux de travail normal est git pull origin master (dans le cadre d'un script de déploiement de tissu). Je n'ai pas modifier le code. Je suis un promoteur isolé, donc personne d'autre.

de temps en temps je me connecte à Webfaction et je vérifie des choses, y compris un git status . Inévitablement, je reçois toujours le "votre branche est en avance..." message. En lançant git fetch , le message disparaît.

je suis sur le point d'ajouter git fetch au script de tissu à faire avec cette question, mais je veux savoir pourquoi cela doit être fait, en particulier sur un clone pull-only d'origine/master. Je ne suis pas profondément versé en Git bien que j'utilise la fonctionnalité de base tous les jours, de sorte qu'une explication débutants-amical serait apprécié.

mise à Jour comme demandé, les bits de config :

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = [email protected][server_address]:[path/to/repo.git]
[branch "master"]
    remote = origin
    merge = refs/heads/master
10
demandé sur Community 2011-09-09 21:43:12
la source

4 ответов

Ok, donc dès le début, vous faites tout correctement. Je pense que le commentaire que vous avez ajouté précédemment est une assez bonne explication:

dans les termes les plus simples, "git pull" fait un "git fetch" suivi d'un "git merge "

C'est ce que je pense. Donc, vous ne devriez pas avoir à appeler un git fetch après un git pull - mais, je peux presque vous garantir, cela fonctionne parfaitement bien sur n'importe quoi Sauf la branche master .

dans l'un des messages liés, il a dit de supprimer la ligne suivante:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/* <--- Remove this

Et il devrait corriger ce problème, cependant, je ne peux pas expliquer pourquoi cela fonctionne. C'est très difficile de faire des recherches, mais je pense que quand vous appelez fetch , votre configuration git spécifie exactement ce qu'il faut saisir. Quand vous lancez pull , Je ne suis pas sûr qu'il pense que le master est synchronisé.

je peux vous garantir que si vous faisiez cela à partir d'une autre branche non-maître, vous ne verriez pas ce problème. Avec un peu de chance, l'un des gourous git pourra expliquer en détail la ligne fetch dans config.

de plus, je recommande d'exécuter la commande suivante à la place qui positionne la tête pour le dépôt distant pour s'assurer qu'il est bien synchronisé avec votre commande locale: git push -u origin master


En voici un autre question intéressante:

Avoir du mal à comprendre git-fetch


Ok, donc j'ai testé ceci sur un de mes workflows et j'ai trouvé ce qui suit.

lorsque vous exécutez un git pull origin master sur votre serveur distant, il y a un fichier dans le répertoire .git/ qui renvoie où se trouve votre tête. Deux fichiers à noter:

ORIG_HEAD

FETCH_HEAD

vous remarquerez que votre FETCH_HEAD est correct, mais le ORIG_HEAD montre l'ancien commit, d'où la raison pour laquelle vous recevez le Ahead by x . Lorsque vous lancez git fetch , vous corrigerez la référence dans ORIG_HEAD et tout sera rentré dans l'ordre. Je cherche comment changer la ligne fetch dans la configuration pour corriger ce comportement.

9
répondu Nic 2017-05-23 15:33:32
la source

si vous lancez un git pull origin au lieu d'un git pull origin master , il n'y aura pas de problème avec le message Your branch is ahead of 'origin/master' by ... commits. .

5
répondu tomvodi 2013-09-15 10:33:13
la source

voir la question: Quelle est la différence entre "git pull" et "git fetch"?

AFAIK a git pull regardera la branche sur l'origine et tirer vers le bas les changements. Mais l'index local de la branche n'est pas à jour. git fetch mettra à jour l'index de la branche pour qu'elle comprenne ce qui devrait y être. (en gros, ce qui a été mentionné dans la réponse à laquelle vous avez fait référence)

je fais toujours un git fetch avant un git pull. Vraiment je fais un git fetch chaque fois que je vais faire quelque chose avec des branches éloignées.

Également liée à la question ci-dessus est très bonne description de git fetch, de traction et de fusion. http://longair.net/blog/2009/04/16/git-fetch-and-merge/

1
répondu jhanifen 2017-05-23 15:24:19
la source

dans mon cas - j'avais deux branches à L'origine et chaque fois que j'ai tiré une git tirer il a montré que j'étais en avance de l'origine/maître par X. Même après l'avoir réinitialisé à l'origine / master comme indiqué dans réinitialisez la branche dépôt local pour être exactement comme la tête de dépôt à distance .

la solution s'est produite quand j'ai simplement lancé git fetch et il a apporté ma branche de développement sur mon serveur de production.

0
répondu Ulad Kasach 2017-05-23 15:33:32
la source

Autres questions sur git branch git-push git-pull git-fetch