"git fetch"后FETCH_HEAD引用未正确更新

Lop*_*Sae 8 git fetch

我有一个从远程存储库中提取的本地存储库.运行git pull以及git fetch; git merge FETCH_HEAD用于执行完全相同的操作,如以下描述git pull所预期:

描述

将来自远程存储库的更改合并到当前分支中.在默认模式下,git pull是git fetch的简写,后跟git merge FETCH_HEAD.

目前,出乎意料地,运行正确地git fetch停止更新FETCH_HEAD引用.FETCH_HEAD现在仍然坚持旧的提交.运行git fetch会将所有更改下载到远程跟踪的分支,但FETCH_HEAD保持不变,无论其运行的分支如何.

# currently in branchone
> git fetch

# branchone is up to date since...
> git rev-parse branchone
593539e8a98ba5980d4b645db3b0f506bb9b6a2c

# ...its in the same commit as the remote branch
> git rev-parse origin/branchone
593539e8a98ba5980d4b645db3b0f506bb9b6a2c

# however FETCH_HEAD shows something different
> git rev-parse FETCH_HEAD
37301df96597ac037f8e7e846fea6fc7df77bea5
Run Code Online (Sandbox Code Playgroud)

git pull仍然执行正确的任务.但是,git fetch; git merge FETCH_HEAD由于FETCH_HEAD指向错误的提交,因此运行将执行不同的操作.

是否存在可能导致git fetch行为混乱的设置或问题?

Lop*_*Sae 10

git fetch没有任何选项的情况下运行将获取远程控制器中的所有引用并将它们写入.git/FETCH_HEAD文件.usualy文件的内容看起来像这样:

37301df96597ac037f8e7e846fea6fc7df77bea5 branch 'master' of github.com:user/repo
593539e8a98ba5980d4b645db3b0f506bb9b6a2c not-for-merge branch 'branchOne' of github.com:user/repo
Run Code Online (Sandbox Code Playgroud)

如果在.git目录下有这样的文件,只要该文件中的第一个内容是40个字符的十六进制数,或者实际上与现有提交匹配的较短十六进制数,就可以将其用作引用.

# This file can be used as a reference
> cat .git/MAGIC_HEAD
deadbeefdeadbeefdeadbeefdeadbeefdeadbeef lorem ipsum
the rest does not really matter
refrigerator

# And thus it will be interpreted by many git commands like this
> git rev-parse MAGIC_HEAD
deadbeefdeadbeefdeadbeefdeadbeefdeadbeef
Run Code Online (Sandbox Code Playgroud)

知道了这一点,我们可以看到在运行git fetch引用FETCH_HEAD后将解析为第一行中发生的任何事情

# Assuming the already mentioned contents of .git/FETCH_HEAD
> git rev-parse FETCH_HEAD
37301df96597ac037f8e7e846fea6fc7df77bea5
Run Code Online (Sandbox Code Playgroud)

似乎内容的顺序.git/FETCH_HEAD不保证首先包含当前分支的引用.

通过在不同的存储库中尝试它,似乎在某些第一行始终是当前分支,因此git fetch; git merge FETCH_HEAD按预期工作.但是在其他存储库中,内容.git/FETCH_HEAD将以不同的顺序排序,并且通常第一行将是对不同分支的远程提交的FETCH_HEAD引用,从而使引用不正确.

为什么它表现不同对我来说是一个谜.

作为解决方案,如果git fetch remote_name branch_name仅使用此特定分支,则仅在内容中显示该单行.git/FETCH_HEAD,使FETCH_HEAD引用始终正确.

# Will only fetch branchone
> git fetch origin branchone

# FETCH_HEAD will contain only a single line
> cat .git/FETCH_HEAD
593539e8a98ba5980d4b645db3b0f506bb9b6a2c branch 'branchOne' of github.com:user/repo
Run Code Online (Sandbox Code Playgroud)