Git Pull失败 "无法解析引用" "无法更新本地引用"

902

我使用 git 1.6.4.2 版本,当我尝试执行 git pull 命令时,出现了以下错误:

error: unable to resolve reference refs/remotes/origin/LT558-optimize-sql: No such file or directory
From git+ssh://remoteserver/~/misk5
 ! [new branch]      LT558-optimize-sql -> origin/LT558-optimize-sql  (unable to update local ref)
error: unable to resolve reference refs/remotes/origin/split-css: No such file or directory
 ! [new branch]      split-css  -> origin/split-css  (unable to update local ref)

我已经尝试过git remote prune origin,但它没有起作用。


3
在不同的分支中,Git引用冲突导致无法更新本地分支。您可以使用以下命令查看冲突:git show-ref. 要解决冲突,您需要手动编辑 .git/packed-refs文件并删除引用,然后再次尝试更新分支。 - Amit Yadav
您可以手动删除以下位置下的“master”文件:PROJECT\.git\refs\remotes\origin\master - Shurvir Mori
39个回答

1395

尝试使用以下命令清理本地代码库:

$ git gc --prune=now
$ git remote prune origin

git-gc(1) 的使用手册:

git-gc - Cleanup unnecessary files and optimize the local repository

git gc [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune]

       Runs a number of housekeeping tasks within the current repository, such as compressing file revisions
       (to reduce disk space and increase performance) and removing unreachable objects which may have been
       created from prior invocations of git add.

       Users are encouraged to run this task on a regular basis within each repository to maintain good disk
       space utilization and good operating performance.

git-remote(1)的说明文档:

git-remote - manage set of tracked repositories

git remote prune [-n | --dry-run] <name>

           Deletes all stale remote-tracking branches under <name>. These stale branches have already been
           removed from the remote repository referenced by <name>, but are still locally available in
           "remotes/<name>".            

172
为什么这个方法有效?它解决了什么问题? - Ikke
8
第二个命令对我有效。显然,我有一个指向一个刚创建的远程分支的损坏引用。不确定是怎么发生的,但很高兴问题得以简单解决。谢谢Vitek! - JGTaylor
2
这个完美地运行了!我也想知道这是做什么的,以及为什么它能够正常工作。谢谢! - ArielSD
7
“git remote prune origin” 命令会在我的本地工作副本上运行还是在远程仓库上运行? - user1438038
4
它不应该删除任何分支,只更新本地工作副本中的远程引用。更多信息请参见:https://dev59.com/kGIj5IYBdhLWcg3wk182 - Zengineer
显示剩余6条评论

815

我也遇到了同样的问题。在我的情况下,坏的参考是主分支(master),我执行了以下操作:

rm .git/refs/remotes/origin/master
git fetch

这使得git还原了参考文件。此后一切都像预期的那样正常工作。


2
我做了同样的事情,它解决了我的问题。当我在Notepad++中打开文件时,它明显是损坏的。 - theMayer
106
请确保选择有问题的文件,而非主文件。 - bia.migueis
9
如果你无意中删除了主分支,它不会对任何东西造成损害 - 只要在下次拉取时更新即可。 - naught101
2
如果它是一个子模块,找到引用可能会稍微棘手。首先通过执行“ls -la”检查“.git”是否为文件夹,如果不是,则查看“.git”文件的内容以查找实际的.git文件夹,其中包含引用。在我的情况下,“.git”文件的内容是:“gitdir: ../.git/modules/my-submodule-name”。 - CCoder
2
在过去的一年中,我已经两次回来修复这个问题,而且,这是唯一真正有效的解决方法。 - Ted
显示剩余12条评论

183

这对我来说起了作用:

git gc --prune=now

Git GC文档在此处:https://www.git-scm.com/docs/git-gc/1.6.5#git-gc---pruneltdategt - BigRon
1
我也试过了,不需要运行 git remote prune origin - Airwavezx
在运行这个命令之前,我不得不将终端提到的错误引用移出.git文件夹,但是在此之后,这个命令成功运行了,我能够愉快地继续我的编码之旅! - TripWire
运行以下命令解决了我的问题:fatal: bad object refs/remotes/origin/HEAD fatal: failed to run repack,所以我运行了 rm .git/refs/remotes/origin/HEADgit gc --prune=now,现在该仓库就像新的一样干净。 - Josep Bigorra

112

对我来说,从文件夹.git/refs/remotes/origin/中删除引发错误的文件是有效的。


搞定了!但是出于好奇,您知道为什么会出现这个错误吗?(一切都正常运行,突然有一天就弹出了这个错误)。同时,您知道删除文件是如何解决问题的吗? - Shreyans
很高兴听到这个方法也解决了你的问题。老实说,我不知道是什么导致了错误出现。我的想法是文件夹中的某个文件已经失去同步了。由于其他我找到的解决方法都没有起作用,所以我把这个方法作为最后的手段。 - Brian van Rooijen
工作得很好!请注意,您必须删除所有导致问题的文件(根据您收到的错误报告),因为如果您只删除一个并尝试拉取,它将会重新出现。 - Rayee Roded
3
可能的原因之一可能是系统崩溃,就像我在我的回答中所描述的那样。许多Git图形界面应用程序会定期运行Git命令来刷新状态,如果您的系统在Git正在操作引用时崩溃,它们可能会被重写为'NULL'。 - David Ferenczy Rogožan
1
我的系统在同步操作即将完成时崩溃了,这真的很不幸。 - Padmika
1
我强制关闭了电脑,没有关闭所有应用程序。这导致了问题。删除C:\ git \ repo1 \ .git \ logs \ refs \ remotes \ origin可以解决问题。 - Chinmoy

103

我想补充一种可能导致Git引用损坏的原因。

可能的根本原因

在我的系统(Windows 7 64位)上,当发生蓝屏死机时,一些存储的引用文件(最有可能是当蓝屏死机发生时正在打开/写入)被覆盖成了NULL字符(ASCII 0)。

正如其他人所提到的,解决这个问题只需要删除那些无效的引用文件,然后重新获取或拉取仓库即可。

示例

错误信息:

cannot lock ref 'refs/remotes/origin/some/branch': unable to resolve reference 'refs/remotes/origin/some/branch': reference broken

解决方案:

删除存储在文件%repo_root%/.git/refs/remotes/origin/some/branch中的引用refs/remotes/origin/some/branch


5
在Windows 10 64位操作系统中发生以下情况:在git repo(版本库)中工作时,突然出现蓝屏错误。之后执行git pull命令时显示error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken。在删除第一个文件后尝试执行git pull命令,结果返回fatal: update_ref failed for ref 'HEAD': cannot lock ref 'HEAD': unable to resolve reference 'refs/heads/master': reference broken。在删除第二个文件后,执行git pull origin master命令成功了。 - c.j.mcdonn
到目前为止,最简单的解决方案 - George
1
出现了蓝屏问题。这解决了我的问题。 - ThomasMX
这就是最终适合我的解决方案。 - MindRoasterMir

94

解释: 看起来您的远程仓库(在 GitHub / BitBucket 上)的分支已被删除,但是您的本地引用没有更新,仍指向不存在的引用。

为了解决这个问题:

git fetch --prune
git fetch --all
git pull

额外阅读 - 参考自Git文档:

git-fetch - 从另一个存储库中下载对象和引用

--all 拉取所有远程分支。

--prune 在拉取后,删除任何在远程不存在的远程跟踪分支。


89

前往flutter文件夹底下,然后执行以下操作:

尝试一下:

git gc --prune=now

git remote prune origin

git pull

40
虽然这可能回答了作者的问题,但是它缺少一些解释性的单词和/或链接到文档。没有一些围绕着代码片段的短语,它们并不是很有帮助。你也可以发现如何撰写一个好的答案非常有帮助。请编辑您的答案。 - Roy Scheffers
恰好就是这个意思。仅仅编写代码是不够的,我希望有一个解释。 - Musikero31
1
git gc --prune=now 命令会在删除不必要的文件的同时更新本地代码库。这个命令对我来说很有效。 - Vasyl Gutnyk

53

执行以下命令:

rm .git/refs/remotes/origin/master

git fetch

git branch --set-upstream-to=origin/master

以防万一,如果你需要了解什么是.git/refs/remotes/origin/master,你可以阅读Git References中的远程一节。


1
你能解释一下 .git/refs/remotes/origin/branchName 是什么吗?这个解决方案对我有用。 - caitcoo0odes

51

git fetch --prune修复了我的这个错误:

[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:25]
[I]> git fetch
error: cannot lock ref 'refs/remotes/origin/user/janek/integration/20170505': 'refs/remotes/origin/user/janek/integration' exists; cannot create 'refs/remotes/origin/user/janek/integration/20170505'
From github.com:zooxco/driving
 ! [new branch]            user/janek/integration/20170505 -> origin/user/janek/integration/20170505  (unable to update local ref)
From github.com:zooxco/driving
[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:30]
[I]> git fetch --prune
 - [deleted]               (none)     -> origin/user/janek/integration

这假设有问题的分支已从远程删除。

你也可以将以下内容添加到~/.gitconfig中,以在运行git fetch时自动修剪:

[fetch]
    prune = true

你的示例似乎不完整:我看不到 --prune。另外,专业提示:在粘贴示例后删除无用的密码提示。 - MarkHu
你说得完全正确 - 我漏掉了从fetch命令中输出的内容,但我已经将其放入示例中。谢谢你提供的去除密码提示的建议! - marczych

49
在我的情况下,问题是在我删除目录.git下的所有移除引用文件后解决的。如果您查看消息,它将告诉您需要删除哪些文件(具体而言)。要删除的文件位于.git/refs/remotes目录下。我只是删除了那里的所有文件,然后运行了gc prune命令。
git gc --prune=now

之后,一切都正常工作。


在我的情况下,我只需删除.git/refs/remotes然后更新并通过服务器推送,就可以解决问题了。 - Faraz Ahmed
谢谢Uri。在我的情况下,我只是删除了refs/remotes/origin/feature下的文件,然后简单地执行了git pull。 - Deepboy

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