git fetch - Git中的FETCH_HEAD是什么意思?

FETCH_HEAD说:

在默认模式下,git pull是git fetch的简写,后跟git merge FETCH_HEAD。

这是什么FETCH_HEAD,以及git pull中实际合并的内容是什么?

Misha Moroshko asked 2019-04-23T01:40:11Z
5个解决方案
172 votes

git fetch是一个短命的引用,用于跟踪刚从远程存储库中获取的内容。 git remote update首先调用git merge origin/<branch>,正常情况下从远程获取分支; FETCH_HEAD指向此分支的提示(它存储提交的SHA1,就像分支一样)。 git pull然后调用git merge,将FETCH_HEAD合并到当前分支中。

结果正是您所期望的:适当远程分支顶端的提交将合并到当前分支顶端的提交中。

这有点像做git fetch没有参数(或git remote update),更新所有远程分支,然后运行git merge origin/<branch>,但在内部使用FETCH_HEAD代替引用任何单个引用,而不是需要命名的东西。

Cascabel answered 2019-04-23T01:40:39Z
15 votes

FETCH_HEAD是对最后一次提取的提示的引用,无论该提取是使用fetch命令直接启动还是作为pull的一部分启动。 FETCH_HEAD的当前值存储在名为FETCH_HEAD的文件中的.git文件夹中。

所以,如果我发出:

git fetch https://github.com/ryanmaxwell/Fragaria

FETCH_HEAD可能包含

3cfda7cfdcf9fb78b44d991f8470df56723658d3        https://github.com/ryanmaxwell/Fragaria

如果我将远程仓库配置为远程跟踪分支,那么我可以通过合并跟踪分支来跟踪我的提取。 如果我不这样做,我可以直接使用FETCH_HEAD合并最后一次获取的提示。

git merge FETCH_HEAD
Jonathan Mitchell answered 2019-04-23T01:41:26Z
7 votes

我刚刚发现并使用了FETCH_HEAD.我想从服务器获取一些软件的本地副本,我做了

git fetch gitserver release_1

FETCH_HEAD是存储git存储库的我的机器的名称。FETCH_HEAD是该软件版本的标记。 令我惊讶的是,FETCH_HEAD在我的本地机器上无处可寻。 我不得不打字

 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

可能是一个使用Git服务器中的错误修复号1234的好方法,并且一旦将修复程序挑选到当前分支上,就让Git的垃圾收集器从服务器处理副本。 (我假设有一个很好的干净标记提交,包含服务器上的整个错误修复!)

user3070485 answered 2019-04-23T01:42:37Z
6 votes

正如Jonathan的回答中提到的,FETCH_HEAD对应于文件not-for-merge.通常,文件将如下所示:

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基本上对应于当前检出的分支的远程版本。

Carsten Führmann answered 2019-04-23T01:43:12Z
2 votes

git pull是一个fetch后跟一个合并的组合。 当git fetch发生时,它会记录它在FETCH_HEAD中获取的内容的提交(只是.git中该名称的文件)然后这些提交将合并到您的工作目录中。

manojlds answered 2019-04-23T01:43:40Z
translate from https://stackoverflow.com:/questions/9237348/what-does-fetch-head-in-git-mean