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

时间:2014-02-01 13:59:18

标签: git

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

这里提出的两个命令是:

git branch -r -d origin/topic1

git push origin :topic1

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

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

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

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获取最新的更改,但由于某种原因,它重新创建了分支。我不知道为什么会这样做,我很困惑。我没有origin/develop的本地相应分支,所以我不知道为什么会这样做。

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

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

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

编辑(答案摘要)

根据下面的答案,我能够澄清一件令人困惑的事情。 -rgit branch选项的文档:

  

列出或删除(如果与-d一起使用)远程跟踪分支。

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

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

1 个答案:

答案 0 :(得分:2)

  

第一个应该删除跟踪引用和远程分支

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

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

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

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

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

git remote prune origin