【问题标题】:How to delete a remote branch locally after deleting the branch in GitHub?GitHub中删除分支后如何在本地删除远程分支?
【发布时间】:2021-12-11 23:44:33
【问题描述】:

在我的 GitHub 中,我已成功合并我的拉取请求并删除了分支 sec1。然后,我在本地删除我的分支。但是,当我输入git branch -a 时,我仍然可以看到remotes/origin/sec1 分支,如下所示

* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/sec1

然后,我尝试git push origin --delete sec1,但它给了我这个错误:

error: failed to push some refs to https:/.../

有人可以帮忙吗?

【问题讨论】:

  • 你是如何删除你的分支的?错误消息中是否有任何其他信息?
  • 尝试运行git fetch --allgit 可能还不知道遥控器上发生了什么,但
  • 如果远程分支已经被删除,问题应该不是“如何在本地删除分支”...
  • @EliranMalka 当然

标签: git github git-branch


【解决方案1】:

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-froodorigin/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 的输入和内容的挑选都变得无聊和重复,并且有几种相互竞争的方法可以使这变得更容易。使用 remotesremote-tracking names 的方法赢得了人气竞赛,但是如果您仔细阅读 git fetch 文档,您仍然可以看到各种其他方法的片段。

2如果您有多个遥控器,有时您会希望git fetch 从一个遥控器中获取,而有时您希望它从另一个遥控器中获取。 Git 根据 当前分支upstream 设置确定使用哪一个,这通常是你想要的。

如果您希望git fetch所有 遥控器中获取,您可以使用git fetch --all。然而,如果你想要这种东西,通常最好改用git remote update,它有更好的控制。它默认更新所有遥控器,但可以让你做各种聪明的事情。详情请见the git remote documentation

【讨论】:

    【解决方案2】:

    要删除远程分支,我们不使用git branch 命令,而是使用带有--delete 标志的git push

    它应该看起来像这样:

    $ git push origin --delete feature/login
    
    $ git push <name-of-remote-repository> --delete <branch-name>
    

    【讨论】:

      【解决方案3】:

      远程试试这个:

        git push -d origin <Branch-Name>
      

      本地:

      git branch -D <Branch-Name>
      

      编辑:

      不知道为什么我投了反对票。我的回答有效:

      【讨论】:

        猜你喜欢
        • 2018-09-29
        • 2016-07-08
        • 2021-08-22
        • 2011-01-01
        相关资源
        最近更新 更多