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


633

我已经尝试过了git branch -r,但是只列出了我在本地跟踪的远程分支。如何找到我还没有的人的名单?(对我而言,命令列出所有远程分支还是仅列出未跟踪的分支都无关紧要。)


11
你的意思是你已经修改了默认的Refspec,使git fetchgit remote update不获取所有远程的分支?因为否则您可以直接获取然后使用git branch -r...
卡斯卡贝尔

2
我一定有 git branch -r只是向我显示我在本地跟踪的远程分支机构。现在工作得更好。
詹姆斯·A·罗森

Answers:


803

对于此处的绝大多数访问者[1]正确和最简单的回答是 “如何在Git 1.7+中列出所有远程分支?”的问题。是:

git branch -r

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

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

如果git branch -r不工作,那么也许是Cascabel说:“你已经修改了默认的Refspec,使git fetchgit remote update不获取所有remote的分支”


[1]本脚注2018 - 2月的写作作为,我看了看评论,看到的git branch -r绝大多数作品(约90%或125出的140)。

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


15
您也可以git ls-remote [url]这样做,而不必先克隆它:)
必先 Zsub

142
这个答案是正确的但具有误导性,来自搜索引擎的用户首先应该看到的是:git branch -r由于这是正确和最简单的答案,因此问问者有一个特殊情况,即他修改了自己的行为git branch -r,大多数来此访问的用户不会有
斯蒂芬

24
@Stephan:你确定吗?git branch -r也没有为我工作。它只是列出已经在本地跟踪的分支。但git ls-remote --heads列出了远程存储库上可用的所有分支...
rexford

2
如果要从中列出的分支git ls-remote(通过列出,但未在上列出git branch -r)中git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"进行获取,则必须先执行,然后再执行stackoverflow.com/a/26649770/873282所述
koppor

11
git fetch --all获取所有当前的远程分支之前,请不要忘记做。
A. Attia

173

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)

究竟。未提取,未在本地跟踪。
Thufir

3
branch_that_is_not_tracked tracked
Piotr Dobrogost,2015年

3
@PiotrDobrogost是的!branch_that_is_not_tracked是任何本地git分支均未跟踪的分支。但是,它已被提取到本地存储库(因此有一个远程分支)。出于某种奇怪的原因,即使没有跟踪远程的本地分支,也git remote show将此状态称为tracked。在这种情况下,与的相反trackednew,表示“未提取”。
克拉斯·梅尔本

这无法以编程方式工作,太难解析了
Alexander Mills

这是我遇到的一个特例,我在本地拉了一个远程分支,然后将该分支从远程上删除。然后git branch -r建议仍然有一个远程分支,但git remote show origin显示refs/remotes/origin/my-now-dead-branch stale (use 'git remote prune' to remove)。有用得多!
icc97 '18 -10-19

53
git branch -a | grep remotes/*

10
这基本上等于git branch -r,OP表示还不够好。
卡斯卡贝尔

9
实际上两者git branch -agit branch -r为我列出所有远程分支,我不确定OP所说的是否正确。我只是建立了一个测试库并进行了验证(只有主跟踪源/主,但仍然看到带有两个标志的所有远程分支)。
伊丹·K

2
如果我从现有的提取存储库中进行克隆,然后手动将源指向git服务器,这似乎并不会列出所有远程分支。可接受的答案处理这种情况。
nielsbot

此解决方案似乎未列出自上次获取以来创建的远程分支。
Anubian Noob 2015年

奇怪的是:多年来,我一直使用,git fetch之后git branch -a才开始对我失败。也许git的行为被改变了?
塞巴斯蒂安·马赫2015年

39

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

git remote update --prune

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

您可以通过指定一个遥控器来加快此更新的速度,否则它将从您添加的所有遥控器中获取更新,如下所示

git remote update --prune origin

这解决了我的问题-'git branch -r'现在对我有用。
弗朗西斯·诺顿

27

git branch -ar

应该这样做。


41
传递两个参数是多余的。-r返回远程分支。返回本地远程分支。因此,与两个产生相同的输出。-agit branch -agit branch -ar
Walter Roman




9

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

5

最好的命令是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




4

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


1

如果您知道应该列出一个远程分支,但没有列出该分支,则您可能要使用以下命令验证您的来源设置正确:

git remote show origin

如果这一切都很好,也许您应该运行一个更新:

git remote update

假设成功运行,您应该能够执行其他回答:

git branch -r

1

使用此命令,

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。


1

我会用:

git branch -av

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


0

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


0

我最终做了一个混乱的shell管道来获得想要的东西。我只是从原始远程合并分支:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.