web-dev-qa-db-fra.com

git fetch vs git fetch Le maître d'origine a des effets différents sur la branche de suivi

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?

22
Xoanon93

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.

0
Ethan Brown

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.

0
UpAndAdam