如何克隆所有远程分支?

4759

我在GitHub上远程追踪我的masterdevelopment分支。我该如何同时克隆这两个分支呢?


161
这里的被接受的答案(git branch -a)会展示远程仓库中的分支,但是如果你试图检出它们中的任何一个,你将处于'脱离HEAD'状态。第二个最受赞同的回答回答了另一个问题(即如何拉取所有分支,并且再次强调,这仅适用于你在本地跟踪的分支)。其中一些评论指出,你可以使用shell脚本解析git branch -a的结果来本地跟踪所有远程分支。总结:没有Git原生方法可以实现你想要的功能,而且也许这并不是一个好主意。 - Day Davis Waterbury
6
也许可以通过传统方式复制整个文件夹?scp some_user@example.com:/home/some_user/project_folder ~ 不确定这种解决方案是否适用于GitHub... - snapfractalpop
26
与其说“我已经克隆、拉取和获取了”,更好的方法是展示您执行的精确命令 - Bob Gilmore
94
“克隆”为何不是指完全的复制,这一点始终让我感到困惑。如果它是一个完全的克隆,那么所有分支不都应该是本地仓库的一部分吗?我的意思是,这不是分布式的一个重点之一吗?因此,当某个仓库消失时,您仍然拥有完整的副本。或者所谓的“远程”已经真正成为本地仓库的一部分了吗? - huggie
34
看到所有的点赞、回答、回答评论和惊人的浏览量,我认为现在是时候为此添加一个Git命令了。而你说得没错,@huggie,我的想法正是如此。 - Sнаđошƒаӽ
显示剩余9条评论
48个回答

63

为什么你只看到“master”

git clone 命令会下载所有的远程分支,但依然将它们都视为“远程分支”,尽管这些文件已经位于你的新仓库中。但有一个例外,克隆过程会从名为“master”的远程分支创建一个本地分支。默认情况下,git branch 命令只显示本地分支,因此你只看到“master”。

git branch -a 命令会显示所有分支,包括远程分支


如何获得本地分支

如果你想要在一个分支上工作,你可能需要它的“本地”版本。要简单创建本地分支(不需检出并改变你的工作目录内容),你可以像这样做:

git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree

在这个例子中,branchone 是你基于 origin/branchone 创建的本地分支的名称;如果你想要创建不同名称的本地分支,可以按照以下方式操作:

git branch localbranchname origin/branchone

创建本地分支后,您可以使用git branch查看它(请记住,您不需要-a来查看本地分支)。


1
如果origin/branchone存在,您也可以使用git checkout branchone来创建一个具有相同名称的本地分支,并将其设置为跟踪远程分支。 - Evan
只回答有效的答案 - afsara_ben

54

这并不太复杂。非常简单和直接的步骤如下:

git fetch origin: 这将把所有远程分支带到本地。

git branch -a: 这将显示所有远程分支。

git checkout --track origin/<branch you want to checkout>

通过以下命令验证您是否在所需的分支中;

git branch

输出将会如下所示:

*your current branch
some branch2
some branch3

请注意显示当前分支的 * 标记。


1
谢谢Suraj。原因是它没有得到很多投票。而且答案也没有被提问者接受。 - Sam
“git fetch origin” 没有将任何远程分支带到我的本地 - 它们是否隐藏在某个地方?阅读以上所有答案让我头痛。我们正在寻找“将所有分支都拉取到本地的 git fetch”。除了 bash 脚本之外,一定有其他方法可以做到这一点。 - JosephK
1
当你执行“git fetch origin”后,终端会显示如下输出:“* [new branch] branch_name -> origin/branch_name”,但是当你运行“git branch”时,它只会显示你本地的分支,因此要查看所有分支,可以运行“git branch -a”,然后要切换到远程分支,需要运行“git checkout --track origin/<你想要检出的分支>”。希望这能帮到你。 :-) - Sam
5
因为问题是如何“克隆所有远程分支”,而不是逐个手动更新。看起来并没有对实际问题的答案 - 只有在有很多分支的情况下需要大量打字的方法。 - JosephK

44

只需执行以下操作:

$ git clone git://example.com/myproject

$ cd myproject

$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'

$ git pull
Already up-to-date.

$ git branch
* branchxyz
  master

$ git branch -a
* branchxyz
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/branchxyz
  remotes/origin/branch123

你看,git clone git://example.com/myprojectt会获取所有东西,甚至包括分支,你只需要检出这些分支,然后你的本地分支就会被创建。


36

您只需要使用“git clone”命令即可获取所有分支。

git clone <your_http_url>

即使您只看到主分支,也可以使用“git branch -a”命令查看所有分支。

git branch -a

你可以切换到任何你已有的分支。

git checkout <your_branch_name>

不要担心在你执行“git clone”之后,你不需要连接远程仓库。“git branch -a”和“git checkout <your_branch_name>”可以在没有网络连接的情况下成功运行。因此证明当你执行“git clone”时,它已经复制了远程仓库中的所有分支。以后,你就不需要远程仓库了。你的本地代码库已经包含了所有分支的代码。


2
这里的回答非常清晰。很多人对这个话题感到困惑。 - XMAN
1
我想赞同你的说法:“当你关闭wifi时可以成功运行”。 “git clone”确实会导致包含所有分支的存储库。 - bvgheluwe

29

我看到这里的所有答案都是有效的,但是有一种更干净的方法可以克隆一个存储库并一次性拉取所有分支。

当您克隆一个存储库时,实际上下载了所有分支的信息,但是这些分支是隐藏的。使用以下命令:

git branch -a

你可以展示代码库的所有分支,使用指令

git checkout -b branchname origin/branchname

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


然而,如果您想克隆具有大量分支的存储库,则所有以前回答中说明的方式在处理方面都很冗长和繁琐,相比之下,我要展示一种更加清晰快速但有点复杂的方式。您需要三个步骤来完成此操作:

第一步

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

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

在文件夹my_repo_folder内的本地仓库仍然是空的,现在你可以通过终端使用"ls -alt"命令看到一个隐藏的.git文件夹。

第二步

通过将Git配置中的布尔值"bare"切换为false,将该仓库从空(裸)仓库切换为普通仓库:

git config --bool core.bare false

第三步

将当前文件夹中的所有内容复制到本地电脑上,并创建所有分支,使之成为一个普通的代码库。

git reset --hard

现在,您只需输入“git branch”命令即可查看所有分支已下载。

这是一种快速的方式,可以一次克隆带有所有分支的Git存储库,但并非您想以这种方式为每个项目执行的操作。


2
我不喜欢你在...“手动一个一个地下载”中使用“下载”这个词。实际上,在克隆存储库后,所有信息都已经被下载。唯一需要做的是创建本地跟踪分支(即使离线也可以),这证明了所有信息都在存储库中。 - bvgheluwe
@bvgheluwe 这就是为什么它被放在引号中的原因。 - Fed

29

git clone 是复制整个代码库的命令。尝试克隆它,然后运行 git branch -a 命令,可以列出所有分支。如果你想切换到 "foo" 分支而不是 "master" 分支,则使用 git checkout foo 命令。


1
您可以使用连字符或不使用连字符来运行git命令。 "git-branch" 和 "git branch" 都可以正常工作。 - Peter Boughton
28
也许这个回答是在很久以前给出的,当时git的工作方式不同,但我认为它现在有误导性。git clone确实会下载所有远程分支,但它只会创建master的本地分支。因为git branch只显示本地分支,所以你需要使用git branch -a来查看远程分支。 - Cerran
2
谢谢。在我看来,这是一种有点奇怪的默认行为。我会把它归咎于更加神秘的git程序。如果它已经下载了分支,为什么在调用git branch时还要隐藏它们呢? - Adam Hughes
1
@Cerran,谢谢;我已经相应地更新了我的回答。 - MattoxBeckman
2
它确实下载了所有远程分支,但只创建了一个本地的主分支。我需要帮助理解这个问题。看起来git clone不会克隆除master以外的任何分支,因为当你执行“git branch -a”时,它显示“develop”分支仅在“remotes/origin/develop”处。这必须是说你没有这个分支的本地副本,它目前只存在于远程仓库中,对吗? - John Little
显示剩余3条评论

21

自包含存储库

如果您正在寻找一个包含所有远程分支和提交日志的自包含克隆或备份,请使用:

git clone http://user@repo.url
git pull --all
git branch -a命令只会显示远程分支。如果你尝试 checkout 分支,除非你仍然能够连接到原始服务器,否则你将无法进行操作。 来源:Gabe Kopley建议使用git pull --all注:
当然,如果您不再能够remote/origin服务器上访问网络,则remote/origin branches将不会在您的存储库克隆中反映出任何更新。它们的修订版本将反映出您执行上述两个存储库克隆命令的日期和时间提交的内容。
以通常的方式使用`git checkout remote/origin/`检出*本地*分支,使用`git branch -a`来查看在克隆存储库中保存的远程分支。
要使用一个命令将克隆中的所有分支检出到本地分支,请使用下面的其中一条bash命令:
$ for i in $(git branch -a |grep 'remotes' | awk -F/ '{print $3}' \ 
| grep -v 'HEAD ->');do git checkout -b $i --track origin/$i; done

或者

如果你的仓库有嵌套的分支,那么这个命令也会考虑到它们:

for i in $(git branch -a |grep 'remotes' |grep -v 'HEAD ->');do \
basename ${i##\./} | xargs -I {} git checkout -b {} --track origin/{}; done
上述命令将在您的本地git存储库中 checkout 一个名为remote/origin/<branchname>的本地分支,并设置为--track远程服务器上的远程分支发生更改,如果您再次访问起点存储库服务器并以通常方式执行git pull命令。

3
这就是我来这里的目的! - Blake Yarbrough

19
使用我的工具 git_remote_branch (grb),你需要在计算机上安装Ruby。它专门用于使远程分支操作变得极其简单。
每次代表您执行操作时,它会在控制台以红色打印。随着时间的推移,它们最终会留在你的大脑中 :-)
如果你不想让 grb 代表你运行命令,只需使用“explain”功能。命令将被打印到你的控制台而不是为你执行。
最后,所有命令都有别名,以使记忆更容易。
注意这是alpha软件 ;-)
当你运行 grb help 时,以下是帮助信息:
git_remote_branch version 0.2.6
用法:
grb create branch_name [origin_server]
grb publish branch_name [origin_server]
grb rename branch_name [origin_server]
grb delete branch_name [origin_server]
grb track branch_name [origin_server]
注意: - 如果未指定 origin_server,则默认情况下使用名称 "origin" (git 的默认值) - 重命名功能将重命名当前分支
explain 元命令:你还可以在任何命令前面添加关键字“explain”。git_remote_branch将仅输出你需要运行的命令列表,而不会执行该命令。
示例: grb explain create grb explain create my_branch github
所有命令也都有别名: create: create, new delete: delete, destroy, kill, remove, rm publish: publish, remotize rename: rename, rn, mv, move track: track, follow, grab, fetch

7
智者之言:根据答案发布时的时间,看起来这个项目被放弃了。我找不到2008年之后的任何更新。买家自负,诸如此类。如果我错了,希望有人能编辑并提供当前的指针,因为我很想拥有这样的工具。 - bradheintz
@bradheintz 请查看这个答案,它设置了一个git别名:https://dev59.com/YXVD5IYBdhLWcg3wKYP-#16563327 - user151841

16
#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done

这些代码将拉取所有远程分支的代码到本地版本库。


将所有远程分支克隆到本地 - arcseldon
像魔法一样运作!! - Mayank

14

从本地仓库进行克隆不适用于 git clone 和 git fetch 命令:许多分支和标签将保持未获取状态。

要获取带有所有分支和标签的副本,请使用以下命令。

git clone --mirror git://example.com/myproject myproject-local-bare-repo.git

获取一个带有所有分支和标记,并且具有工作副本的克隆:

git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接