QU'est-ce que FETCH HEAD in Git veut dire?
5 réponses
FETCH_HEAD
est un ref de courte durée, pour garder une trace de ce qui vient d'être récupéré du dépôt distant. git pull
invoque d'abord git fetch
, dans des cas normaux, récupérant une branche de la télécommande; FETCH_HEAD
pointe à la pointe de cette branche (elle stocke le SHA1 de la propagation, tout comme les branches). git pull
invoque alors git merge
, fusionnant FETCH_HEAD
dans la branche courante.
le résultat est exactement ce que vous attendez: le commit au la pointe de la branche distante est fusionné dans le commettre à la pointe de votre arme actuelle.
c'est un peu comme faire git fetch
sans arguments (ou git remote update
), mettre à jour toutes vos branches distantes, puis lancer git merge origin/<branch>
, mais en utilisant FETCH_HEAD
en interne à la place de se référer à n'importe quel ref simple a été récupéré, au lieu d'avoir besoin de nommer des choses.
le FETCH_HEAD est une référence à l'extrémité du dernier fetch, que ce fetch ait été lancé directement à l'aide de la commande fetch ou dans le cadre d'un pull. La valeur actuelle de FETCH_HEAD est stockée dans le dossier .git
dans un fichier nommé, vous l'avez deviné, FETCH_HEAD
.
donc si je délivre:
git fetch https://github.com/ryanmaxwell/Fragaria
FETCH_HEAD may contain
3cfda7cfdcf9fb78b44d991f8470df56723658d3 https://github.com/ryanmaxwell/Fragaria
si j'ai la prise en charge à distance configurée comme une branche de suivi à distance alors je peux suivre mon fetch avec une fusion de la branche de pistage. Si Je ne le fais pas, je peux fusionner la pointe du dernier fetch en utilisant FETCH_HEAD.
git merge FETCH_HEAD
je viens de découvrir et d'utiliser FETCH_HEAD
. Je voulais une copie locale d'un logiciel d'un serveur et j'ai fait
git fetch gitserver release_1
gitserver
est le nom de ma machine qui stocke les dépôts git.
release_1
est une étiquette pour une version du logiciel. À ma grande surprise, release_1
était alors introuvable sur ma machine locale. J'ai dû taper
git tag release_1 FETCH_HEAD
pour compléter la copie du étiqueté chaîne de commits (release_1) du dépôt distant vers le dépôt local. Fetch avait trouvé la balise distante, copié le commit sur ma machine locale, n'avait pas créé une balise locale, mais avait mis FETCH_HEAD
à la valeur du commit, pour que je puisse la trouver et l'utiliser. J'ai ensuite utilisé FETCH_HEAD
pour créer une balise locale qui correspondait à la balise de la télécommande. C'est une illustration pratique de ce qu'est FETCH_HEAD
et comment il peut être utilisé, et pourrait être utile à quelqu'un d'autre qui se demande pourquoi git fetch ne fait pas ce que vous attendez naïvement.
à mon avis, il est préférable d'éviter à cette fin et une meilleure façon d'atteindre ce que j'ai essayé de faire est
git fetch gitserver release_1:release_1
c'est à dire à chercher release_1 et de l'appeler release_1 localement. (Source: dest, voir ) https://git-scm.com/book/en/v2/Git-Internals-The-Refspec ; juste au cas où vous voudriez lui donner un nom différent!)
vous pourriez vouloir utiliser FETCH_HEAD
parfois cependant: -
git fetch gitserver bugfix1234
git cherry-pick FETCH_HEAD
pourrait être une bonne façon d'utiliser la correction de bogue numéro 1234 de votre serveur Git, et de laisser la collecte des ordures de Git pour disposer de la copie du serveur une fois que la correction a été sélectionnée sur votre branche actuelle. (Je suppose qu'il y a une propagation propre et nette contenant la totalité de la correction de bug sur le serveur!)
comme indiqué dans la réponse de Jonathan , FETCH_HEAD correspond au fichier .git/FETCH_HEAD
. Typiquement, le fichier ressemblera à ceci:
71f026561ddb57063681109aadd0de5bac26ada9 branch 'some-branch' of <remote URL>
669980e32769626587c5f3c45334fb81e5f44c34 not-for-merge branch 'some-other-branch' of <remote URL>
b858c89278ab1469c71340eef8cf38cc4ef03fed not-for-merge branch 'yet-some-other-branch' of <remote URL>
noter comment toutes les branches sauf une sont marquées not-for-merge
. Le plus étrange est la branche qui a été vérifié avant l'extraction. En résumé: FETCH_HEAD correspond essentiellement à la version distante de la branche actuellement cochée.
git pull est la combinaison d'un fetch suivi d'une fusion. Quand git fetch arrive, il note la propagation en tête de ce qu'il a récupéré dans FETCH_HEAD (juste un fichier de ce nom dans .git) Et ces révisions sont ensuite fusionnées dans votre répertoire de travail.