当我删除远程分支时,Git说远程引用不存在。

281

我运行了git branch -a

* master
  remotes/origin/test
  remotes/origin/master
我想删除我的远程分支。
我已经尝试过。
git push origin --delete remotes/origin/test

我遇到了以下错误:

错误:无法删除'remotes/origin/test':远程引用不存在

怎么会不存在呢?

我执行了git branch -a,发现它被列出来了。

我有什么遗漏吗?


2
git branch -a 会列出您本地分支,但不会列出远程分支,对吧? - user1846747
3
它会显示本地存在的远程分支,但不会列出所有的远程分支。 - user1846747
4
@peterh 看起来它真正想问的是“为什么我无法删除远程分支”(可能是当分支已从远程删除但远程引用仍然存在本地时),因此不是重复问题,但可以使用更清晰的标题。 - Andrew Spencer
1
我修改了标题,希望更接近问题意图。 - Andrew Spencer
4
git fetch --prune - hassanzadeh.sd
显示剩余2条评论
15个回答

586
命令git branch -a显示在本地仓库存在的远程分支。这可能听起来有点困惑,但要理解它,您必须了解远程分支和存在于远程存储库中的分支之间的区别。远程分支是映射到远程存储库分支的本地分支。因此,远程分支集表示远程存储库的状态。
更新远程分支列表的常规方法是使用git fetch。这将自动从远程获取更新的分支列表,并设置本地仓库中的远程分支,还会获取您可能缺少的任何提交对象。
然而,默认情况下,git fetch不会删除那些在远程没有对应分支的远程分支。为了做到这一点,您需要显式修剪远程分支列表:
git fetch --prune

这将自动清除在远程不存在的分支。之后,git branch -r 将向您显示一个已更新的实际存在于远程的分支列表:您可以使用 git push 删除其中的分支。

话虽如此,要使用 git push --delete,您需要指定远程存储库中分支的名称,而不是您的远程分支的名称。因此,要删除名为 test 的分支(由您的远程分支 origin/test 表示),您应该使用 git push origin --delete test


1
{btsdaf} - Seraf
3
收到Git发送此消息有两个原因:一是该分支已在服务器上删除,二是您错误地给分支名称添加了“remotes/origin/”前缀。或者两者都有可能。 - Andrew Spencer
1
@SCKU 只需跳过 --delete,然后将您的本地分支实际推送到远程即可。 - poke
1
注意:如果你的分支在其他远程仓库(不是origin)中,命令应为 git fetch --prune <远程仓库名称> - aidandeno
这似乎不是真的。git branch -a 里面有很多东西,但是我多次调用了 prune(为了确保),但它并没有影响到 git branch -a 的内容。 - undefined
显示剩余6条评论

160

remotes/origin/test 的含义是你在远程服务器 origin 上有一个名为 test 的分支。因此,命令应该是:

git push origin --delete test

34

有一个删除远程分支的快捷方式:

git push origin :<branch_name>

与执行 git push origin --delete <branch_name> 相同。


15
  1. 获取远程分支列表
git fetch # synchronize with the server
git branch --remote # list remote branches
  1. 您应该获取远程分支的列表:
origin/HEAD -> origin/master
origin/develop
origin/master
origin/deleteme
  1. 现在,我们可以删除这个分支:
git push origin --delete deleteme

7
不行,这会得到相同的错误:远程引用不存在 - Kokodoko

14

我按照poke提供的解决方案进行了微小的调整。我的步骤如下:


- 运行命令git fetch --prune;
- 运行命令git branch -a,输出如下:
   master
   branch
   remotes/origin/HEAD -> origin/master
   remotes/origin/master
   remotes/origin/branch(要删除的远程分支)
- 运行命令git push origin --delete branch
在这里,要删除的分支名称不是remotes/origin/branch,而只是branch。然后分支就被删除了。


4
针对有关分支名称的评论点赞,我本来试图删除 origin/branch 分支,但实际上应该只是删除 branch 分支。 - ken
是的,我的也不是remotes/origin/branch,即使branch -a清楚地显示路径确实是那样。只有当我仅使用分支名称时,它才起作用,就像你说的那样。所以感谢您的发布,否则我可能需要很长时间才能尝试这个方法。 - Mote Zart
git fetch --prune 标志解决了我的问题。显然,只有 git fetch 不会提供更新的远程分支列表。 - maxorcist
没用,我得到了同样的错误。 - undefined

11

git push origin --delete yourBranch


11

假设远程分支是 remotes/origin/test,你可以有两种方法:

git push origin --delete test

git branch -D -r origin/test

4

对于我而言,这个方法行得通 $ ▶ git branch -D -r origin/mybranch

细节

$ ▶ git branch -a | grep mybranch remotes/origin/mybranch

$ ▶ git branch -r | grep mybranch origin/mybranch

$ ▶ git branch develop (开发) * feature/pre-deployment(预发布)

$ ▶ git push origin --delete mybranch error: unable to delete 'mybranch': remote ref does not exist error: failed to push some refs to 'git@10.102.100.38:config/myrepo.git'

$ ▶ git branch -D -r origin/mybranch 已删除远程分支 origin/mybranch (原来是 62c7421)。

$ ▶ git branch -a | grep mybranch

$ ▶ git branch -r | grep mybranch


4

快速回答

您只需要修剪列表(清理列表),因为该分支不再存在。
运行以下命令:

git fetch --prune

要进行验证,请运行

git branch -r

您应该看到一个仅包含现有远程存储库的新列表


不管用,git fetch --prune 只会移除本地的分支。 - undefined
嘿 @kovarex,这个解决方案适用于那些远程仓库已被删除但本地仍然存在的人。如果你想删除一个远程仓库,请运行 git push origin -d branch-name - undefined

3
一条方便的命令可以删除除了'master'以外的其它分支:
git branch --remotes | grep -v 'origin/master' | sed "s/origin\///" | xargs -i{foo} git push origin --delete {foo}

在执行此操作之前,请确保您理解其影响!


谢谢这段代码!这是我测试过的唯一一个能够删除除主分支以外所有远程分支的 Git 代码。 - Alvin
这是最好的答案。 - csf

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