参考:
在执行 git pull 的时候遇到如下错误:
error: cannot lock ref 'refs/remotes/origin/**': 'refs/remotes/origin/**' exists; cannot create 'refs/remotes/origin/**'
git did not exit cleanly (exit code 1) (12141 ms @ 5/13/2020 4:43:17 PM)
导致拉不了远程分支的代码。
问题原因
原因是当前 git 工程的 .git/refs 目录下跟踪的某些 git 分支,在执行 git pull
的时候,与远端的对应分支的 refs 对比发现不同,所以导致 git pull
报错。
通常产生这个问题的原因是(以分支 git/yousa/feature_01 为例):
- 有人操作 git/yousa/feature_01 这个分支,在 git push 的时候使用了 git push –force,(当然这个人的 git push 是 push 不上去),导致远端分支被覆盖,你本地的 refs 与远端无法一致,导致问题。
- git 分支是不区分大小写的,如果有人删除掉这个远端分支又重新新建了一个这个分支也会出现同样的问题。
解决办法
在【Git Bash】窗口,执行如下 git 命令:
git remote prune origin
如果你使用了 TortoiseGit 工具,可以在 pull 代码的时候,选上 Prune,就可以解决上面的问题。
网上也提供了一些其他方法,但是都没有解决问题:
根据前面的原因有一些操作方法,基本思路就是要么,强行 git pull;要么则是删除掉有问题的 refs,再进行 git pull(个人还是推荐第二种),以分支 git/yousa/feature_01 为例
- 删除有问题的 refs,可以直接在 .git/refs 下面根据错误提示删除对应的 refs 文件,比如这个就是需要删除refs/remotes/origin/git/yousa/feature_01 文件(嫌麻烦直接删除整个 refs 目录也行)
- 使用 git 命令删除相应 refs 文件,
git update-ref -d refs/remotes/origin/git/yousa/feature_01
- 简单粗暴强行 git pull,执行
git pull -p
git remote prune origin 命令
在你经常使用的命令当中有一个 git branch –a 用来查看所有的分支,包括本地和远程的。但是时间长了你会发现有些分支在远程其实早就被删除了,但是在你本地依然可以看见这些被删除的分支。
你可以通过命令,git remote show origin 来查看有关于 origin 的一些信息,包括分支是否 tracking。
Local refs configured for ‘git push’,这一栏说明你 push 了哪些分支上 origin。
develop_newfeature_apiwrapper 分支在远程,我们现在去把他删除掉。
点击垃圾桶,将其删除,再回到本地来查看所有分支。
它依然存在,但是你再通过 git remote show origin,来查看就会发现问题。
提示你可以通过 git remote prune 移除这个分支。(也就是说你可以刷新本地仓库与远程仓库的保持这些改动的同步)
这个在远程删除的分支在你本地仓库也将被删除。再通过 git branch –a 来查看。
已经不存在了。
作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/ptcpei 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。