Ceci est principalement de la nature d'une curiosité alors que j'essaie de me familiariser avec Git. J'ai consulté la documentation de 'git fetch' mais je ne vois pas d'explication évidente pour ce qui suit. Merci d'avance et excuses si cela est tellement évident.
1) À partir d'un référentiel central, dites GitHub, je clone un référentiel nommé website
sur chacune des deux machines, HostA
et HostB
.
2) le HostA
, je modifie un fichier, disons README.txt
et le valide.
À ce stade de HostA
, les validations pour les branches master
et Origin/master
sont, comme prévu, différentes puisque je n'ai pas encore poussé
git show master
git show Origin/master
signaler différents hachages (puisque master
a la modification et que Origin/master
ne l'a pas)
3) Une fois que je pousse, ils sont après le même.
4) Maintenant, sur HostB
, si je fais ce qui suit:
git fetch
git merge FETCH_HEAD
ensuite, sur HostB, les variables master
et Origin/master
signalent le même hachage lorsqu'elles sont interrogées avec git show
MAIS
si j'avais plutôt fait, sur HostB
:
git fetch Origin master
git merge FETCH_HEAD
à ce stade, les hachages diffèrent encore.
git show Origin
git show Origin/master
rapport différent hashes
La branche de suivi Origin/master
n'est pas mise à jour tant que je n'ai pas fait un git fetch
en clair
Pourquoi est-ce?
La réponse réside dans les messages que vous recevez de git fetch
. Dans le premier cas, lorsque vous effectuez une extraction sans fournir de référence, vous constaterez que les branches de suivi à distance sont mises à jour:
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /depot
c67d1c8..1941673 master -> Origin/master
Notez que le message indique que Origin/master est mis à jour avec le maître à partir de Origin.
Maintenant, dans le second cas, où vous spécifiez refspec, vous obtenez quelque chose de tout à fait différent:
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /depot
* branch master -> FETCH_HEAD
Ainsi, lorsque vous spécifiez refspec, la branche de suivi à distance (Origine/maître) n'est PAS mise à jour, uniquement FETCH_HEAD.
Le résultat final est que vous semblerez être en avance sur Origin/master quand vous ne l'êtes pas vraiment. Je ne peux pas imaginer pourquoi ce comportement serait souhaitable, mais c’est vraiment un petit caprice intéressant de la commande fetch.
Si vous voulez avancer rapidement, fusionnez vous-même ou utilisez git pull. Vous ne semblez pas comprendre que le but de git fetch n'est PAS de mettre à jour votre arbre de travail. Fetch est destiné à mettre à jour vos branches de suivi.