删除GitHub分支后如何在本地删除远程分支?

mic*_*lle 0 git github git-branch

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

* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/sec1
Run Code Online (Sandbox Code Playgroud)

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

error: failed to push some refs to https:/.../
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮忙解决这个问题吗?

tor*_*rek 7

TL;DR:我建议git fetch --prune,但通过不同的路线(设置fetch.prunetrue然后运行git fetch)。

\n

更长

\n
\n

在我的 GitHub 中,我已成功合并我的拉取请求并删除了分支sec1

\n
\n

如果您尚未完成删除,您的后续git push -d命令将是正确的并且会起作用。GitHub 存储库中的分支已经消失,再次尝试删除它会失败,因为无事可做

\n
\n

然后,我在本地删除我的分支。

\n
\n

请注意,他们的 sec1就是你的 origin/sec1;你自己的sec1就是你的 sec1。所以您现在已经删除了他们 sec1您的 sec1.

\n
\n

但是,当我输入 时git branch -a,我仍然可以看到remotes/origin/sec1分支

\n
\n

那实际上不是一个分支。这是你的 Git 对其 Git 分支名称的记忆。我更喜欢称其为远程跟踪名称

\n

有两种方法可以让你的 Git 删除它:

\n
    \n
  • 使用git branch -r -d: 是-d删除标志,该标志告诉您的 Git 您对分支-r名称不感兴趣,而是对远程跟踪名称感兴趣。(您现在使用的标志告诉您的 Git 您对所有名称都感兴趣,即分支名称远程跟踪名称。您只能将其与列表选项一起使用,而您可以使用列出或用于删除。)-a-r

    \n
  • \n
  • 或者,让你的 Git 再次扫描他们的(GitHub 的)分支,发现他们 sec1已经消失了,因此你的 Git 应该删除他们的sec1.

    \n
  • \n
\n

细节

\n

第一个非常简单:命令

\n
git branch -d -r origin/sec1\n
Run Code Online (Sandbox Code Playgroud)\n

指示您的 Git 删除远程跟踪名称origin/sec1。它消失了,你就完成了。但经常这样做很烦人。

\n

请注意,您可以随时删除任何远程跟踪名称。当你跑步时:

\n
git fetch origin\n
Run Code Online (Sandbox Code Playgroud)\n

要不就:

\n
git fetch\n
Run Code Online (Sandbox Code Playgroud)\n

你的 Git\xe2\x80\x94 通过“你的 Git”我的意思是你的 Git 软件,与你的存储库一起工作,在你的笔记本电脑上\xe2\x80\x94 本地调用他们的 Git(存储库和 Git 软件位于你克隆的 GitHub 上) 。他们的 Git 列出了所有分支名称以及与这些分支名称相关的提交哈希 ID。

\n

现在,您的 Git 会决定您对哪些分支名称“感兴趣”。对于普通克隆,默认值是“全部”,但您可以创建一个所谓的单分支克隆,其中您的 Git 会丢弃除一个名称之外的所有名称。然后,您的 Git 会向他们的 Git 询问您没有的任何提交,因为 Git 的真正目的是存储提交。因此,他们现在将他们拥有的、您没有的、您需要的所有提交与他们的分支名称一起打包,然后将其发送出去。这时你会看到类似这样的东西:

\n
remote: Counting objects: 100% ...\n
Run Code Online (Sandbox Code Playgroud)\n

和:

\n
Receiving objects: ...\n
Run Code Online (Sandbox Code Playgroud)\n

等等:此时,您的 Git 正在将其提交添加到您的存储库中。

\n

一旦您的 Git 安全地保存了所有提交和其他支持对象,您的 Git 现在就会更新Git分支名称Git 内存。这些是您的远程跟踪名称。你的 Git 只需获取它们的每个分支名称并粘贴在它们前面。origin/

\n

origin/这里的部分来自 name origin,这是我们运行时使用的git fetch origin。这个名称是一个遥控器。您可以有多个,但git clone使用名称设置第一个标准遥控器origin,在很多情况下,这是我们所需要的一切。origin您一直看到的也是如此。遥控器的第一目的是记住 URL ssh://git@github.com/you/repo.git其他任何内容,这样您就不必每次都重新输入。)

\n

远程跟踪名称是否永久

\n

出于某种原因\xe2\x80\x94可能是“错误”,尽管只有那些在2005年左右发明这些东西的人才能肯定地说\xe2\x80\x94发明遥控器远程跟踪名称的人决定他们的方式默认情况下,您的 Git 会列出其分支名称,然后在您的 Git 获取所有提交后,您的 Git 将为每个分支创建或更新远程跟踪名称。

\n

嗯,暂时这样就好了。但是他们的Git\xe2\x80\x94 在这种情况下,GitHub\xe2\x80\x94 上的那个有时会删除分支。如果您的 Git 仅添加远程跟踪名称,并且从不删除它们,那么在某个时候您可以运行:

\n
git fetch origin\n
Run Code Online (Sandbox Code Playgroud)\n

并获得:

\n
origin/hoopy-frood\norigin/zaphod\n
Run Code Online (Sandbox Code Playgroud)\n

后来,其中一个或两个都消失了,但您的 Git 永远不会删除其中任何一个。所以你\xe2\x80\x94或你的Git\xe2\x80\x94将永远挂在它们的分支上,即使它们没有。

\n

您当然可以将它们一一删除,但是如果您的 Git 注意到天哪,它们曾经有 ahoopy-frood和 a zaphod,但现在不再有,这不是更有意义吗?此时,您的 Git 可能会自动删除您的origin/hoopy-frood和。origin/zaphod

\n

好吧,在远程跟踪名称发明一段时间,终于有人抽出时间将其放入 Git 中。他们添加了以下--prune选项:

\n
git fetch origin --prune\n
Run Code Online (Sandbox Code Playgroud)\n

意味着调用 Git origin,列出他们的分支名称,获取他们的提交并创建或更新我的远程跟踪名称,哦,顺便也请删除这些残骸这应该是默认的,但现在已经太晚了。

\n

幸运的是,您可以将其设为默认。在您的 Git 配置中将该fetch.prune选项设置为true,它将成为您的默认选项。使用:

\n
git config --global fetch.prune true\n
Run Code Online (Sandbox Code Playgroud)\n

在您的每用户配置中进行设置,以便它适用于您的所有存储库。然后:

\n
git fetch origin\n
Run Code Online (Sandbox Code Playgroud)\n

将联系origin,列出他们的分支名称,获取他们的提交,并进行清理git fetch在没有特别指定的情况下运行origin将到达适当的遥控器,无论是什么,2并做同样的事情。

\n
\n

1很早的 Git没有这些。你每次都跑,然后小心翼翼地从它留下的烂摊子里捡起东西。输入 URL 和挑选内容都变得无聊且重复,并且有几种相互竞争的方法可以使这变得更容易。使用遥控器远程跟踪名称的方法赢得了人气竞赛,但如果仔细阅读文档,您仍然可以看到各种其他方法的一部分。git fetch urlgit fetch

\n

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

\n

如果您想从所有git fetch遥控器获取数据,可以使用. 然而,如果您想要这种事情,通常最好切换到 using ,它具有更好的控制能力。它默认更新所有遥控器,但可以让您做各种聪明的事情。有关详细信息,参阅文档。git fetch --allgit remote updategit remote

\n