QU'est-ce que FETCH HEAD in Git veut dire?

git pull --help dit:

dans son mode par défaut, git pull est raccourci pour git fetch suivi de git merge FETCH_HEAD.

Qu'est-ce que c'est FETCH_HEAD , et qu'est-ce qui est réellement fusionné pendant git pull ?

166
demandé sur Charles 2012-02-11 06:35:31

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.

168
répondu Cascabel 2012-02-11 03:18:17

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
15
répondu Jonathan Mitchell 2016-03-31 01:02:55

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!)

7
répondu user3070485 2018-01-26 10:25:35

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.

6
répondu Carsten Führmann 2017-08-07 09:36:49

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.

2
répondu manojlds 2012-02-11 02:45:03