4

我无法删除名为origin/featureBranch. 我想这是因为分支名称以 开头origin,但我不确定:

$ git branch -r | grep featureBranch
  origin/origin/featureBranch

$ git push origin :origin/featureBranch

    error: unable to push to unqualified destination: origin/featureBranch

    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@github.com:myCompany/my-repo.git'

更新

$ git push origin :featureBranch给出同样的错误。

笔记

在远程分支是origin/origin/myFeature,在本地是origin/myFeature

我知道origin通常是什么意思,但就我而言 - 这是分支名称的一部分。

Github 没有看到这个分支。


谁能解释一下“幕后”发生了什么以及如何删除这个分支?

4

4 回答 4

11

尝试这个:

git push origin :refs/heads/origin/featureBranch

您始终可以在refs/heads/.

分支存储为一个小文本文件,位于.git/refs/. 本地分支在下面.git/refs/heads/,远程分支在.git/refs/remotes/<remotename>/. master因此,将在.git/refs/heads/masterand找到一个简单的分支.git/refs/remotes/origin/master,但您的错误分支实际上将驻留在.git/refs/heads/origin/featureBranch. 它不会与origin存储库上的远程分支混淆,因为它不是在 下refs/remotes/origin/,而是在refs/heads/.

在远程服务器上,origin/featureBranch分支是服务器本地的,因此它将存储在refs/heads/. 推送到给定分支时,您可以通过其名称或路径来识别它,因此如果名称不起作用,只需使用以 . 开头的完整路径refs

你是怎么得到这个奇怪的分支名称的?我不能确定,因为我不知道你做了什么,但是我在使用时遇到了同样的问题git push --mirror,它会推送所有引用,包括远程引用,所以它会创建origin/branchname一个本地分支。

于 2012-08-30T08:35:18.223 回答
2

这应该有效:

$ git push origin :featureBranch

您已经指定了推送的位置,这origin/只是您本地分支的名称。

背景:当 git 进行抓取时,它会创建所谓的“远程跟踪分支”。这些与您自己的分支并没有真正的不同,它们只是以远程名称(例如origin/master)为前缀,并在本地表示服务器分支(所有提交都已被获取)。

当您执行推送源时,您根本不是指本地远程跟踪分支,而是告诉 Git “推送到源源分支:目标分支”

于 2012-08-30T08:21:09.020 回答
1

这条消息说它找不到任何匹配的分支。

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.

如果我尝试两次删除分支,这就是我得到的。(第一个成功,第二个失败)。或者如果分支已被其他人删除。您可以尝试git remote prune查看它是否从您的git branch -r输出中消失。您还可以检查分支是否正在origin使用git ls-remote git@github.com:myCompany/my-repo.git.

origin/master像on一样删除奇怪(糟糕?)命名的分支origin对我来说很好:

$ git push origin master:origin/master
Counting objects: 3, done.
Writing objects: 100% (3/3), 218 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To ../bare/
 * [new branch]      master -> origin/master

$ git branch -r
  origin/origin/master

$ git push origin :origin/master
To ../bare/
 - [deleted]         origin/master
于 2012-08-30T08:34:04.730 回答
0

只需origin放在冒号后面:

git push origin :featureBranch

正如迈克尔解释的那样,这意味着将“无”推送到指定的分支。 是一个更完整的解释。

于 2012-08-30T08:21:08.610 回答