git pull error:error:远程引用在但预期


227

完整讯息:

error: Ref refs/remotes/origin/user is at 3636498c2ea7735fdcedc9af5ab3c8689e6abe77 but expected a21359c6cc2097c85775cde6a40105f4bd7100ec
From github.com:{github project url}
 ! a21359c..6273ffc  user -> origin/user  (unable to update local ref)

3
显然有人通过重写了存储库的历史记录git push --force。尝试运行git pull --force
xaizek 2012年

1
使用git push --force给出相同的错误
Sanjeev Kumar Dangi 2012年

5
回答这个问题解决了这个错误- stackoverflow.com/questions/3046436/...
桑吉弗·库马尔Dangi

Answers:


225

如果您在不区分大小写的文件系统(Windows或OS X)下运行git,那么将存在两个具有相同名称但大小写不同的分支,例如user_model_changesUser_model_changes并且两个远程分支都将匹配相同的跟踪引用。

删除错误的远程分支(您不应有仅因大小写而异的分支),然后git remote prune origin一切正常


感谢您的回答。这不是此错误的问题。我已经找到了解决该问题的方法,并在问题下方的评论中发布了该问题。
Sanjeev Kumar Dangi 2012年

2
也为Mac OS X提供帮助(默认文件系统不区分大小写)。
Tammo Freese 2013年

12
是的,Windows上不区分大小写的问题导致了此问题。我通过手动删除.git\refs\remotes\origin文件夹中的ref 并git pull再次将其修复。
罗伊·灵

对于那些不知道.git文件夹在哪里的人..它将在您的Project / workspace文件夹内创建:D
kumar

1
这是一个git bug(至少错误消息是错误的)。我希望有人可以将此错误报告给git项目。对我来说,向git项目报告错误似乎很困难。github.com/git/git
青铜人

190

永久修复

git update-ref -d 解决了此错误的实例,例如

git update-ref -d refs/remotes/origin/user

请注意,这不会影响远程。

在我的情况下,随后的操作git fetch再次获取该分支,并且在执行git fetches / pull之后,不再给出错误“远程引用在但预期中”。

如果这不起作用,请临时修复:

还要注意,如果您不在乎所关注的分支(例如,您只想更新主节点,而不是源/用户),则一种git pull变通方法是获取然后仅合并您关心的特定分支,例如

git fetch # may give an error for a particular branch, but other branches will still be successfully fetched
git merge origin/master

这应该是公认的解决方案,因为它可以解决问题而无需触摸遥控器。
塞诺


43

我运行这个来解决问题:

git gc --prune=now

2
这为我解决了这个问题。
Aamir Rizwan '18

2
对我来说也..--:)
Aravind R Pillai

3
谢谢,此解决方案适合我。您能否解释一下您提供的解决方案的更多信息。
Aamol

1
基本上,它只是一个git垃圾收集器工具,因此它会删除所有不同步但在本地计算机上用于缓存目的的东西
失落的银

42

依次使用以下两个命令。

git gc --prune=now

git remote prune origin

这样可以解决您的问题。


1
这对我
有用,

@Jojin和你一样。最后,我选择了Prakash Saravanan提供的方式
xi.lin

1
这应该被评为高于编辑git文件的建议:)
Mike Wise

只有此解决方案对我有用。谢谢!
insaineyesay

12

我必须从命令行中删除我的分支

.git\refs\remotes\{my remote}\{**my branch**}

然后手动执行:

git pull [remote_name] [branch_name]

我能够拉动更改。

注意:我正在使用SourceTree,无法执行拉取。


最终,我重命名了远程服务器:在SourceTree历史记录中,我有两个远程服务器“ Bitbucket / staging”和“ bitbucket / staging”,但是在执行此操作时,命令行上仅出现“ Bitbucket”:git remote -v。因此,我将Bitbucket重命名为bitbucket,冲突终于消失了,希望这对最有可能的SourceTree用户有所帮助。
jogam5年

.git\packed-refs在为我修复该分支之前,我还必须删除该分支。
迈克尔


5

更清晰的步骤

  1. 在终端

    cd /.git/refs/remotes/origin
    
  2. 这样做 ls,您将看到一些分支HEAD

  3. 删除您认为有问题的分支

    rm branchname
    
  4. 如果不起作用,请删除所有分支/ HEAD

    • 你可能想拉

希望它现在可以工作。


这基本上和git update-ref -d <branchname>吗?
jt000

2

试试这个,对我有用。在您的终端中:git remote prune origin


2

不幸的是,诸如修剪和重置或推送之类的GIT命令对我不起作用。Prune工作一次,然后问题再次出现。

对我有用的永久解决方案是手动编辑git文件。只需转到项目的.git文件夹,然后在文本编辑器(如Notepad ++)中打开包装好的引用文件即可。然后导航到具有失败分支的行,并将其guid更新为预期的行。

如果您有以下消息:

“错误:无法锁定参考'refs / remotes / origin / feature / branch_xxx':位于425ea23facf96f51f412441f41ad488fc098cf23,但预期为383de86fed394ff1a1aeefc4a522d886adcecd79”

然后在文件中找到带有“ refs / remotes / origin / feature / branch_xxx”的行。引导将出现(第2个)预期的-383de86fed394ff1a1aeefc4a522d886adcecd79。您需要将其更改为实数(第一个)-425ea23facf96f51f412441f41ad488fc098cf23。

重复其他失败的分支,您将可以继续进行。有时,在重新获取后,我不得不对之前已经“修复”的相同分支重复。在重新获取GIT更新指导后,会为您提供最新的指导。

无论如何,这不是一个秀场停止者。分支机构列表已更新。这是一个警告。


1

git for-each-ref --format ='delete%(refname)'refs / original | git update-ref --stdin git reflog过期--expire = now --all git gc --prune = now


0

此处的情况相同,但关于评论的内容均不正确,在我的情况下,我只有一个分支(主节点),并且仅使用Unix文件系统,当我运行git fetch --progress --prune origin并且分支在前面时,会随机发生此错误或“来源/主”。没有人可以提交,只有1个用户可以进行推送。

注意:我在acme存储库中有一个子模块,并且acme有新的子模块更改(新的提交),我需要首先使用git子模块更新进行子模块更新。

[2014-07-29 13:58:37] Payload POST received from Bitbucket
[2014-07-29 13:58:37] Exec: cd /var/www/html/acme
---------------------
[2014-07-29 13:58:37] Updating Git code for all branches
[2014-07-29 13:58:37] Exec: /usr/bin/git checkout --force master
[2014-07-29 13:58:37] Your branch is ahead of 'origin/master' by 1 commit.
[2014-07-29 13:58:37]   (use "git push" to publish your local commits)
[2014-07-29 13:58:37] Command returned some errors:
[2014-07-29 13:58:37] Already on 'master'
---------------------
[2014-07-29 13:58:37] Exec: /usr/bin/git fetch --progress --prune origin
[2014-07-29 13:58:39] Command returned some errors:
[2014-07-29 13:58:39] error: Ref refs/remotes/origin/master is at 8213a9906828322a3428f921381bd87f42ec7e2f but expected c8f9c00551dcd0b9386cd9123607843179981c91
[2014-07-29 13:58:39] From bitbucket.org:acme/acme
[2014-07-29 13:58:39]  ! c8f9c00..8213a99  master     -> origin/master  (unable to update local ref)
---------------------
[2014-07-29 13:58:39] Unable to fetch Git data

要解决此问题(在我的情况下),如果您的分支位于原点之前,则只需先运行git push即可。


3
您在这里的答案仅与以下事实有关:在新提交之后,本地存储库在源数据库之前。这是本地git commit操作的自然状态,与原始问题无关。
davient,2015年

0

我知道这已经很老了,但是我有自己的解决方法。由于我使用的是源代码树,因此发生此错误是因为有人创建了新分支。源代码树对此感到困惑。在按“要拉的远程分支”组合框旁边的“刷新”按钮后,似乎sourcetree已更新了分支列表,现在我可以成功提取了。


0

我有同样的问题,这是因为即使我已经推送到远程分支,我仍重置为较旧的提交。

我通过删除本地分支然后签出origin分支git checkout origin/my_branch然后执行来解决了该问题git checkout my_branch


-1

经过不断搜索,这是对我有用的解决方案,需要取消/删除上游

git branch --unset-upstream
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.