删除git中的远程分支:一劳永逸地理解它

我真的为此疯狂了.坦率地说,我不确定为什么我理解这一点,因为它应该很简单,对吧?首先,我已经对此进行了大量的搜索.我已经在stackoverflow上阅读了很多东西,我读过通过大量Google搜索找到的博客文章.然而,一些细节仍然不清楚,尽管这个问题可能看似重复和简单,所以我向那些正在徘徊在downvote / close按钮上的人们道歉.我今天在这里发布的原因是因为我在命令行上看到的行为与我实际在线阅读的行为不同.所以它让我困惑.

这里讨论的两个命令是:

git branch -r -d origin/topic1

git push origin :topic1

到目前为止我的理解(虽然我可能完全错了,但我的大脑已被炸掉):

>第一个应该删除跟踪引用和远程分支
>第二个应该删除远程分支但不是跟踪引用(如果存在本地分支),虽然你不会删除跟踪引用的原因似乎毫无意义并且让我感到困惑,因为它是一种初学者.

这是我最近遇到的一个场景.我刚刚克隆了一个带有两个远程分支的存储库:

origin/master
origin/develop

我唯一的本地分支是:

master

我想删除远程分支origin / develop,所以请看这个:

Robert@COMP /c/Code/project (master)
$git branch -rd origin/develop
Deleted remote branch origin/develop (was 9ff16e8).

Robert@COMP /c/Code/project (master)
$git fetch
From github.com:username/project
 * [new branch]      develop    -> origin/develop

如您所见,我尝试删除远程分支,并立即从origin获取最新更改,但由于某种原因,它重新创建了分支.我不知道为什么会这样做,我很困惑.我没有原始/开发的本地相应分支,所以我不知道它为什么这样做.

我想知道为什么会发生这种情况,而且(为了解决这个问题的更一般的标题,并且可能帮助其他人清理堆栈溢出以寻找这些令人困惑的模糊性的答案),我想对一些问题进行更一般的回答:

>有两种方法可以删除远程分支.什么是一个非常好,简单的方法来记住在哪种情况下使用哪一个?
>假设它很重要,相应的本地分支(对于远程分支)的存在如何影响远程分支如何被删除的决定?
>本地和远程分支之间是否存在跟踪引用/关系会影响您选择删除分支的方式,以及删除分支的哪些方法也会清除跟踪引用?

感谢大家!请保存我的头发!

编辑(答案摘要)

根据下面的答案,我能够澄清一件令人困惑的事情. git分支状态的-r选项的文档:

List or delete (if used with -d) the remote-tracking branches.

我的困惑在于被认为是“远程”.最初对我来说远程意味着“起源”……在我的案例中,“github”就是什么.但是,在你的LOCAL克隆中,github有自己的遥控器概念,这是它自己的远程分支副本.所以基本上似乎删除远程分支包括两个步骤:删除原始分支(这是git push origin:topic1),然后删除远程跟踪分支(git branch -rb origin / topic1).

这有助于我的理解,虽然因为“远程”这个词在这里有两个含义,所以把它传达给人们非常困惑,所以我希望我的问题的这个修正可以帮助将来的人.感谢所有回答的人,以及将来继续为这个问题做出贡献的人!

最佳答案

The first should remove both the tracking reference and the remote branch

否:它是本地操作,因此它只能删除远程跟踪分支(在您的仓库中)

远程跟踪分支用于记住从远程仓库上的分支获取的最后一个SHA1.
如果你想删除那个分支(在远程仓库上),你需要告诉远程仓库(因此git push:topic1)

本地分支(您的仓库中的一个)可以是:

>一个简单的分支
>远程跟踪分支(由提取创建的分支)
>本地跟踪分支(因为它有一个与之关联的upstream branch)

如“How can I delete all git branches which are already merged?”中所述,一旦删除了远程仓库的多个分支,就可以使用以下方法修剪本地仓库的所有远程跟踪分支:

git remote prune origin
点赞