Что означает FETCH_HEAD в Git? - PullRequest
185 голосов
/ 11 февраля 2012

git pull --help говорит:

В режиме по умолчанию git pull является сокращением для git fetch, за которым следует git merge FETCH_HEAD.

Что это за FETCH_HEAD, и что на самом деле объединяется во время git pull?

Ответы [ 5 ]

185 голосов
/ 11 февраля 2012

FETCH_HEAD - недолговечный реф, чтобы отследить то, что только что было получено из удаленного репозитория. git pull сначала вызывает git fetch, в обычных случаях выбирая ветку с пульта; FETCH_HEAD указывает на верхушку этой ветви (она хранит SHA1 коммита, как это делают ветви). git pull затем вызывает git merge, сливая FETCH_HEAD в текущую ветвь.

Результат - именно то, что вы ожидаете: фиксация на конце соответствующей удаленной ветви объединяется с фиксацией на конце вашей текущей ветви.

Это немного похоже на выполнение git fetch без аргументов (или git remote update), обновление всех ваших удаленных веток, затем запуск git merge origin/<branch>, но вместо этого использование FETCH_HEAD для ссылки на любой выбранный ref вместо этого. необходимости называть вещи.

14 голосов
/ 10 декабря 2012

FETCH_HEAD является ссылкой на подсказку последней выборки, независимо от того, была ли эта выборка инициирована непосредственно с помощью команды выборки или как часть извлечения. Текущее значение FETCH_HEAD хранится в папке .git в файле с именем, как вы уже догадались, FETCH_HEAD.

Так что, если я выпущу:

git fetch https://github.com/ryanmaxwell/Fragaria

FETCH_HEAD может содержать

3cfda7cfdcf9fb78b44d991f8470df56723658d3        https://github.com/ryanmaxwell/Fragaria

Если у меня удаленное репо, настроенное как удаленная ветвь отслеживания, тогда я могу проследить за моим извлечением слиянием ветви отслеживания. Если я не могу, я могу объединить кончик последней выборки напрямую, используя FETCH_HEAD.

git merge FETCH_HEAD
9 голосов
/ 07 августа 2017

Как уже упоминалось в ответ Джонатана , FETCH_HEAD соответствует файлу .git/FETCH_HEAD. Как правило, файл будет выглядеть так:

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>

Обратите внимание, как помечены все ветви, кроме одной not-for-merge. Нечетным является ветвь, которая была извлечена до извлечения. В итоге: FETCH_HEAD по существу соответствует удаленной версии ветви, которая в данный момент извлечена.

8 голосов
/ 08 сентября 2014

Я только что открыл и использовал FETCH_HEAD.Я хотел получить локальную копию некоторого программного обеспечения с сервера, и я сделал

git fetch gitserver release_1

gitserver - это имя моей машины, на которой хранятся git-репозитории.release_1 - это тег для версии программного обеспечения.К моему удивлению, release_1 тогда нигде не было видно на моей локальной машине.Мне пришлось набрать

 git tag release_1 FETCH_HEAD 

, чтобы завершить копирование цепочки коммитов с тегами (release_1) из удаленного хранилища в локальное.Fetch нашел удаленный тег, скопировал коммит на мой локальный компьютер, не создал локальный тег, но установил FETCH_HEAD в значение коммита, чтобы я мог найти и использовать его.Затем я использовал FETCH_HEAD для создания локального тега, который соответствовал тегу на пульте.Это практическая иллюстрация того, что такое FETCH_HEAD и как его можно использовать, и это может быть полезно для кого-то еще, задающегося вопросом, почему git fetch не делает то, что вы наивно ожидаете.

На мой взгляд, это такЛучше всего избегать для этой цели, и лучший способ добиться того, что я пытался сделать, это

git fetch gitserver release_1:release_1

, то есть получить release_1 и вызвать его release_1 локально.(Это источник: dest, см. https://git -scm.com / book / en / v2 / Git-Internals-The-Refspec ; на всякий случай, если вы хотите дать ему другое имя!)

Вы можете использовать FETCH_HEAD время от времени, хотя: -

git fetch gitserver bugfix1234
git cherry-pick FETCH_HEAD

может быть хорошим способом использования исправления с номером 1234 с вашего сервера Git и выхода из сборки мусора Gitизбавиться от копии с сервера после того, как исправление было выбрано в текущей ветке.(Я предполагаю, что на сервере есть хороший чистый коммит с тегами, содержащий все исправления ошибок!)

3 голосов
/ 11 февраля 2012

git pull - это комбинация выборки, за которой следует слияние. Когда происходит git fetch, он записывает главный коммит того, что он выбрал в FETCH_HEAD (просто файл с таким именем в .git), и эти коммиты затем объединяются в ваш рабочий каталог.

...