Что означает FETCH HEAD в Git?


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

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

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

5 166

5 ответов:

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

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

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

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

так что если я выдам:

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

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

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

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

git merge FETCH_HEAD

я только что обнаружил и использовал 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, чтобы избавиться от копии с сервера, как только исправление было выбрано на вашей текущей ветке. (Я предполагаю, что есть хороший чистый помеченный коммит, содержащий все исправления ошибок на сервере!)

как говорится в Джонатан!--5-->, 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 по существу соответствует удаленной версии ветви, которая в настоящее время извлечена.

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