9

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

git pull仍然执行正确的任务。然而,运行git fetch; git merge FETCH_HEAD会做一些不同的事情,因为FETCH_HEAD指向不正确的提交。

是否有任何设置或问题可能会git fetch影响行为?

4

3 回答 3

12

不带任何选项运行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引用不正确。

为什么它的行为不同对我来说是个谜。

作为一种解决方案, ifgit 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
于 2012-10-31T23:45:58.240 回答
0

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

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

git reset --hard HEAD@{1}

希望这可以解决您的问题,使其达到以前可以正常工作的程度。

于 2012-07-16T11:36:46.037 回答
0

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

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

于 2014-03-29T03:06:15.397 回答