这里有足够的答案提到:
Download 1 branch (with the --single-branch
part):
git clone -b branch_name --single-branch \
https://github.com/some_project/some_project.git
...or some version of that, and a few which mention just:
Download all branches (withOUT the --single-branch
part):
git clone -b branch_name \
https://github.com/some_project/some_project.git
但是,我想稍微解释一下这两件事,并展示一个更熟悉的等效命令组合,这样我们可以看到每个命令在底层发生了什么。
假设您在GitHub上有一个远程repo,链接为https://github.com/micronucleus/micronucleus.git,有远程分支master
和version_2.5
(这是一个真实的例子,您可以立即运行)。
对第二个以上命令的详细说明:
第二个命令(git clone -b version_2.5 https://github.com/micronucleus/micronucleus.git
)克隆所有远程分支到您的本地PC,但是然后检出version_2.5
分支而不是master
分支。该命令相当于执行以下操作:
git clone https://github.com/micronucleus/micronucleus.git
cd micronucleus
git checkout version_2.5
git branch -d master
-b version_2.5
部分自动为我们检出了 version_2.5
分支,而不是 master
。
git branch -a
显示我们将所有分支都克隆到了本地电脑。在这里,您可以看到我们正在使用的本地分支 version_2.5
,以及存储在本地的远程跟踪分支 origin/HEAD
(指向 origin/master
),加上 origin/master
和 origin/version_2.5
:
$ git branch -a
* version_2.5
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/version_2.5
我们还可以查看我们的
fetch
引用。您可以打开
.git/config
文件直接查看,或者只需运行
git config remote.origin.fetch
:
$ git config remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
您可以看到上面我们的
git fetch
命令(也由
git pull
触发,因为它相当于
git fetch && git merge
)被配置为获取
origin
远程所有分支的所有头。我不是这方面的专家,但我认为这就是
+refs/heads/*:refs/remotes/origin/*
的含义。
以上第一个命令的详细说明:
第一个命令(
git clone -b version_2.5 --single-branch https://github.com/micronucleus/micronucleus.git
)仅克隆并检出了您本地PC上的
version_2.5
分支。这个命令等同于(至少在最终结果上是这样,除了它在开始时只克隆了一个分支而不是全部):
git clone https://github.com/micronucleus/micronucleus.git
cd micronucleus
git checkout version_2.5
git branch -d master
git branch -dr origin/HEAD
git branch -dr origin/master
git config remote.origin.fetch \
"+refs/heads/version_2.5:refs/remotes/origin/version_2.5"
"
-b version_2.5
部分导致默认情况下检出了 version_2.5
分支,而不是之前解释的 master
分支。而 --single-branch
部分导致:
- 没有其他分支被克隆到我们的电脑上,和
git fetch
被配置为在调用 git fetch
或 git pull
时不会获取任何其他分支!
这个命令真正地只克隆了我们想要的一个分支,就是这样!
git branch -a
显示只有 version_2.5
分支被克隆和检出。我们可以通过 *
看到哪个分支被检出,并且我们还看到了一个本地存储的远程跟踪分支 origin/version_2.5
:
"
$ git branch -a
* version_2.5
remotes/origin/version_2.5
我们还可以查看我们的
fetch
引用。您可以打开
.git/config
文件直接查看,或者只需运行
git config remote.origin.fetch
:
$ git config remote.origin.fetch
+refs/heads/version_2.5:refs/remotes/origin/version_2.5
你可以看到,我们的
git fetch
命令只会从
origin/version_2.5
远程分支获取
version_2.5
分支头。就是这样!请注意,不会获取任何其他远程分支。
总结:
因此,现在你知道使用
-b branch_name
基本上只是确保在克隆后检出
branch_name
分支,但仍会克隆所有远程分支,而添加
--single-branch
则确保仅克隆、提取、拉取和跟踪
branch_name
。
不会克隆任何其他远程分支到你的电脑中。
个人而言,我更喜欢仅使用-b branch_name
选项,因为我希望将所有分支克隆到我的本地电脑。唯一的例外可能是在一个巨大的共享单库上,该库有数十个甚至数百或数千个远程分支。在这种情况下,只需使用-b branch_name --single-branch
来克隆您关心的主要分支即可完成。比如,在一个巨大的单库中下载50 GiB的数据,对于master
分支来说,要比下载200 GiB的数据好,因为你也可以拥有你的同事正在工作的2000个分支!
参考资料:
- 仅克隆一个分支
- 如何停止跟踪Git中的远程分支?
git branch -a
显示什么? - Jakub Narębski