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中的一个文件名),然后这些提交合并到你的工作目录中。