Git中的FETCH_HEAD是什么意思?
git pull --help
说:
在默认模式下,git pull是git fetch的缩写,然后是git merge FETCH_HEAD。
这是什么FETCH_HEAD
,在git pull
期间实际上合并了什么?
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
内部使用FETCH_HEAD
来引用任何单个的ref,而不需要命名的东西。
FETCH_HEAD是对最后一次读取的提示的引用,无论该提取是直接使用获取命令还是作为拉的一部分发起的。 FETCH_HEAD的当前值存储在.git
文件夹中的一个名为FETCH_HEAD
。
所以,如果我发出:
git fetch https://github.com/ryanmaxwell/Fragaria
FETCH_HEAD可能包含
3cfda7cfdcf9fb78b44d991f8470df56723658d3 https://github.com/ryanmaxwell/Fragaria
如果我将远程回购configuration为远程跟踪分支,那么我可以跟踪我的跟踪分支的合并提取。 如果我不这样做,我可以直接使用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_HEAD是什么以及如何使用它的一个实际的例子,可能对其他人想知道为什么git fetch没有做你会天真地期望的。
正如Jonathan的回答中所提到的 ,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发生时,它logging了它在FETCH_HEAD中提取的头部提交(只是在.git中的一个文件名),然后这些提交合并到你的工作目录中。