Что означает FETCH HEAD в 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
в текущей ветке.результат именно то, что вы ожидаете: фиксация в конце соответствующей удаленной ветви объединяется в фиксацию на кончике текущей ветви.
это немного похоже на то, чтобы делать
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 по существу соответствует удаленной версии ветви, которая в настоящее время извлечена.