【问题标题】:Deleting remote branches in git: understanding it for once and for all在 git 中删除远程分支:一劳永逸地理解它
【发布时间】: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


【解决方案1】:

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

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

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

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

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

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

git remote prune origin

【讨论】:

  • 所以我说git push origin :topic1 不会删除跟踪引用是否正确?那么运行以清理跟踪参考的“完整”命令是什么?对两者都有一个干净的命令会很好。
  • @RobertDailey 是的,远程跟踪分支仍然存在,正如我在这里提到的:stackoverflow.com/a/12276576/6309
  • @RobertDailey 所以你需要 2 个命令,但正如我在 edited 答案中提到的,git remote prune 可以提供帮助。
  • 感谢 VonC,我修改了我的问题以澄清“远程”一词似乎超载,这就是我感到困惑的原因,所以希望人们会阅读它,它会在未来帮助他们。您的回答非常好,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2016-07-20
  • 2017-06-16
  • 1970-01-01
相关资源
最近更新 更多