git:将删除的分支推送到远程

spi*_*man 5 git

目标:删除名为'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'
Run Code Online (Sandbox Code Playgroud)

最后我能够通过不同的方法删除,[第二种方法]

$ git push origin --delete branchname
Run Code Online (Sandbox Code Playgroud)

题,

你知道为什么我不能按照第一种方法删除远程分支吗?还有,为什么要警告?

编辑:

我尝试通过创建和删除远程分支来复制第一个问题,这次我做的唯一更改是在我错过早期的branchname之前添加冒号,并且它被删除了.不确定这是否是之前的原因.

tbe*_*lay 6

在您的第一个示例中,推送失败的原因是因为您这样做了

git push origin branchname
Run Code Online (Sandbox Code Playgroud)

代替

git push origin :branchname
Run Code Online (Sandbox Code Playgroud)

结肠很重要; 这是推动分支和删除分支之间的区别.这里的单字符差异是为什么git push origin --delete branchname一般来说使用命令要安全得多.

既然你已经删除了branchname,当你试图推送它时,git说"我不知道是什么branchname,因为我没有这个名字的分支"并且没有推动任何东西.

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


至于最初的警告HEAD,git试图确保你不会丢失任何数据.

每个分店都可以有与之相关联的"上游"的分支,让你可以使用git pushgit pull无需指定明确的远程和分支明确.删除分支时,请git检查上游分支以查看本地分支是否具有远程上游分支中不存在的提交.您不会通过删除与遥控器相同的分支来丢失任何数据,因为您可以再次检查它.如果删除包含尚未向上游推送的提交的分支,则可能会丢失数据,因此如果删除具有未提交提交的分支,请git尝试通过警告您来帮助您.

这只是一个警告,因为在很多情况下你不关心某些提交.他们可能是失败的实验,合并分支的非重新定义版本,或其他一些合法的情况.