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



我有一个从远程存储库中提取的本地存储库。运行git pullgit 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

CCD_ 8仍然执行正确的任务。但是,运行git fetch; git merge FETCH_HEAD会有不同的结果,因为FETCH_HEAD指向错误的提交。

是否存在任何可能干扰git fetch行为的设置或问题?

在没有任何选项的情况下运行git fetch将获取远程中的所有引用并将其写入.git/FETCH_HEAD文件。文件的内容通常看起来像这样:

37301df96597ac037f8e7e846fea6fc7df77bea5 branch 'master' of github.com:user/repo
593539e8a98ba5980d4b645db3b0f506bb9b6a2c not-for-merge branch 'branchOne' of github.com:user/repo

当您在.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

知道了这一点,我们可以看到,在运行git fetch之后,参考FETCH_HEAD将解析为第一行中发生的任何内容

# Assuming the already mentioned contents of .git/FETCH_HEAD
> git rev-parse FETCH_HEAD
37301df96597ac037f8e7e846fea6fc7df77bea5

似乎.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

运行git fetch(不带参数)后,如果当前本地分支(即HEAD)是跟踪分支,则FETCH_HEAD将仅包括对合并有效的引用(即未标记为不用于合并)。

解决方案是使当前分支成为跟踪分支(请参阅如何使现有Git分支跟踪远程分支?)或指定要获取的远程分支和分支(即git fetch origin branch

试着强迫你的头指向已经完成的最新提交/推送。

在您的GIT存储库中使用此:

git reset --hard HEAD@{1}

希望这能解决你的问题,把它发挥到以前的完美作用。

最新更新