Git 为什么按名称删除远程分支会产生错误,而按ref删除不会产生错误?

Git 为什么按名称删除远程分支会产生错误,而按ref删除不会产生错误?,git,branch,git-push,remote-branch,Git,Branch,Git Push,Remote Branch,当我试图按名称删除一个不存在的远程Git分支时,我预期会得到一个错误: $ git push origin --delete non/existent error: unable to delete 'non/existent': remote ref does not exist error: failed to push some refs to 'git@github.com:<_replaced_>.git' $ echo $? 1 $ git push origin --

当我试图按名称删除一个不存在的远程Git分支时,我预期会得到一个错误:

$ git push origin --delete non/existent
error: unable to delete 'non/existent': remote ref does not exist
error: failed to push some refs to 'git@github.com:<_replaced_>.git'
$ echo $?
1
$ git push origin --delete refs/heads/non/existent
remote: warning: Deleting a non-existent ref.
To github.com:<_replaced_>.git
 - [deleted]         non/existent
$ echo $?
0

为什么会这样?这些命令等效吗?

它们不等效

ref要么是完全限定的,即以
refs/
开头,因此是明确的,要么不是完全限定的,即以
refs/
以外的内容开头

必须将非完全限定的ref转换为完全限定的ref。进行限定取决于
git push
的目标。如果没有找到完全限定的ref,它会向git push的源报告它无法限定ref

一个完全限定的ref当然已经完全限定了,所以接收Git只说“好的,那不存在”,因此请求删除的Git很乐意报告ref不存在。因此,运行Git push--delete的Git很高兴,认为一切都很好

有人可能会争辩说,Git执行
Git push
是有道理的,因为Git意识到“我不能为您限定该ref”可能意味着“我没有任何匹配的ref”,这反过来意味着“无论您是什么ref,它都不存在”,这可能会让运行
Git push的Git高兴——删除
。但事实并非如此


请注意,对于匹配两个或多个可能性的不明确ref,我观察到以下情况:

server-repo$ git for-each-ref
11ae6ca18f6325c858f1e3ea2b7e6a045666336d commit refs/heads/ambig
222c4dd303570d096f0346c3cd1dff6ea2c84f83 commit refs/heads/branch
e068bdfce2fd992dc396cb4969327ef5c4d39a43 commit refs/heads/fix-signal
d41117433d7b4431a188c0eddec878646bf399c3 commit refs/heads/foobranch
11ae6ca18f6325c858f1e3ea2b7e6a045666336d commit refs/heads/master
11ae6ca18f6325c858f1e3ea2b7e6a045666336d commit refs/tags/ambig
d41117433d7b4431a188c0eddec878646bf399c3 commit refs/tags/tag-foo
以及:

client-repo$ git push --delete origin ambig
error: dst refspec ambig matches more than one
error: failed to push some refs to [server URL]