5

我真的要疯了。坦率地说,我不确定为什么我无法理解这一点,因为它应该很简单,对吧?首先,我对此进行了大量搜索。我在 stackoverflow 上读过很多东西,我读过通过大量谷歌搜索找到的博客文章。然而,一些细节仍然不清楚,尽管这个问题看起来很重复和简单,所以我提前向那些悬停在否决/关闭按钮上的人道歉。我今天在这里发帖的原因是因为我在命令行上看到的行为与我在网上实际阅读的不同。所以这让我很困惑。

这里有问题的两个命令是:

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/develop,所以我不知道它为什么这样做。

我想知道为什么会发生这种情况,而且(为了解决这个问题的更笼统的标题,并可能帮助其他所有人清除堆栈溢出以找到这些令人困惑的歧义的答案),我想更一般地回答一些问题:

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

感谢大家!请救救我的头发!

编辑(答案摘要)

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

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

让我感到困惑的是被认为是“远程”的东西。最初,对我来说,远程意味着“起源”......在我的情况下,“github”上的内容。但是,在您的 LOCAL 克隆中,github 对什么是远程有自己的概念,这是它自己的远程分支副本。所以基本上删除远程分支似乎涉及两个步骤:删除源分支(这是git push origin :topic1),然后删除远程跟踪分支(git branch -rb origin/topic1)。

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

4

1 回答 1

2

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

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

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

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

  • 一个简单的分支
  • 远程跟踪分支(由 fetch 创建的分支)
  • 一个本地跟踪分支(因为它有一个与之关联的上游分支

如“如何删除所有已合并的 git 分支? ”中所述,一旦删除了远程仓库的多个分支,您可以使用以下命令修剪本地仓库的所有远程跟踪分支:

git remote prune origin
于 2014-02-01T14:12:40.003 回答