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

时间:2014-07-07 20:13:20

标签: git

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

我过去做的步骤是: [第一种方法]

  1. git branch -d branchname
  2. git push origin:branchname
  3. 今天我尝试使用相同的上述步骤删除,但遇到了如下所述的问题:

    $ 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
    

    问题,

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

    修改

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

1 个答案:

答案 0 :(得分:6)

在你的第一个例子中,推送失败的原因是因为你做了

git push origin branchname

而不是

git push origin :branchname

结肠显着;这是推动分支和删除分支之间的区别。这里的单字符差异是为什么git push origin --delete branchname通常是一个更安全的命令。

由于您已删除branchname,当您尝试推送git时,branchname说“我不知道origin是什么,因为我没有这个名称的分支“并没有推动任何事情。

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


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

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

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