'git pull origin mybranch" les feuilles locales mybranch N engage en avant de l'origine. Pourquoi?
J'ai juste observé quelque chose d'étrange à propos de git pull
, dont je ne comprends pas.
Vendredi, j'ai travaillé sur une branche locale. appelons ça de la mybranch
. Avant de quitter le bureau je l'ai poussé à l'origine (ce qui est mon dépôt github): git push origin mybranch
.
Hier à la maison, je pull
ed mybranch à mon ordinateur portable, fait un peu plus de codage, et ensuite poussé mes modifications sur github (origine).
Maintenant, je suis au travail, encore une fois, et a essayé de tirer les changements d'hier à ma machine de travail (je n'ai rien changé à mon lieu de travail locale de pensions de titres sur le week-end):
git pull origin mybranch
qui a provoqué une avance rapide de fusion, ce qui est bien. J'ai ensuite fait une git status
, et il dit:
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)
Hein? Comment peut-il être 6 s'engage à l'avance quand je n'ai même pas le toucher pendant le week-end, ET juste tiré de l'origine? Alors j'ai couru un git diff origin/mybranch
et les diffs sont exactement les 6 changements que j'ai juste tiré de la télécommande.
J'ai seulement pu "réparer" cela en exécutant git fetch origin
:
From [email protected]:me/project
af8be00..88b0738 mybranch -> origin/mybranch
Apparemment, mon local repo manquait certains objets de référence, mais comment peut-il être? Je veux dire, un pull fait un fetch déjà, et je n'ai pas de travailler sur quoi que ce soit à l'exception de la branche, de sorte qu'un git fetch origin
et git fetch origin mybranch
devrait avoir le même résultat?
Dois-je toujours utiliser git pull origin
au lieu de git pull origin branchname
?
Je suis confus.
- J'ai remarqué cela aussi, mais une
git push
également semblent pour le résoudre (reporting "à jour"). git config --get-regexp br.*
peut vous dire si votre config a une section locale est suivi d'une autre branche- Pouvez-vous type
git config branch.master.remote yourGitHubRepo.git
dans votre workRepo et de vérifier (à la prochainegit pull origin
) si l'état reste avec un "avant" d'avertissement? - ce n'est pas définie (à vide de sortie). mais
git remote show origin
me montre que les points d'origine de mon dépôt GitHub, donc ça devrait être bon, je suppose? - git remote seul (montrant la bonne adresse pour le dépôt GitHub) n'est pas assez. Pour éviter d'avoir un "
Your branch is ahead
le message d'avertissement" après unegit pull
, vous devez également permet de définir la distance de nom pour une branche. D'où ma suggestion: typegit config branch.master.remote yourGitHubRepo.git
, alors essayez ungit pull
et ungit status
et voir si le problème demeure. - Je vois, merci! Je vais essayer ça dès que possible (il n'y a rien de pousser ou de tirer ATM) et vous permettent de savoir si cela a fonctionné.
- merci copain, vous juste m'a aidé git débarrasser de ma branche est en avance d'erreur! +1
Vous devez vous connecter pour publier un commentaire.
git pull
appelsgit fetch
avec les paramètres appropriés avant de les fusionner de façon explicite extraites tête (ou si aucune succursale à distance configuré pour se fondre dans la branche courante.La syntaxe:
git fetch <repository> <ref>
où<ref>
est juste un nom de branche sans côlon est un "one shot" fetch n'est pas un standard d'extraction de toutes les marques de branches de la distance, mais au lieu récupère juste le nom de la branche dansFETCH_HEAD
.Mise à jour: pour Git les versions depuis la version 1.8.4, si il y a un suivi à distance de la branche qui suit la ref que vous avez demandé à récupérer, puis le suivi de la branche sera désormais mis à jour par
fetch
. Ce changement a été fait spécialement pour éviter la confusion que le comportement précédent causé.Lorsque vous effectuez
git pull <repository> <ref>
,FETCH_HEAD
est mis à jour comme ci-dessus, puis fusionnées dans votre vérifiéHEAD
mais aucun standard de suivi des branches pour le dépôt distant sera mis à jour (Git <1.8.4). Cela signifie que, localement, il semble comme vous êtes en avance de la branche distante, alors qu'en fait vous êtes à jour avec elle.Personnellement je fais toujours
git fetch
suivie pargit merge <remote>/<branch>
parce que j'arrive à voir tous les avertissements concernant forcé les mises à jour avant que je les fusionner, et je peux aperçu de ce que je suis en fusion. Si j'ai utiliségit pull
un peu plus que moi, je ferais une plainegit pull
sans paramètres, la plupart du temps, en s'appuyant surbranch.<branch>.remote
etbranch.<branch>.merge
de "faire la bonne chose".git fetch
après ungit pull <repository> <ref>
résoudre le problème depuis l'extraction permettrait de mettre à jour la norme de suivi des branches? Aussi, merci pour cette réponse, qui commencent à faire sens 🙂git fetch
suivie pargit merge origin/master master
.Ce n'
git remote -v show
retourne quand il s'agit à l'origine?Si l'origine des points de github, l'état doit être à jour, et pas à l'avance de toutes les pensions. Au moins, avec le Git1.6.5-je suis à l'aide d'un test rapide.
De toute façon, pour éviter cela, définir explicitement la distance résultant de pensions de la branche master:
puis un
git pull origin master
, suivie par unegit status
doit retourner un statut de mise à jour (pas avant).Pourquoi? parce que le obtenir fetch origin master (inclus dans le git pull origin master) ne serait pas juste de mettre à jour
FETCH_HEAD
(comme Charles Bailey explique dans sa réponse), mais il serait aussi mise à jour de la "distance branche master" au sein de votre dépôt Git local.Dans ce cas, votre maître local, ne semble pas plus "en avance" de la télécommande maître.
Je peux tester ce, avec un git1.6.5:
Je crée d'abord un workrepo:
Je simule un dépôt GitHub par la création d'un nu de pensions de titres (dont une pouvant recevoir des push à partir de n'importe où)
- Je ajouter une modif de mon travail repo, que j'ai poussé de dépôt github (ajouté à distance)
- Je créer une maison repo, cloné de GitHub, dans lequel je fais quelques modifications, poussé vers GitHub:
Je puis clone workrepo pour une première expérience
Dans ce repo, git status, fait mention de master geing à l'avance de"
origin
':Mais c'est seulement
origin
n'est pas github:Mais si je répète la séquence dans une pension qui a une origine à github (ou pas d'origine du tout, juste une distance "github" défini), le statut est propre:
Si seulement j'avais
origin
pointant surgithub
,status
serait propre pour git1.6.5.C'est peut-être avec un "avant" alerte tôt git, mais de toute façon, un
git config branch.master.remote yourGitHubRepo.git
définie de manière explicite devrait être en mesure de prendre soin de ce que, même avec les premières versions de Git.git remote show origin
.Êtes-vous soin d'ajouter tous de votre télécommande (sauf
origin
qui est livré avec votre clone d'origine) à l'aide degit remote add NAME URL
? J'ai vu ce bug alors qu'ils ont simplement été ajoutés à la commande git config.git checkout -b mybranch origin/mybranch
. Selon la page de man de git-branche, de l'origine/mybranch est le point de départ, et de plus, il stipule pour --piste: "... à Utiliser si vous tirez toujours de la même amont de la branche dans la nouvelle branche, et si vous ne voulez pas utilisez "git pull <référentiel> <refspec>" explicitement. Ce comportement est celui par défaut lorsque le point de départ est une branche distante."