分支之间的Git引用冲突(无法更新本地分支)

19

当我尝试执行git fetch命令获取远程分支时,遇到以下错误:

错误:参考 refs/origin/remotes/my-branch 处于some-hash,但期望是another-hash 来自 github.com:my-repository ! some-hash my-branch -> origin/my-branch (无法更新本地引用)

我不知道出了什么问题。有什么解释吗?


有人(也许是你自己)强制推送了修改过的历史记录到远程代码库吗? - Shahbaz
1
沿着同样的线路,你可以查看 git log --pretty=oneline origin/my-branch 来查看你自己存储库中的历史记录,然后在 GitHub 中查看历史记录。如果它们不匹配,则意味着历史记录已被您或其他人强制更改。那是不好的,更改历史记录的人是不好的。 - Shahbaz
1
有人搞砸了。在你工作的地方,Git 相关的问题经常发生吗?如果是这样,请问:我们需要 Git 的好处吗?如果是,请问:我们愿意花时间让每个人接受培训吗?如果对此回答是否定的,或者之前的问题也是否定的,那么你的启示会自然而然地到来。 - Yimin Rong
我找到了谁搞砸了它。 - Alan R. Soares
我在 SourceTree 中看到了这个错误,所以立即跑去 StackOverflow。在阅读了上面的答案(毫无疑问都是正确的)之后,我回到了 SourceTree,只是再次按下了“Pull”按钮。一切正常。Git 的小精灵们。今天早上它们有点慢。 - Tom Auger
4个回答

28

我已找到这个错误的原因:

有人创建了另一个同名但大小写不同的分支。

发生了什么?

Windows版Git不区分大小写。因此,事情变得很糟糕!Git无法区分它们,误将每个分支的哈希值弄混。

解决方案:

直接从根源上解决问题。删除错误的远程分支,一切就像以前一样顺畅了。


1
这个,我的团队领导刚刚用Develop和develop分支把我们搞崩了!! - Hai Hoang

25

对于其他谷歌员工来说,如果你们到这儿了:这也是另一种不那么激进的方法

导航到 .git\refs\remotes\origin 目录 - 删除 master 文件,

然后再执行 git pull 命令,它就能成功同步了。


我知道这可能晚了几年,但是我只是想补充一下,我有多个引用处于错误状态。 我的情况发生在两个位置:.git/refs/remotes/origin和.git/refs/tags(标签也有问题)。 我删除了错误的引用,然后再次成功地进行了获取。我猜你可以将所有引用都清除并重新获取,但我只清除了错误指定的那些引用。 - Dennis Baskin
这解决了问题,ref文件中全是零而不是分支的实际哈希值。 - ngeksyo
谢谢,你的解决方案帮了我很大的忙。 - Andrew G
1
希望我能再点赞一次。这已经帮助了我两次了。 - Louise Eggleton
这个可行。感谢解决方案。附注:删除.git\refs\remote\origin文件夹内的所有文件并执行git fetch - Nambi_0915

2
在我的情况下,问题不在于分支名称本身。我遇到了这样的情况:这个分支名 dev/a_random_branch_nameDev/completely_different_branch_name 冲突了。我很困惑,因为这两个分支根本不相似,我一开始甚至没有注意到文件夹名称不匹配。
要解决这个问题,我采取了以下步骤:
  1. 删除 .git\refs\remotes\origin\dev 下的所有内容。
  2. 创建一个新的分支,使其与源代码控制中已存在的文件夹名称大小写匹配:Dev/a_random_branch_name

0

当"<group>"的远程列表中重复列出相同的远程时,启用并行获取时,您还会收到 "git fetch <group>"(man) 的错误消息。

这已经在 Git 2.40 (Q1 2023) 中得到了纠正。

请查看提交 06a668c(2023年1月19日)由Calvin Wan (CalvinWan0101)提交。
(由Junio C Hamano -- gitster --合并于提交 d26e26a,2023年1月27日)

fetch:修复重复远程并行获取错误

签名作者:Calvin Wan

Fetching in parallel from a remote group with a duplicated remote results in the following:

error: cannot lock ref '<ref>': is at <oid> but expected <oid>  

This doesn't happen in serial since fetching from the same remote that has already been fetched from is a noop.

Therefore, remove any duplicated remotes after remote groups are parsed.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接