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