如何删除名称为 remote/origin 的本地主机上的旧 git 分支

how to delete old git branches on localhost with remote/origin in name

我看到很多关于删除旧分支的交易,但是我的困惑是删除名称中带有 remote/origin/feature 的旧分支。

以下是我想在本地而不是远程删除的几个分支:

remotes/origin/feature/ghost-user-view2
remotes/origin/feature/ghosting-records-handling
remotes/origin/feature/profile-sync-fix

我试过了git branch -D feature/profile-sync-fix

那没用。我很紧张地尝试了很多并删除了一些我无法取回的东西。在不影响远程分支的情况下在本地处理它的正确方法是什么?

如您所知:在 git 中,一切都是本地的。你的历史是本地的,你的标签是本地的,你的分支是本地的。对于远程分支机构来说也是如此,尽管我理解您对该主题的不安全感。

与 git 中的任何分支一样,远程分支只是对特定提交的引用。 Git 只是认为这个分支因其命名而有所不同。通常所有本地分支都可以在 refs/heads 中的 .git 目录中找到,另一方面,远程分支位于 refs/remotes 中(以及 refs/tags 中的标签)。否则这个概念与 "usual" branches.

没有区别

编辑: 正如 Jubobs 在评论中所建议的:术语 remote-tracking branch 不那么令人困惑,应该暗示为什么这样的分支是本地的。他们只是在跟踪一个远程分支,而不是在远程本身。

现在你应该明白了,虽然git branch -r列出了远程分支,但分支仍然完全是本地的。


但是 git 怎么知道把遥控器的 branches/changes 放在哪里呢?

好吧,这很简单,都在您可以在 .git/config 中找到的存储库配置中;在这里你可以找到你的遥控器(如果你有的话)的配置,它看起来应该与此非常相似:

[remote "origin"]
    url = /this/is/the/url/to/my/remote
    fetch = +refs/heads/*:refs/remotes/origin/*

有趣的部分是这个小文本片段:fetch = +refs/heads/*:refs/remotes/origin/*

它有什么作用?

它告诉 git 从 refs/heads 获取远程存储库的所有分支(其中包含所有本地分支)并 "map" 所有这些分支到 [=20= 中的分支](在我们的本地存储库中)。


TL;DR: git branch -rd只会删除一个本地分支。远程存储库中分支的本地副本。