Что означает FETCH_HEAD в Git?

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

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

Что это за FETCH_HEAD, и что фактически слилось во время git pull?

Ответ 1

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 был выбран необходимости называть вещи.

Ответ 2

FETCH_HEAD является ссылкой на конец последней выборки, независимо от того, была ли эта выборка инициирована непосредственно с помощью команды извлечения или как часть pull. Текущее значение 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

Ответ 3

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

git fetch gitserver release_1

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

 git tag release_1 FETCH_HEAD 

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

Ответ 4

Как упоминалось в Jonathan answer, 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 в основном соответствует удаленной версии ветки, которая в настоящее время проверена.

Ответ 5

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