TL;DR:我推荐git fetch --prune,但通过不同的路线(将fetch.prune 设置为true,然后运行git fetch)。
更长
在我的 GitHub 中,我已经成功合并了我的 pull request 并删除了分支sec1。
如果您尚未完成删除操作,您随后的git push -d 命令会是正确的,并且会起作用。 GitHub 存储库中的分支已经消失了,再次尝试删除它失败了因为无事可做!
然后,我在本地删除我的分支。
请注意,他们的 sec1 是你的 origin/sec1;你自己的sec1 是你的 sec1。所以你现在已经删除了他们的 sec1 和你的 sec1。
但是,当我输入git branch -a 时,我仍然可以看到remotes/origin/sec1 分支
这实际上不是一个分支。那是你的 Git 对其 Git 分支名称的记忆。我更喜欢将其称为远程跟踪名称。
有两种方法可以让你的 Git 删除它:
-
使用git branch -r -d:-d 是删除标志,-r 标志告诉你的 Git 你感兴趣的不是 branch 名称,而是 远程跟踪名称。 (您现在使用的 -a 标志告诉您的 Git 您对 所有 名称感兴趣,即分支名称 和 远程跟踪名称。您只能将此与列表选项一起使用,而您可以使用 -r 选项来列出或删除。)
-
或者,让您的 Git 再次扫描 他们的(GitHub 的)分支并查看 他们的 sec1 已消失,因此您的 Git应该删除他们对sec1的记忆。
详情
第一个非常简单:命令
git branch -d -r origin/sec1
指示您的 Git 删除远程跟踪名称 origin/sec1。它消失了,你就完成了。但是烦人必须经常这样做。
请注意,您可以随时删除任何远程跟踪名称。运行时:
git fetch origin
或者只是:
git fetch
你的 Git——我所说的“你的 Git”是指你的 Git 软件,它与你的存储库一起工作,在你的笔记本电脑上本地——调用他们的 Git(存储库和 Git 软件在你克隆的 GitHub 上)。他们的 Git 列出了他们所有的分支名称以及与这些分支名称相关的提交哈希 ID。
您的 Git 现在决定哪些分支名称对您来说是“有趣的”。对于普通克隆,默认设置是“所有这些”,但您可以创建所谓的 single-branch 克隆,您的 Git 会丢弃除一个名称之外的所有名称。然后,您的 Git 会向他们的 Git 询问他们拥有而您没有的任何 提交,因为 Git 的真正目的是存储提交。因此,他们现在将他们拥有的任何提交打包,而您没有,您需要连同他们的分支名称一起提交,并将它们发送过来。那时您会看到以下内容:
remote: Counting objects: 100% ...
和:
Receiving objects: ...
等等:此时,您的 Git 正在将他们的 commits 添加到您的存储库中。
一旦您的 Git 安全地保存了他们所有的提交和其他支持对象,您的 Git 现在会更新 您的 Git 对 他们的 Git 分支的内存名字。这些是您的远程跟踪名称。您的 Git 只需获取它们的每个分支名称并将 origin/ 粘贴在它们前面。
(这里的origin/ 部分来自名称origin,这是我们在运行git fetch origin 时使用的名称。这个名称是一个远程。你可以有多个,但是git clone 使用名称origin 设置了第一个标准遥控器,在许多情况下这就是我们所需要的。所以origin 是你一直看到的那个。遥控器的#1 目的是记住URL: ssh://git@github.com/you/repo.git 或其他任何东西,这样您就不必每次都重新输入。)
远程跟踪名称是否永远存在
出于某种原因 - 可能是“错误地”,尽管只有那些在 2005 年左右发明这些东西的人1 可以肯定地说 - 谁发明了 遥控器 和remote-tracking names 决定默认情况下它们的工作方式是您的 Git 将其 Git 列出其分支名称,然后在您的 Git 获得所有提交后,您的 Git 将 为每个分支创建或更新一个远程跟踪名称。
嗯,暂时没关系。但是他们的 Git——在这种情况下,是 GitHub 上的那个——有时会有分支删除。如果您的 Git 只是添加远程跟踪名称,而从不删除它们,那么在某些时候你会运行:
git fetch origin
并获得:
origin/hoopy-frood
origin/zaphod
后来,其中一个或两个都消失了,但你的 Git 永远不会删除其中任何一个。所以你——或者你的 Git——将永远挂在他们的分支上,即使他们没有。
你当然可以一个一个地删除它们,但是让你的 Git注意,天哪,它们曾经有一个 @ 不是更有意义吗? 987654359@ 和 zaphod,但它们不再了吗?此时,您的 Git 可以自动删除您的 origin/hoopy-frood 和 origin/zaphod。
嗯,在远程跟踪名称发明之后的某个时间,终于有人开始将它放入 Git。他们添加了--prune 选项:
git fetch origin --prune
意味着在origin调用Git,列出他们的分支名称,获取他们的提交并创建或更新我的远程跟踪名称,哦顺便说一句也删除垃圾 请。 这应该是默认的,但是已经太迟了。
幸运的是,您可以将其设为您的默认。在您的 Git 配置中将 fetch.prune 选项设置为 true,它会成为 您的 默认值。使用:
git config --global fetch.prune true
在您的每用户配置中设置它,以便它适用于所有您的存储库。那么:
git fetch origin
将联系origin,列出他们的分支名称,获取他们的提交,并清理。运行 git fetch 而不特别指定 origin 将接触到适当的遥控器,无论是什么,2 并做同样的事情。
1很早的 Git没有这些。你每次都跑git fetch <em>url</em>,然后小心翼翼地从它留下的烂摊子中挑选出一些东西。 URL 的输入和内容的挑选都变得无聊和重复,并且有几种相互竞争的方法可以使这变得更容易。使用 remotes 和 remote-tracking names 的方法赢得了人气竞赛,但是如果您仔细阅读 git fetch 文档,您仍然可以看到各种其他方法的片段。
2如果您有多个遥控器,有时您会希望git fetch 从一个遥控器中获取,而有时您希望它从另一个遥控器中获取。 Git 根据 当前分支 的 upstream 设置确定使用哪一个,这通常是你想要的。
如果您希望git fetch 从所有 遥控器中获取,您可以使用git fetch --all。然而,如果你想要这种东西,通常最好改用git remote update,它有更好的控制。它默认更新所有遥控器,但可以让你做各种聪明的事情。详情请见the git remote documentation。