1. 简介

Git 的一大优势在于它允许我们创建、移动和克隆完整的代码仓库结构及其所有的历史变更记录。我们称这样的结构为 仓库(repository)。然而,随着项目的发展,仓库内部的修改可能变得非常复杂,因此我们通常会创建 分支(branch) 来隔离开发中的功能,并在完成后进行合并(merge)。

本文将探讨如何从远程 Git 仓库中克隆单个分支。我们会先回顾 Git 分支的基本概念,然后使用 git clone 子命令从远程仓库中提取特定分支,最后我们还会通过配置远程仓库链接来实现相同的目标。

本文中的命令已在 Debian 12(Bookworm)和 GNU Bash 5.2.15 环境下测试通过,除非特别说明,应适用于大多数 POSIX 兼容环境。

2. Git 分支简介

从理论上讲,Git 分支是在某个提交点上创建的一条独立开发路径,通常用于隔离特定功能或修复的开发工作。

从技术上讲,Git 分支只是一个指向某个提交的引用(ref)。当你初始化一个 Git 仓库并提交第一个 commit 后,Git 会自动创建一个默认分支(通常是 mainmaster):

$ git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change.[...]
$ vi file
[...]
$ git add file
$ git commit --all --message 'initial'
[master (root-commit) 2850700] initial
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file

此时的仓库结构如下:

(initial)
| HEAD  |
|master |
+-------+
|2850700|
+-------+

随着后续提交的增加,分支结构会逐渐扩展:

(initial)                           |master |
+-------+   +-------+   +-------+   +-------+
|2850700|<--|1fb0c0b|<--|84c3441|<--|58404cc|
+-------+   +-------+   +-------+   +-------+

此时我们可以创建一个基于初始提交的新分支:

$ git checkout -b branch1 2850700

完成几次提交后,分支结构如下:

(initial)                           |master |
+-------+   +-------+   +-------+   +-------+
|2850700|<--|1fb0c0b|<--|84c3441|<--|58404cc|
+-------+   +-------+   +-------+   +-------+
    ^
    |       +-------+   +-------+
    +-------|7b7561d|<--|191f89b|
            +-------+   +-------+
                        |branch1|
                        | HEAD  |

有了这些基础概念后,我们就可以开始讨论如何克隆单个分支了。

3. 使用 git clone 克隆单个分支

最直接的方式是使用 git clone 命令。默认情况下,它会克隆整个仓库的所有分支和历史:

$ git clone https://github.com/Baeldung/tutorials-backup

查看分支信息:

$ git branch --all
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dkapil-patch-1
  remotes/origin/lor6-patch-1
  remotes/origin/master

这种方式虽然简单,但当仓库很大时,克隆整个仓库是非常低效的,尤其是你只关心某一个分支的情况。

✅ 使用 --single-branch 参数

我们可以通过 --single-branch--branch 参数来只克隆指定分支:

$ git clone --single-branch --branch lor6-patch-1 https://github.com/Baeldung/tutorials-backup lor6-patch-1

查看分支信息:

$ git branch --all
* lor6-patch-1
  remotes/origin/lor6-patch-1

这样,我们只下载了 lor6-patch-1 分支的数据,节省了大量时间和空间。

✅ 使用 --depth 获取浅层历史

如果你不关心完整的历史记录,可以加上 --depth 1 参数获取一个浅层克隆:

$ git clone --single-branch --depth 1 --branch lor6-patch-1 https://github.com/Baeldung/tutorials-backup lor6-patch-1

这种方式可以显著减少下载数据量和处理时间。

4. 使用 git remote 指定单个分支

除了 git clone,我们还可以通过 git remote 命令手动链接远程仓库,并只拉取指定分支。

✅ 初始化并添加远程仓库

$ git init && git remote add --fetch origin https://github.com/Baeldung/tutorials-backup

这个命令会:

  • 初始化一个空的本地仓库
  • 添加远程仓库地址
  • 拉取所有分支和元数据

✅ 只拉取特定分支

如果我们只想拉取某个特定分支,可以使用 -t 参数:

$ git init && git remote add -t lor6-patch-1 -f origin https://github.com/Baeldung/tutorials-backup

你也可以指定多个分支:

$ git init && git remote add -t branch1 -t branch2 -f origin https://github.com/Baeldung/tutorials-backup

这种方式的好处是:后续执行 git pullgit push 时,只会作用于你指定的那些分支

5. 总结

本文介绍了从远程 Git 仓库中克隆单个分支的几种方式:

方法 命令 特点
默认克隆 git clone <url> 下载所有分支,适合完整项目
单分支克隆 git clone --single-branch --branch <branch> <url> 只下载指定分支,节省时间和空间
浅层克隆 git clone --single-branch --depth 1 --branch <branch> <url> 仅保留最近一次提交,效率更高
手动添加远程分支 git remote add -t <branch> -f origin <url> 灵活控制拉取分支,适合后期扩展

推荐做法:如果只关心某个分支的最新代码,使用 --single-branch + --depth 1 是最高效的方式。

不推荐:在不需要全部历史时使用默认的 git clone,会造成资源浪费。

⚠️ 注意:浅层克隆(shallow clone)在某些操作(如 git blamegit log)时可能无法获取完整信息,使用时需权衡。


原始标题:Clone a Single Branch in Git