如何列出 Git 中所有远程现有分支?

Hum*_*um6 25 git

我尝试git remote -r查看所有远程现有分支,但发现结果包括那些远程删除的分支。

有没有办法过滤掉这些“僵尸”分支?

tor*_*rek 35

这个问题有几个可能的潜在含义,因此它有几个可能的答案。这里的关键问题是至少涉及两个不同的Git 存储库。

\n\n

遥控器

\n\n

在我们得到这两个答案之前,让我们先提一下,远程只是一个简短的名称,例如origin. 远程本身保存着你的 Git 调用其他 Git 的URL 。您可以拥有任意数量的遥控器。除了存储 URL 之外,您还可以使用遥控器执行其他操作,但存储 URL 是主要的事情。该git remote命令是用于使用遥控器的主要面向用户的命令,但由于最初git clone 创建了为您命名的遥控器origin,因此您几乎永远不需要使用git remote.

\n\n

远程跟踪名称

\n\n

您计算机上的 Git 会保存并更新您的Git 存储库。你的 Git 有你的分支名称、标签名称和其他名称,以及提交的集合。提交是您的 Git 与其他 Git 存储共享的部分,尽管也存在一定程度的名称共享。

\n\n

同时,因为你的 Git 之前调用过另一个 Git,并且记住了名称下的另一个 Git 的URLorigin,所以你的 Git也会记住它们的Git 分支名称。为此,您的 Git 在存储库中创建远程跟踪名称1 ,例如origin/master. 这些名称只是记住,上次您的 Git 在 处调用其他 Git 时origin它们它们 master是某个特定的哈希 ID。

\n\n

当您运行git fetch origin(或者只是git fetch,如果只有一个名为 的远程origin)时,您的 Git 会在此时调用另一个 Git,获取它们拥有但您没有的任何新提交,并更新所有远程跟踪origin/*名称。

\n\n

运行git branch -r将列出您的远程跟踪名称,从而git branch -r显示您的 Git 在其 Git 中看到的内容,以及您的 Git 上次使用其 Git 更新时的内容。请注意,git branch -a包括,但在名称前面git branch -r添加了该单词。2remotes/origin/master

\n\n

然而,这里出现的一个问题是他们可以删除一些分支名称。例如,假设他们的 Git一个名为昨天的分支feature/tall,但不再有该分支。您的 Git 昨天调用了他们的 Git,并创建或更新了您的文件origin/feature/tall以匹配他们的feature/tall. 现在,您的 Git 调用他们的 Git,但他们没有列出feature/tall.

\n\n
    \n
  • 默认情况下,您的 Git 对此不执行任何操作。

  • \n
  • 但是,如果您运行git fetch --prune,您的 Git 会像往常一样调用他们的 Git,列出他们所有的分支名称,并发现您有一个过时的 origin/feature/tall,在他们有 时恢复feature/tall,并将其删除

  • \n
\n\n

因此,一般来说,您应该添加--prune到每个git fetch,以便您的 Git 远程跟踪名称在您的 Git 发现它们过时后立即被删除(但不会在此之前)。您可以将Git配置为自动执行此操作:

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

您可以将 Git 配置为在您的笔记本电脑或您使用的任何机器上将其作为所有存储库的默认设置:

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

请参阅文档以获取git config实际可以执行的所有操作的(很长)列表git config

\n\n
\n\n

1 Git 文档主要将这些远程跟踪分支名称称为 ,但我认为如果我们将“分支”一词排除在外,那么含义最终会更清晰。

\n\n

2 Git 的所有名称\xe2\x80\x94 分支名称、标记名称、远程跟踪名称和其他此类名称\xe2\x80\x94 都存在于命名空间中,并且具有更长的完全限定名称以使其明确。例如,您的master分支实际上是refs/heads/master;你的标签v1.2,如果你有的话,是真的refs/tags/v1.2。远程跟踪名称如origin/masterare true refs/remotes/origin/master

\n\n

当显示这些缩写名称时,Git 通常会去掉refs/heads/分支名称的部分、refs/tags/标记名称的部分和refs/remotes/远程跟踪名称的部分。由于某种原因,git branch -a仅在显示远程跟踪名称时才剥离该refs/部分,即使git branch -r剥离了该refs/remotes/部分。(我不清楚其原因。)

\n\n
\n\n

远程分支名称

\n\n

因为这里涉及到第二个 Git,所以您也可以让 Git现在调用它,让它列出所有分支名称,然后让 Git 打印这些名称。该git ls-remote命令正是这样做的:

\n\n
git ls-remote origin\n
Run Code Online (Sandbox Code Playgroud)\n\n

调用位于 的 Git origin,让他们列出自己的分支和标签以及其他此类名称,然后打印所有这些名称。(它不会更新您的任何远程跟踪名称:留给git fetch,也留给git remote update。)

\n\n

git remote show命令还可以调用其他 Git 并直接从中获取信息并显示出来。有时会,有时不会。这有记录的,尽管不是很清楚;有关详细信息,参阅文档。git remote

\n\n

概括

\n\n
    \n
  • git branch -r显示您的 Git 远程跟踪名称。这很快,因为它完全是本地的。但它可能已经过时了。

  • \n
  • git fetch更新 Git 的远程跟踪名称;添加-p--prune使其清除陈旧的,或设置fetch.prune为 true。这很慢,因为它还添加了他们拥有的您没有的任何新提交,但之后,您的远程跟踪名称可以快速使用。

  • \n
  • git remote update基本上与 做同样的事情git fetch。由于git fetch输入较短,我建议git fetch改为使用。

  • \n
  • git ls-remote调用另一个 Git 并获取其分支名称。这有点慢,但不像git fetch有新提交那么慢,因为它不获取提交\xe2\x80\x94,仅获取名称和相应的哈希 ID。

  • \n
  • git remote show有时在本地工作,有时调用其他 Git。我发现它的行为有点令人困惑并且没有多大帮助,并且通常建议避免它。
  • \n
\n


Cod*_*ard 12

列出分支:

\n
# -a = all branches\n$ git branch -a\n\n# -r = remote branches\n$ git branch -r\n
Run Code Online (Sandbox Code Playgroud)\n
\n

删除分支

\n

git fetch

\n

git fetch将使用远程存储库的内容更新本地存储库。

\n

添加--prune将从远程删除已删除的分支,但如果检出它们,则不会在本地删除它们

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

git remote prune

\n

为了清理远程跟踪分支,即删除对不存在的远程分支的引用,请使用 \xe2\x80\x9cgit Remote prune\xe2\x80\x9d 命令并指定远程名称。

\n
$ git remote prune <remote name>\n
Run Code Online (Sandbox Code Playgroud)\n