Je viens d'observer quelque chose d'étrange git pull
, que je ne comprends pas.
Vendredi, j'ai travaillé dans une succursale locale. appelons-le mybranch
. Avant de quitter le bureau , je poussais à l' origine ( ce qui est mon repo github): git push origin mybranch
.
Hier à la maison, j'ai pull
installé ma branche sur mon ordinateur portable , j'ai codé davantage, puis j'ai repoussé mes modifications sur github (origine).
Maintenant, je suis à nouveau au travail et j'ai essayé d'extraire les modifications d'hier sur ma machine de travail (je n'ai rien changé dans le dépôt local de mon lieu de travail pendant le week-end):
git pull origin mybranch
cela a provoqué une fusion en avance rapide, ce qui est très bien. J'ai ensuite fait un git status
, et il a dit:
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)
Hein? Comment peut-il y avoir 6 engagements à venir alors que je ne l'ai même pas touché pendant le week-end, ET juste retiré de l'origine? J'ai donc lancé un git diff origin/mybranch
et les diffs étaient exactement les 6 changements que je viens de retirer de la télécommande.
Je ne pouvais "résoudre" cela qu'en exécutant git fetch origin
:
From [email protected]:me/project
af8be00..88b0738 mybranch -> origin/mybranch
Apparemment, il manquait des objets de référence à mon dépôt local, mais comment est-ce possible? Je veux dire, un pull fait déjà une récupération, et je n'ai travaillé sur rien d'autre que cette branche, donc un git fetch origin
et git fetch origin mybranch
devrait avoir le même résultat?
Dois-je toujours utiliser à la git pull origin
place de git pull origin branchname
?
Je suis confus.
la source
git push
semblera également le résoudre (rapporter «tout à jour»).git config --get-regexp br.*
peut vous dire si votre configuration a une branche locale qui suit une autre branchegit config branch.master.remote yourGitHubRepo.git
votre workRepo et vérifier (à la prochainegit pull origin
) si le statut reste avec un avertissement «en avance»?git remote show origin
me montre que l'origine pointe vers mon référentiel GitHub, donc ça devrait aller, je suppose?Your branch is ahead
message d'avertissement " " après agit pull
, vous devez d'abord définir également le nom distant d'une branche . D'où ma suggestion: tapezgit config branch.master.remote yourGitHubRepo.git
, puis essayez agit pull
et agit status
et voyez si le problème persiste.Réponses:
git pull
appellegit fetch
avec les paramètres appropriés avant de fusionner les têtes explicitement extraites (ou si aucune branche distante configurée pour la fusion) dans la branche actuelle.La syntaxe:
git fetch <repository> <ref>
où<ref>
est juste un nom de branche sans deux-points est une extraction "one shot" qui ne fait pas une extraction standard de toutes les branches suivies de la télécommande spécifiée, mais à la place récupère uniquement la branche nommée dansFETCH_HEAD
.Mise à jour: pour les versions de Git depuis la 1.8.4, s'il existe une branche de suivi à distance qui suit la référence que vous avez demandé de récupérer, la branche de suivi sera désormais mise à jour par
fetch
. Cette modification a été apportée spécifiquement pour éviter la confusion causée par le comportement précédent.Lorsque vous effectuez
git pull <repository> <ref>
,FETCH_HEAD
est mis à jour comme ci-dessus, puis fusionné dans votre extrait,HEAD
mais aucune des branches de suivi standard pour le référentiel distant ne sera mise à jour (Git <1.8.4). Cela signifie que localement, il semble que vous soyez en avance sur la branche distante, alors qu'en fait, vous êtes à jour avec elle.Personnellement, je fais toujours
git fetch
suivi degit merge <remote>/<branch>
parce que je peux voir les avertissements concernant les mises à jour forcées avant de fusionner, et je peux prévisualiser ce que je fusionne. Si j'utilisaisgit pull
un peu plus que moi, je ferais un simplegit pull
sans paramètres le plus du temps, en comptant surbranch.<branch>.remote
etbranch.<branch>.merge
pour «faire la bonne chose».la source
git fetch
après ungit pull <repository> <ref>
résoudre le problème puisque la récupération mettrait à jour les branches de suivi standard? Aussi, merci pour cette réponse, qui commence à avoir du sens :)git fetch
suivi degit merge origin/master master
.Qu'est-ce que les
git remote -v show
retours en termes d'origine?Si l'origine pointe vers github, le statut doit être à jour et ne doit pas être antérieur à un dépôt distant. Au moins, avec le Git1.6.5, j'utilise pour un test rapide.
Quoi qu'il en soit, pour éviter cela, définissez explicitement le dépôt distant de la branche principale:
puis a
git pull origin master
, suivi d'ungit status
devrait retourner un statut propre (pas d'avance).Pourquoi? parce que le maître d'origine get fetch (inclus dans le maître d'origine git pull) ne ferait pas que mettre à jour
FETCH_HEAD
(comme l' explique Charles Bailey dans sa réponse ), mais il mettrait également à jour la "branche principale distante" dans votre dépôt Git local.Dans ce cas, votre maître local ne semble plus être "en avance" sur le maître distant.
Je peux tester cela, avec un git1.6.5:
Je crée d'abord un workrepo:
Je simule un dépôt GitHub en créant un dépôt nu (qui peut recevoir des push de n'importe où)
J'ajoute un modif à mon repo de travail, que je pousse vers le repo github (ajouté en tant que télécommande)
Je crée un repo home, cloné de GitHub, dans lequel j'apporte quelques modifications, poussé vers GitHub:
Je clone ensuite workrepo pour une première expérience
Dans ce dépôt, git status mentionne le master geing avant '
origin
':Mais ce n'est
origin
pas github:Mais si je répète la séquence dans un dépôt qui a une origine vers github (ou aucune origine du tout, juste un 'github' distant défini), le statut est propre:
Si je n'avais que
origin
pointer surgithub
,status
serait propre pour git1.6.5.Cela peut être avec un avertissement 'avant' pour git antérieur, mais de toute façon, un
git config branch.master.remote yourGitHubRepo.git
défini explicitement devrait être capable de s'en occuper, même avec les premières versions de Git.la source
git remote show origin
.Faites-vous attention d'ajouter toute votre télécommande (sauf celle
origin
qui est fournie avec votre clone d'origine) en utilisantgit remote add NAME URL
? J'ai vu ce bogue quand ils viennent d'être ajoutés à la configuration git.la source
git checkout -b mybranch origin/mybranch
. Selon la page de manuel de git-branch, l'origine / mybranch est le point de départ, et de plus, il indique pour --track: "... Utilisez ceci si vous tirez toujours de la même branche amont vers la nouvelle branche, et si vous ne voulez pas utiliser explicitement "git pull <repository> <refspec>". Ce comportement est le comportement par défaut lorsque le point de départ est une branche distante. "