删除远程git分支时出现“error: unable to push to unqualified destination”错误

149

我正在尝试使用git命令删除远程分支

git push origin :my_remote_branch

并获取:

error: unable to push to unqualified destination: my_remote_branch
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to 'git@example.com:/myrepo'

这些是我当前的分支

git branch -a
* develop
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/my_remote_branch

git branch -r --merged
  origin/HEAD -> origin/master
  origin/develop
  origin/master

有什么方法可以帮我摆脱这个分支,谢谢。


你尝试过执行 git fetch 命令来查看是否修复了不存在的远程名称问题吗?你可以进入 .git\refs\remotes\origin 目录并删除 my_remote_branch 文件,看看是否足够解决问题。 - VonC
执行了 git fetch,但没有帮助。在尝试手动删除文件之前,将尝试寻找更简单的解决方案。 - Hugo
尝试删除或至少移动该文件:它仅包含该分支顶部的SHA1。 - VonC
46
你必须执行 git fetch -p 命令来清除陈旧的追踪分支。 - Jan Hudec
9个回答

286

refs/remotes/origin/my_remote_branch在本地仓库中存在,并不意味着refs/heads/my_remote_branchorigin远程仓库中存在。

如果refs/remotes/origin/my_remote_branch已在origin中被删除,请执行git fetch -p origin以使其消失。 -p选项告诉fetch删除相应远程仓库中不再存在的任何跟踪分支;默认情况下,它们会保留下来。


15
"git fetch -p origin" 对我有用。非常感谢。 - redimp
1
你的回答太棒了,简短而且言简意赅! - 1nstinct
1
修剪并没有起到作用!当我使用 git push origin --delete origin/feature/x 命令时,它告诉我关于不存在引用的错误。但是,git push origin :feature/x 命令却成功删除了该分支。所以我猜测 git push origin --delete <branchName> 命令中的 branchName 不应该包含 origin (?),但这个命令会自动补全,有点让人困惑。 - dashesy
@dashesy,你的情况与最初的提问者不同。在最初的问题中,问题是远程分支已经被其他人删除了,因此只需要同步本地分支。而你正在删除远程分支。实际上,命令应该是 git push origin --delete feature/x,因为你给出的是_origin_的分支名称,并且在那里没有该前缀(两种形式在其他方面都是同义词)。 - Jan Hudec
@JanHudec说得有道理。当使用:时,Bash complete会很聪明地不包括origin,但在使用--delete变体时,它会将其完成为origin/branch_name而不是简单的branch_name - dashesy
"git fetch -p" 命令对我也有效。非常好的答案,谢谢! - Ranjani

62

我已经尝试了大约一个小时来做到这一点,非常感谢! - sebkkom
1
这不会删除远程分支。如果你执行 git fetch,你将再次看到该分支。它只是从你本地的远程分支列表中移除了它。 - Patrick Desjardins
2
@PatrickDesjardins 确切地说,git push origin :my_remote_branch 会从远程删除该分支,而 git branch -r -d origin/my_remote_branch 则会将其从我的本地远程分支列表中移除。 - Hugo

14

当我试图删除已经被删除的远程分支时,遇到了这个问题。需要做的只是进行一次 prune 操作:

git remote prune origin

6
尝试以下两种选项来强制删除远程分支:
选项1:
get push origin --delete <branchName>

选项2
git fetch -p origin
git branch -r -d origin/<branchName>

3
git branch -r -d origin/my_remote_branch

这对我来说还不够。在我必须直接到服务器并使用 git 目录的情况下(这是危险和丑陋的),我需要删除分支:

ssh mygitserver
su - git
cd /home/git/repositories/my_remote_branch.git/
git  --git-dir=. --work-tree=/tmp/ branch -D my_remote_branch

这不仅危险且难看,而且是错误的。首先,这个问题是关于在远程已经删除分支时本地如何删除该分支。其次,从远程删除分支只需要执行 git push origin :my_remote_branch 命令即可。注意冒号。 - Jan Hudec
你说得对,Jan。git push origin :my_remote_branch 是正常的方法。当这个方法无法工作时(例如由于git配置不正确),这种丑陋而危险的方式就会出现。 - pevik

2

对我来说问题在于,这是我的github默认分支。我改变了默认分支,然后删除操作成功了。

希望对某些人有所帮助。


1

我有类似的问题。

一开始去了这个讨论,但是直到我看到https://dev59.com/LVwY5IYBdhLWcg3w2K3c#32147743之后才解决了这个问题。

它简单地添加了一个提示来区分origin/my-branch-namemy-branch-name

具体来说,我应该使用:

git push origin :my_remote_branch

代替

git push origin :origin/my_remote_branch

这至少解决了我的问题,希望也能帮助其他人。

0
这对我有用: 我在 Github UI 上创建了远程分支,然后将本地同名分支推送到它上面。如果其他方法不起作用,请尝试此方法。 另一种方法是在本地创建一个新分支,推送一个空分支,然后挑选您的提交并再次推送到远程分支。

0

我遇到了同样的问题,我手动编辑了 ./.git/config 文件并加入以下内容:

[branch "branchName"]
remote = origin
merge = refs/heads/branchName

产生了以下错误:error: src refspec branchName matches more than one. 我通过运行$ git tag -d branchName 来解决这个问题。 此后,我能够将新分支推送到上游。


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