将已删除的分支推送到远程的Git仓库。

11

目标: 删除名为 'branchname' 的远程分支

我之前用的步骤是: [第一种方法]

  1. git branch -d branchname
  2. git push origin :branchname

今天我尝试使用相同的步骤进行删除,但遇到了下面提到的问题:

$ git branch -d branchname
warning: deleting branch 'branchname' that has been merged to
         'refs/remotes/origin/branchname', but not yet merged to HEAD.
Deleted branch branchname (was f394ddc).
prash ~/folder/project1 (branch1)
$ git push origin branchname
Enter passphrase for key '/c/Users/prash/.ssh/id_rsa':
error: src refspec branchname does not match any.
error: failed to push some refs to 'ssh://git@abc.xyz/projname.git'

最终我通过另一种方法成功删除,[第二种方法]

$ git push origin --delete branchname

问题,

你知道我为什么无法按照第一种方法删除远程分支吗?还有,为什么会出现那个警告?

编辑:

我尝试通过创建和删除远程分支来复制第一个问题,这次我唯一做出的更改是在分支名称之前添加了一个冒号,而且它被成功删除了。不确定那是否是早期出现问题的原因。


3
是的,在git push origin :branchname命令中,冒号是很重要的。因为它与实际推送分支git push origin branchname非常相似,所以才会创建--delete命令行选项来删除分支。 - tbekolay
哦,我没有注意到,实际上我正在尝试推送分支,但是因为我已经在本地删除了该分支,所以出现了错误。因此,始终最好使用第二种方法。谢谢...你知道我为什么会收到有关HEAD的初始警告吗?它如何知道我没有与HEAD合并?另外,你能把这个作为答案发布吗? - spiderman
1个回答

12

在您的第一个示例中,推送失败的原因是您执行了

git push origin branchname

代替

git push origin :branchname
冒号是有意义的,它是推送分支和删除分支之间的区别。这个字符的差别是为什么git push origin --delete branchname通常是更安全的命令。

当你删除了branchname后,当你试图推送它时,git会说“我不知道branchname是什么,因为我没有那个名字的分支”,并且无法推送任何东西。

你可能会认为,删除本地分支只是将该分支标记为“已删除”,所以当你推送它时,originbranchname版本也会被标记为“已删除”,但这不是git删除分支的方式。当你在本地删除一个分支时,该分支永远消失了(尽管属于该分支的提交仍然存在,因此您可以通过查看git reflog来恢复它)。


至于关于HEAD的初始警告,git试图确保您不会丢失任何数据。

每个分支都可以与"上游"分支相关联,以便您可以使用git pushgit pull而无需指定显式的远程和显式的分支。当您删除一个分支时,git会检查上游分支,以查看您的本地分支是否有不存在于远程上游分支中的提交。如果您删除与远程相同的分支,则不会丢失任何数据,因为您可以再次检出它。如果您删除包含未推送到上游的提交的分支,则可能会丢失数据,因此git试图通过警告来帮助您,如果您删除具有未推送提交的分支,它会警告您。

但这只是一个警告,因为有很多情况下,您不关心某些提交。它们可能是失败的实验、未变基版本的合并分支或其他合法情况。


非常感谢您提供详细的答案,解释得非常清楚。 - spiderman

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