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

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

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

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

5 ответов


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

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

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


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

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