git pull error:错误:远程ref在但是预期

San*_*ngi 211 git pull git-pull

完整信息:

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)
Run Code Online (Sandbox Code Playgroud)

kri*_*sta 212

如果您在不区分大小写的文件系统(Windows或OS X)下运行git,如果有两个具有相同名称但大小写不同的分支,则会发生这种情况,例如user_model_changes,User_model_changes因为两个远程分支将匹配相同的跟踪引用.

删除错误的远程分支(你不应该只有大小写不同的分支),然后git remote prune origin一切都应该工作

  • 是的,Windows上的不区分大小写的问题导致了这个问题.我通过手动删除`.git\refs\_dotes/origin`文件夹中的ref然后再次`git pull`来修复它. (10认同)
  • 对Mac OS X也有帮助(默认文件系统不区分大小写)。 (2认同)

JDi*_*teo 170

永久修复

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

git update-ref -d refs/remotes/origin/user
Run Code Online (Sandbox Code Playgroud)

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

在我的情况下,随后git fetch再次获取该分支,并且在git抓取/拉取之后不再给出错误"远程ref在但是预期".

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

另请注意,如果您不关心相关分支(例如,您只想更新master,而不是origin/user),则git pull解决方法是获取然后合并您关注的特定分支,例如

git fetch # may give an error for a particular branch, but other branches will still be successfully fetched
git merge origin/master
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的解决方案,因为它可以在不接触远程的情况下解决问题。 (4认同)

小智 43

只需删除".git\refs\remotes\origin"下的文件夹和文件即可.当你没有未按下的更改时工作

  • 这对我有用,所以我认为这是一个答案. (23认同)
  • 当我这样做,然后进行拉取时,“\.git\refs\remotes\origin”下所有已删除的文件都会返回,并且在随后的拉取中,我收到相同的错误。这是一个循环。我所做的只是删除本地副本并克隆一个新副本。这对我有用。 (3认同)
  • 为我工作。万分感谢! (2认同)

ela*_*ver 35

我跑这个来解决问题:

git gc --prune=now
Run Code Online (Sandbox Code Playgroud)

  • 这为我解决了这个问题. (2认同)
  • 对我来说..-- :) (2认同)
  • 谢谢,此解决方案为我解决。您能否解释一下您提供的解决方案的更多信息。 (2认同)

Nar*_*ain 26

逐个使用以下两个命令.

git gc --prune=now

git remote prune origin
Run Code Online (Sandbox Code Playgroud)

这将解决您的问题.

  • 这对我有用,但是当我执行另一个 git pull 时,这个问题又出现了 (2认同)
  • 这应该比编辑 git 文件的建议更高:) (2认同)

小智 12

我不得不从我的命令行删除我的分支:

.git\refs\remotes\{my remote}\{**my branch**}
Run Code Online (Sandbox Code Playgroud)

然后手动执行:

git pull [remote_name] [branch_name]
Run Code Online (Sandbox Code Playgroud)

我能够拉动变化.

注意:我使用的是SourceTree而无法完成拉动.


小智 8

按以下顺序运行以下命令

git gc --prune=now
git remote prune origin
git pull
Run Code Online (Sandbox Code Playgroud)


mru*_*ova 6

硬重置也可以解决问题

git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)

  • 虽然这可以解决问题,但我还想提醒用户,当分支中有尚未推送到远程的本地提交时执行此命令将基本上清除这些本地提交(但是,仍然可以使用git reflog 一段时间) (4认同)

Man*_*ojP 6

我尝试了多种选择,但没有一个选择对我有用。下面的命令对我有用。把它放在这里,如果它可以帮助人们防止其他选择不起作用。

git pull -p

-p --prune 在获取之前,删除远程上不再存在的任何远程跟踪引用。如果仅由于默认标签自动跟踪或由于 --tags 选项而获取标签,则标签不会受到修剪。但是,如果由于显式引用规范(在命令行上或在远程配置中,例如,如果使用 --mirror 选项克隆远程)而获取标签,则它们也会受到修剪。提供 --prune-tags 是提供标签 refspec 的简写。

--来源:https ://git-scm.com/docs/git-pull#Documentation/git-pull.txt--p


sha*_*eef 5

更清晰的步骤

  1. 在终端

    cd /.git/refs/remotes/origin
    
    Run Code Online (Sandbox Code Playgroud)
  2. ls,你会看到一些分支HEAD

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

    rm branchname
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果它不起作用,请删除所有分支/HEAD

    • 你可能想拉

希望它现在有效。


小智 5

不幸的是,像 prune 和 reset 或 push 这样的 GIT 命令对我不起作用。修剪工作一次,然后问题又回来了。

对我有用的永久解决方案是手动编辑 git 文件。只需转到项目的 .git 文件夹,然后在 Notepad++ 之类的文本编辑器中打开文件packed-refs。然后导航到失败分支的行并将其 guid 更新为预期的。

如果你有这样的消息:

错误:无法锁定引用“refs/remotes/origin/feature/branch_xxx”:位于 425ea23facf96f51f412441f41ad488fc098cf23 但预期为 383de86fed394ff1a1aecd7a522d8986ad

然后在文件中找到带有refs/remotes/origin/feature/branch_xxx. 那里的 guid 将是预期的(第二个)一 - 383de86fed394ff1a1aeefc4a522d886adcecd79。您需要将其更改为真正的(第一个) - 425ea23facf96f51f412441f41ad488fc098cf23

重复其他失败的分支,你会很高兴继续。有时在重新获取后,我不得不重复我之前已经“修复”的相同分支。在重新获取 GIT 更新 guids 并为您提供最新的。

无论如何,问题不是表演障碍。分支列表得到更新。这倒是一个警告。