【发布时间】:2014-02-25 06:16:01
【问题描述】:
我真的为此发疯了。坦率地说,我不确定为什么我无法理解这一点,因为它应该很简单,对吧?首先,我对此进行了大量搜索。我在 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的本地对应分支,所以不知道为什么会这样。
我想知道为什么会发生这种情况,而且(为了解决这个问题的更笼统的标题,并可能帮助其他所有人清除堆栈溢出以找到这些令人困惑的歧义的答案),我想要更笼统的答案一些问题:
- 有两种方法可以删除远程分支。什么是一种非常好的、简单的方法来记住在什么情况下使用哪个?
- 假设它很重要,对应的本地分支(对于远程分支)的存在如何影响远程分支删除的决定?
- 本地和远程分支之间的跟踪引用/关系的存在如何影响您选择删除分支的方式,以及删除分支的哪些方法也会清理跟踪引用?
谢谢大家!请救救我的头发!
编辑(答案摘要)
根据下面的答案,我能够澄清一件令人困惑的事情。 git branch 的 -r 选项的文档说明:
列出或删除(如果与 -d 一起使用)远程跟踪分支。
让我感到困惑的是被认为是“远程”的东西。最初,对我来说,远程意味着“起源”......在我的情况下,“github”上的内容。但是,在您的 LOCAL 克隆中,github 对什么是远程有自己的概念,这是它自己的远程分支副本。所以基本上删除远程分支似乎涉及两个步骤:删除源分支(这是git push origin :topic1),然后删除远程跟踪分支(git branch -rb origin/topic1)。
这有助于我的理解,虽然因为“远程”这个词在这里有两个含义,所以与人们交流这个问题非常混乱,所以我希望对我的问题的这个修改对未来的人们有所帮助。感谢所有回答并在未来继续为这个问题做出贡献的人!
【问题讨论】:
-
Git 文档有一个非常糟糕的习惯,即使用不同含义的同一个词。它应该是“从上下文中显而易见的”,但并非总是如此,对于 git 的新手(或轻度使用它的人)来说,它可能永远变得显而易见。
标签: git git-branch git-remote remote-repository