题 如何获取所有git分支?


我克隆了一个git存储库,它包含大约5个分支。但是,当我这样做的时候 git branch 我只看到其中一个:

$ git branch
* master

我知道我能做到 git branch -a 查看 所有 分支,但我怎么会在本地拉所有分支,所以当我这样做 git branch, 表明:

$ git branch
* master
* staging
* etc...

943
2018-04-25 09:05


起源


还讨论了 stackoverflow.com/questions/67699/... - gliptak
这个问题展示了如何在使用后获得所有分支 --single-branch 克隆时设置: stackoverflow.com/questions/17714159/... (git fetch --all 如果你只指定了一个分支,它将永远不会工作!) - Matthew Wilcoxson
您不会看到该输出,因为星号表示当前结帐的分支。由于您一次只能检出一个分支,因此分支列表左侧只能有一个星号。 - Robino
下面排名靠前的答案错过了OP的意图。我建议你看看 stackoverflow.com/a/72156/342839 代替。 git checkout -b <branch> 似乎是最可能的答案。 - Reece
我看到了很多答案,但没有人提到我认为可能是你想要的最简单的方法: git clone --bare <repo url> .git  (注意你需要在末尾添加“--bare”和“.git”来将repo克隆为“裸”repo),然后 git config --bool core.bare false (然后将“bare”标志设置为false) git reset --hard (将HEAD移动到repo上的当前HEAD)。现在,如果你 git branch 你应该看到你克隆的repo的所有分支。 - Gabriel Ferraz


答案:


我前段时间写了我的答案,最后downvote促使我用我以后的经验更新它:-)

编辑:此答案的先前版本创建了带有“origin”前缀的分支,所有前缀都指向master分支,而不是实际分支,并且存在变量扩展问题。这已根据评论修复。

您可以从所有遥控器中获取一个分支,如下所示:

git fetch --all

fetch 更新远程分支的本地副本,这样对于您的本地分支来说总是安全的

  1. fetch 将不会 更新 当地分支机构(其中 跟踪 远程分支);如果要更新本地分支,则仍需要拉出每个分支。

  2. fetch 将不会 创建 当地分支机构(其中 跟踪 远程分支),你必须手动完成。如果要列出所有远程分支: git branch -a

更新 跟踪远程分支的本地分支:

git pull --all

但是,这仍然不够。它仅适用于跟踪远程分支的本地分支。要跟踪所有远程分支,请执行此oneliner 之前  git pull --all

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

TL; DR版本

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

(似乎拉取所有遥控器的所有分支,但我总是首先获取以确定)

仅当服务器上存在未由本地分支跟踪的远程分支时,才运行第一个命令。

附:据我所知 git fetch --all 和 git remote update 是等价的。



Kamil Szot的 评论,74(至少)人发现有用。

我不得不使用:

for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done

因为你的代码创建了本地分支命名 origin/branchname 和   我得到“refname”origin / branchname'时我都是模棱两可的   提到它。


1262
2018-04-25 09:10



抱歉。我无法想象这就是OP真正想要的东西。 'pull'命令是'fetch + merge',合并部分会将所有分支覆盖在一起 - 留下一个巨大的混乱。 - GoZoner
fetch不会创建一个新的远程分支,你仍然需要检查它 git checkout -b localname remotename/remotebranch - Learath2
我不得不使用 for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done   因为你的代码创建了名为origin / branchname的本地分支,而且每当我提到它时,我的“refname”origin / branchname'都是模糊的。 - Kamil Szot
我不知道我是否使用了不同版本的GIT,但我不得不修改脚本 git pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done。改变剥夺了HEAD。 - kim3er
对于Windows人员: for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all - Max


列出远程分支:
git branch -r 

您可以将它们作为本地分支机构查看:
git checkout -b LocalName origin/remotebranchname


421
2018-04-25 10:00



当我发现上述问题时,这正是我所寻找的。我怀疑很多人在寻找如何拉远程分支肯定不希望将分支合并到他们当前的工作副本中,但他们确实希望本地分支与远程分支相同。 - Frug
即使分支在本地不可见,我也能做到 git checkout remotebranchname它的工作原理。你的解决方案有什么不同? - François Romain
它的默认行为现在。旧的git版本不是这样的。运用 git checkout remotebranchname 曾经只是创造一个新的 无关 被命名的分支 remotebranchname。 - Learath2
接受的答案基本上有所不同,坦率地说,我甚至不理解为什么它是公认的答案 - Learath2
OP要求所有分支机构。这个答案只做一个。 - Ted Bigham


您需要创建跟踪远程分支的本地分支。

假设你只有一个遥控器 origin,此代码段将为所有远程跟踪代码创建本地分支:

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

之后, git fetch --all 将更新远程分支的所有本地副本。

也, git pull --all 将更新您的本地跟踪分支,但根据您的本地提交以及如何设置'merge'configure选项,它可能会创建合并提交,快进或失败。


159
2018-01-17 15:33



这可以解决包含shell元字符的分支名称的解决方案(根据pinkeen对另一个答案的评论),并避免虚假错误输出:git branch -r | grep -v - ' - >'|读远程;做git branch --track“$ {remote#origin /}”“$ remote”2>&1 | grep -v'已经存在'; DONE - Daira Hopwood
你确定吗? git pull --all 将更新所有本地跟踪分支?据我所知,它只更新所有遥控器的当前分支。 - Andy
做过这个。未创建匹配远程分支的本地分支。什么是git命令简单地说“如果它们不存在则拉动所有远程分支创建本地分支?” - JosephK


如果你这样做:

git fetch origin

然后他们将在当地。如果你然后执行:

git branch -a

你会看到它们被列为遥控器/原点/分支名称。因为他们在当地,你可以随心所欲地做任何事情。例如:

git diff origin/branch-name 

要么

git merge origin/branch-name

要么

git checkout -b some-branch origin/branch-name

97
2018-04-25 13:52



刚在谷歌上找到这个页面...这是我正在寻找的实际答案类型。我尝试了第一个命令,但收到一个错误:[$ git fetch --all origin fatal:fetch --all不接受存储库参数] ---使用“git fetch --all”似乎可以解决问题。谢谢你的领导! - longda
固定(消除 --all) - GoZoner
git fetch -all 获取所有遥控器的所有分支。 git fetch origin获取遥控器的所有分支 origin。后者是OP所要求的。 - GoZoner
--all 意思是“所有遥控器”,而不是“给定遥控器的所有分支”。后者是从遥控器获取的任何暗示。 - spacediver
这不是从远程仓库将所有分支拉入本地仓库的方法。 - Vladimir Despotovic


$ git remote update  
$ git pull --all

这假定跟踪所有分支

如果他们不是你可以用bash解雇

for remote in `git branch -r `; do git branch --track $remote; done

然后运行该命令。


42
2018-04-25 09:07



当我尝试时,我仍然得到与上面相同的结果。 - David542
最后一个为我工作..有一些git错误 - Jacob Lowe
和@JacobLowe一样,我收到了错误,但无论如何它都有效; '致命:一个名为'origin / master'的分支已经存在。“ - AnneTheAgile


关于什么 git fetch && git checkout RemoteBranchName ?对我来说效果很好......


34
2018-05-08 16:14



这是最好的答案,你们都是。我不知道以前是否可能这是不可能的,但最近版本的Git至少会注意到你正在尝试签出一个远程分支,并会自动为你设置本地跟踪分支(你不需要)指定 origin/branch;它只够说 branch)。 - Neil Traft
正是我想要的!简单的东西! - maloo
这不能回答原来的问题:“我如何在本地拉出所有分支?”它一个接一个地拉它们,这是不可扩展的。 - ingyhere
这是唯一允许我在遇到的每种情况下拉远程分支的答案 - Emmanuel Buckshi


bash for循环对我来说不起作用,但这完全符合我的要求。来自我的所有分支在本地镜像为相同的名称。

git fetch origin '+refs/heads/*:refs/heads/*'

27
2017-10-28 20:02



这产生了 fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository 经过简单的克隆。必须首先拆卸头部。我这样做了 git checkout <SHA> - brannerchinese
我的解决方案是使用它 git checkout --detach # detach the head 接着 git fetch origin \'+refs/heads/*:refs/heads/* - Mike DuPont
这个对我有用,除了我也使用--tags参数。我希望git有一个标准的,简单的前端,git中需要10多个堆栈溢出答案的简单事物的数量是荒谬的! - kristianp
@kristianp你有没有检查过Ungit或GitKraken? - dragon788
@ dragon788我一直在使用SourceTree作为git GUI,但我真的在谈论一个更简单的脚本任务命令行。 - kristianp


克隆存储库时,实际下载了分支的所有信息,但隐藏了分支。随着命令

$ git branch -a

您可以显示存储库的所有分支,并使用该命令

$ git checkout -b branchname origin/branchname

然后,您可以一次手动“下载”它们。


然而,有一种更清洁,更快捷的方式,虽然它有点复杂。您需要三个步骤来完成此任务:

  1. 第一步

    在您的计算机上创建一个新的空文件夹,并从存储库中克隆.git文件夹的镜像副本:

    $ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
    $ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
    

    文件夹my_repo_folder中的本地存储库仍为空,现在只有一个隐藏的.git文件夹,您可以从终端看到“ls -alt”命令。

  2. 第二步

    通过将git配置的布尔值“裸”切换为false,将此存储库从空(裸)存储库切换到常规存储库:

    $ git config --bool core.bare false
    
  3. 第三步

    抓取当前文件夹中的所有内容并在本地计算机上创建所有分支,从而使其成为正常的repo。

    $ git reset --hard
    

所以现在你可以输入命令 git branch 你可以看到所有的分支都被下载了。

这是您可以快速克隆包含所有分支的git存储库的快速方法,但这不是您希望以这种方式为每个项目执行的操作。


25
2017-12-06 20:12



赞成提到隐藏的分支机构。帮助我了解当地的分支跟踪。 - mburke05
这是一个很好的答案,但这个问题暗示了每天使用的东西。每次克隆存储库都不实用。 - Z. Khullah
为什么重置会在本地创建所有分支? - Z. Khullah


我通常只使用这样的命令:

git fetch origin
git checkout --track origin/remote-branch

更短的版本:

git fetch origin
git checkout -t origin/remote-branch

23
2017-07-07 14:42



在签出之前git获取原点为我做了诀窍。 - Suraj


您可以通过以下方式获取所有分支:

git fetch --all

要么:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

--depth=10000 如果您使存储库变浅,参数可能会有所帮助。


要拉出所有分支,请使用:

git pull --all

如果以上不起作用,则在上面的命令之前加上:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

作为 remote.origin.fetch 在获取时只能支持特定的分支,特别是当你克隆你的repo时 --single-branch。检查一下: git config remote.origin.fetch

之后你应该能够结账任何分支机构。

也可以看看:


要将所有分支推送到远程,请使用:

git push --all

终于 --mirror 镜像所有参考。


如果您的目标是复制存储库,请参阅: 复制存储库 GitHub的文章。


17
2017-10-11 20:04



太棒了......我在你的解决方案之前尝试了其他一切。非常感谢! - Sujoy
我用浅层克隆(depth=1)并且配置还指定了一个特定的分支 fetch  - depth=1000 参数是帮助我签出特定远程分支的修复程序 - Sandra
pull --all 不拉所有的分支,但所有的遥控器 - Z. Khullah
不过配置不错的诀窍!会一直把它们全部取出来 - Z. Khullah


如果您在这里寻求获得所有分支的解决方案,然后将所有内容迁移到另一个Git服务器,我将以下过程放在一起。如果您只想在本地更新所有分支,请在第一个空行停止。

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>

12
2018-02-05 23:55



很有帮助;正是我需要的。我唯一需要改变的是第二行,在'HEAD'和'master'周围加上单引号;可能是因为我正在使用zsh。谢谢! - sockmonk
这基本上是在做以下几点:(1)获取远程分支的实际名称[不是head,而不是master]; (2)完全告诉Git跟踪它们[并非所有解决方案都这样做]; (3)从这些分支中获取和提取所有内容[包括标签]; (4)设置一个新的起源并完全推动所有事情。同样,大多数其他解决方案都无法移动所有部分。这就是一切。 - ingyhere
我删除了运行grep然后awk的反模式,并将grep命令压缩到awk命令中。谢谢 tripleee! - ingyhere
读这个,永远不要写 git fetch git pull  stackoverflow.com/a/292359/1114926 - Green
混帐 pull 确实做了 fetch 首先,但更容易判断问题是否来自 fetch 部分 pull 或者随后的 merge 部分 pull 什么时候 fetch 是独立执行的。 - ingyhere