我有一个从远程存储库中提取的本地存储库。运行git pull
以及git fetch; git merge FETCH_HEAD
用于执行完全相同的操作,正如description of 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
git pull
仍然执行正确的任务。但是,由于git fetch; git merge FETCH_HEAD
指向不正确的提交,因此运行FETCH_HEAD
将执行不同的操作。
是否存在任何可能导致git fetch
行为混乱的设置或问题?
答案 0 :(得分: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
如果在.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
引用始终正确。< / p>
# 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
答案 1 :(得分:0)
试着强迫你的头指向已经完成的最新提交/推送。
在您的GIT存储库中使用它:
git reset --hard HEAD@{1}
希望这可以解决你的问题,把它带到以前完美运作的地步。
答案 2 :(得分:0)
运行git fetch
(不带参数)后,FETCH_HEAD
将只包含一个对合并有效的引用(即未标记为非合并),如果是当前本地分支(即{{1} }})是一个跟踪分支。
解决方案是使当前分支成为跟踪分支(请参阅How do you make an existing Git branch track a remote branch?)或指定要获取的远程分支(即HEAD