如何在 Git 1.7+ 中列出所有远程分支?

Posted

技术标签:

【中文标题】如何在 Git 1.7+ 中列出所有远程分支?【英文标题】:How do I list all remote branches in Git 1.7+? 【发布时间】:2011-03-29 03:52:06 【问题描述】:

我试过git branch -r,但它只列出了我在本地跟踪的远程分支。如何找到我没有的列表? (命令是列出所有个远程分支还是只列出那些未跟踪的分支对我来说并不重要。)

【问题讨论】:

你的意思是你已经修改了默认的refspec,所以git fetchgit remote update 不会获取远程的所有分支?因为否则你可以只取然后使用git branch -r... 我必须有。 git branch -r 只显示了我在本地跟踪的远程分支。现在效果更好了。 【参考方案1】:
git branch -a | grep remotes/*

【讨论】:

这基本上相当于git branch -r,OP 说它不够好。 实际上git branch -agit branch -r 都为我列出了所有远程分支,我不确定OP 所说的是否属实。我刚刚设置了一个测试存储库并验证了这一点(只有主跟踪源/主,但仍然看到所有带有两个标志的远程分支)。 如果我从现有的提取仓库克隆然后手动将源指向 git 服务器,这似乎没有列出所有远程分支。接受的答案处理这种情况。 这个解决方案似乎没有列出自我上次获取以来创建的远程分支。 奇怪的是:多年来我一直使用git fetch,然后是git branch -a,直到最近我才开始失败。也许 git 行为发生了变化?【参考方案2】:

对于这里的绝大多数[1] 访问者,the correct and simplest answer to the question“如何列出 Git 1.7+ 中的所有远程分支?”是:

git branch -r

对于少数人[1]git branch -r 不起作用。如果git branch -r 不起作用,请尝试:

git ls-remote --heads <remote-name>

如果git branch -r 不起作用,那么可能就像Cascabel 所说的"you've modified the default refspec, so that git fetch and git remote update don't fetch all the remote's branches"。


[1] 截至 2018 年 2 月撰写此脚注时,我查看了 cmets,发现 git branch -r 适用于绝大多数(大约 90% 或 125 out 140)。

如果git branch -r 不起作用,请按照this answer 检查git config --get remote.origin.fetch 是否包含通配符(*

【讨论】:

你也可以git ls-remote [url] 这样你就不用先克隆了:) @Stephan:你确定吗? git branch -r也对我不起作用。它只是列出已经在本地跟踪的分支。但是git ls-remote --heads 列出了远程存储库上所有可用的分支... 不要忘记在获取当前所有远程分支之前执行git fetch --all 这个答案的第一部分是错误的。开箱即用,无需在任何地方修改 refspec,git branch -r 根本不会在所有情况下列出所有远程分支。此外,由于它不能可靠地获取所有分支,因此在其他“90%”的情况下也不应该信任它。 提一下 git fetch 应该先运行是个好主意吧?【参考方案3】:

但是

git branch -ar

应该这样做。

【讨论】:

传入两个参数是多余的。 -r返回远程分支。 -a 返回本地 远程分支。因此,git branch -agit branch -ar 都产生相同的输出。【参考方案4】:

remote show 显示远程上的所有分支,包括本地未跟踪的分支,甚至包括尚未获取的分支。

git remote show <remote-name>

它还尝试显示分支相对于本地存储库的状态:

> git remote show origin
* remote origin
  Fetch URL: C:/git/.\remote_repo.git
  Push  URL: C:/git/.\remote_repo.git
  HEAD branch: master
  Remote branches:
    branch_that_is_not_even_fetched new (next fetch will store in remotes/origin)
    branch_that_is_not_tracked      tracked
    branch_that_is_tracked          tracked
    master                          tracked
  Local branches configured for 'git pull':
    branch_that_is_tracked merges with remote branch_that_is_tracked
    master                 merges with remote master
  Local refs configured for 'git push':
    branch_that_is_tracked pushes to branch_that_is_tracked (fast-forwardable)
    master                 pushes to master                 (up to date)

【讨论】:

没错。未获取,未在本地跟踪。 branch_that_is_not_tracked tracked ? @PiotrDobrogost 是的! branch_that_is_not_tracked 是一个不被任何本地 git 分支跟踪的分支。但是,它已被提取到本地存储库(因此有一个远程分支)。出于某种奇怪的原因git remote show 将此状态称为tracked,即使没有跟踪远程的本地分支。在这种情况下,tracked 的反义词是new,意思是“未获取”。 这不能以编程方式工作,太难解析 这遇到了一个特殊情况,我在本地拉了一个远程分支,然后在远程上删除了该分支。然后git branch -r 表明还有一个远程分支,但是git remote show origin 表明refs/remotes/origin/my-now-dead-branch stale (use 'git remote prune' to remove)。更有用!【参考方案5】:

您也可以在git fetch 后面加上git branch -r。如果没有 fetch,您将看不到最新的分支。

【讨论】:

git fetch --all 拥有所有当前分支【参考方案6】:

使用git branch -r 列出所有远程分支,git branch -a 列出本地和远程的所有分支。但是这些列表已经过时了。要使这些列表保持最新,请运行

git remote update --prune

这将使用来自远程的所有新分支更新您的本地分支列表,并删除任何不再存在的分支。在没有 --prune 的情况下运行此更新命令将检索新分支,但不会删除不再在远程上的分支。

您可以通过指定遥控器来加速此更新,否则它将从您添加的所有遥控器中提取更新,就像这样

git remote update --prune origin

【讨论】:

这解决了我的问题 - 'git branch -r' 现在对我有用。【参考方案7】:

确保您列出的远程源确实是您想要的存储库,而不是较旧的克隆。

【讨论】:

【参考方案8】:

运行的最佳命令是git remote show [remote]。这将显示所有分支,远程和本地,跟踪和未跟踪。

这是一个开源项目的示例:

> git remote show origin
* remote origin
  Fetch URL: https://github.com/OneBusAway/onebusaway-android
  Push  URL: https://github.com/OneBusAway/onebusaway-android
  HEAD branch: master
  Remote branches:
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked
    refs/remotes/origin/branding stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    develop merges with remote develop
    master  merges with remote master
  Local refs configured for 'git push':
    develop pushes to develop (local out of date)
    master  pushes to master  (up to date)

如果我们只想获取远程分支,我们可以使用grep。我们想要使用的命令是:

grep "\w*\s*(new|tracked)" -E

使用这个命令:

> git remote show origin | grep "\w*\s*(new|tracked)" -E
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked

您也可以为此创建别名:

git config --global alias.branches "!git remote show origin | grep \w*\s*(new|tracked) -E"

然后你可以运行git branches

【讨论】:

【参考方案9】:

我最终做了一个混乱的外壳管道来获得我想要的东西。我刚刚合并了来自原始远程的分支:

git branch -r --all --merged \
    | tail -n +2 \
    | grep -P '^  remotes/origin/(?!HEAD)' \
    | perl -p -e 's/^  remotes\/origin\///g;s/master\n//g'

【讨论】:

【参考方案10】:

Git 分支 - 远程分支

git ls-remote

Git documentation.

【讨论】:

git ls-remote --heads 以获得更具体的结果 这是唯一一个同时列出我的分支的命令 我喜欢这个。如果你想过滤,那么你可以像这样使用 grep:git ls-remote | grep“你的过滤器”。【参考方案11】:

我找到的最简单的方法:

git branch -a

【讨论】:

【参考方案12】:

TL;TR;

这是您问题的解决方案:

git remote update --prune    # To update all remotes
git branch -r                # To display remote branches

或:

git remote update --prune    # To update all remotes
git branch <TAB>             # To display all branches

【讨论】:

【参考方案13】:

使用Git Bash,您可以使用:

git branch -a

【讨论】:

【参考方案14】:

使用这个命令,

git log -r --oneline --no-merges --simplify-by-decoration --pretty=format:"%n %Cred CommitID %Creset: %h %n %Cred Remote Branch %Creset :%d %n %Cred Commit Message %Creset: %s %n"

CommitID       : 27385d919
Remote Branch  : (origin/ALPHA)
Commit Message :  New branch created

它列出了所有远程分支,包括远程分支引用的提交消息和提交 ID。

【讨论】:

【参考方案15】:

试试这个...

git fetch origin
git branch -a

【讨论】:

【参考方案16】:

我会使用:

git branch -av

此命令不仅向您显示所有分支的列表,包括以/remote 开头的远程分支,而且还为您提供* 对您更新内容和最后提交 cmets 的反馈。

【讨论】:

【参考方案17】:

如果有一个你知道应该列出的远程分支,但它没有被列出,你可能想用这个来验证你的源设置是否正确:

git remote show origin

如果一切顺利,也许你应该运行更新:

git remote update

假设运行成功,您应该能够按照其他答案所说的去做:

git branch -r

【讨论】:

【参考方案18】:

只需运行git fetch 命令。它会将所有远程分支拉到您的本地存储库,然后执行git branch -a 以列出所有分支。

【讨论】:

【参考方案19】:

接受的答案对我有用。但我发现让提交从最近的开始排序更有用。

git branch -r --sort=-committerdate

https://git-scm.com/docs/git-branch

【讨论】:

【参考方案20】:

假设您在远程存储库中有以下分支: git branch -a给你:

*remotes/origin/release/1.5.0
 remotes/origin/release/1.5.1
 remotes/origin/release/1.5.2
 remotes/origin/release/1.5.3
 remotes/origin/release/1.6.0

基于上述结果命令git branch -rl '*/origin/release/1.5*' 为您提供:

 origin/release/1.5.1
 origin/release/1.5.2
 origin/release/1.5.3

-r 代表远程

-l 使用&lt;pattern&gt; 列出

【讨论】:

以上是关于如何在 Git 1.7+ 中列出所有远程分支?的主要内容,如果未能解决你的问题,请参考以下文章

如何列出根目录下的 git 子树?

Git常用命令收集

Git 在团队中的最佳实践--如何正确使用Git Flow

Git 在团队中的最佳实践--如何正确使用Git Flow

Git 常用命令

git常用命令备忘