Git Clone 完全指南:从入门到精通

全面解析 git clone 命令,从基础用法到 HTTPS/SSH 协议选择,再到 --depth, --filter, --bare 等高级选项的实战应用,助你精通 Git 仓库克隆的每一个细节,优化开发与 CI/CD 流程。

阅读时长: 7 分钟
共 3473字
作者: eimoon.com

大家都说 git clone 是你接触 Git 的第一个命令。没错。但很多人对它的理解也就止步于此了:复制个 URL,敲下回车,完事。实际上,这个看似简单的命令背后,藏着不少能极大影响你工作效率的门道。

git clone 不只是下载代码。它是在你的本地机器上创建一个远程仓库的完整、独立的副本,包括每一条提交历史、每一个分支。这才是 Git 分布式设计的精髓。你的本地仓库和远程仓库在功能上是平等的。

这篇文章,我就带你把 git clone 彻底搞明白。从最基础的用法,到不同协议的选择,再到那些能让你在处理大项目时事半功倍的高级选项。

git clone 到底做了什么?

简单说,git clone 就是把一个现成的项目环境一键复制到你的电脑上。它最常用来克隆远程仓库,比如 GitHub 或 GitLab 上的项目。

比如,我想把 AWS CLI 的源码搞到本地研究一下:

# 这会在当前目录下创建一个叫 'aws-cli' 的文件夹
# 我用的 Git 版本是 2.39.5
git clone https://github.com/aws/aws-cli.git

这个命令跟其他 Git 命令有个根本区别。像 git init 是从零创建一个新仓库,而 git fetchgit pullgit push 这些都是在你已经有了本地仓库之后,用来同步更新的日常操作。

git clone 基本上是一次性买卖。你用它来加入一个新项目,或者想给某个开源项目做贡献。它帮你省去了所有初始化的麻烦。

当你执行 git clone 时,背后发生了四件事:

  1. 下载所有东西:Git 会把远程仓库的文件、分支、标签和全部提交历史都拉下来。
  2. 创建 .git 目录:这是 Git 的核心,一个隐藏目录,里面存放着所有版本历史、配置等元数据。
  3. 设置远程连接:Git 会自动把克隆的那个远程仓库地址标记为 origin。这样你后面用 git pullgit push 就很方便了。
  4. 检出默认分支:它会把默认分支(通常是 mainmaster)的内容解压到你的工作目录,让你马上就能开始干活。

关键在于,克隆下来的仓库是一个功能齐全的独立实体。你可以在本地提交、创建分支,甚至把它当作另一个远程仓库给别人克隆。这和 SVN 那种必须依赖中央服务器的集中式系统完全不同。在 Git 的世界里,人人平等。

选哪种 URL?HTTPS vs. SSH

克隆仓库时,你总得告诉 Git 去哪儿找,这就需要一个 URL。Git 支持好几种协议,但我们日常打交道的主要是 HTTPS 和 SSH。选哪个,直接关系到你的便利性和安全性。

HTTPS URL

这就是你平时在浏览器地址栏里看到的那种。它最简单,也最通用。

git clone https://github.com/aws/aws-cli.git

它的结构很直观:https:// 是协议,github.com 是域名,后面跟着用户名和仓库名。

优点: 简单粗暴,不需要任何配置。而且它走的是标准网络端口,基本不会被公司的防火墙拦住。 缺点: 每次和远程仓库交互(比如 push),都可能需要你输入用户名和密码(或者 Personal Access Token)。有点烦。

SSH URL

SSH 是一种更安全、更专业的连接方式。它需要你先在本地生成一对密钥(公钥和私钥),然后把公钥上传到 GitHub 或 GitLab。

git clone git@github.com:aws/aws-cli.git

注意它的结构:以 git@ 开头,域名后面是冒号 :,而不是斜杠 /

优点: 配置好之后,就再也不用输密码了。非常安全,非常方便,是专业开发者的首选。 缺点: 需要一次性的初始配置,对新手可能不太友好。

还有个 Git 协议

你可能还会见到 git:// 开头的 URL。这是一种轻量级协议,但它不加密,不安全,而且现在 GitHub 这类主流平台基本都把它废弃了。所以,忘了它吧。

怎么选?一张图看明白:

协议 适用场景 优点 缺点
HTTPS 新手、临时克隆、CI/CD 环境 简单,无需配置,防火墙友好 频繁操作需要重复输入凭据(可用凭据助手缓解)
SSH 频繁贡献的开发者 安全,一次配置,永久方便 初始设置相对复杂,需要管理密钥
Git (已过时) 速度快 不安全,已被主流平台弃用

你可以用 git remote -v 命令随时查看当前仓库用的是哪种协议的 URL。

实战:用 HTTPS 和 SSH 克隆

理论说完了,我们来动手操作一下。这两种方式的验证流程完全不同。

HTTPS 克隆流程

这是最直接的方式。打开 GitHub 仓库页面,点击 “Code”,复制 HTTPS 的 URL。

对于公开仓库,直接运行命令就行,不需要任何验证:

git clone https://github.com/aws/aws-cli.git

但如果你要克隆一个私有仓库,Git 就会提示你输入用户名和密码。注意,这里的“密码”不是你的 GitHub 登录密码,而是个人访问令牌 (Personal Access Token, PAT)。出于安全考虑,GitHub 等平台已经不再支持使用密码进行 Git 操作。

每次都手动输入 PAT 太痛苦了。你可以用 Git 的凭据管理工具(Credential Manager)来缓存它。比如在 macOS 上,Git 会自动和系统自带的“钥匙串”集成,我就是这么用的,非常无缝。

不过 PAT 有个大坑:它会过期。如果你在 CI/CD 流水线里用了 PAT,一旦过期,整个流水线就会因为认证失败而挂掉。你必须记得在它过期前重新生成并更新。这在自动化场景里是个不小的维护成本。

SSH 克隆流程

SSH 是我个人更推荐的方式,一次配置,终身受益。

第一步,生成 SSH 密钥对。打开终端,输入:

# ed25519 是目前推荐的加密算法
ssh-keygen -t ed25519 -C "your_email@example.com"

它会让你选择保存密钥的位置,直接回车使用默认路径 (~/.ssh/id_ed25519) 就行。然后它会让你设置一个密码,可以设置也可以留空。

第二步,把公钥添加到你的 Git 托管平台。找到你刚刚生成的公钥文件(文件名以 .pub 结尾,比如 id_ed25519.pub),复制里面的全部内容。

然后去 GitHub 的 Settings -> SSH and GPG keys 页面,新建一个 SSH key,把公钥粘贴进去。

搞定!

现在你就可以用 SSH URL 来克隆仓库了,无论是公开还是私有的,都不再需要输入密码。

git clone git@github.com:aws/aws-cli.git

一个常见的坑是,如果你有多对 SSH 密钥(比如公司一个,个人一个),Git 可能会用错。这时你需要在 ~/.ssh/config 文件里明确指定哪个域名用哪个密钥文件,像这样:

Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519

配置好后,可以用 ssh -T git@github.com 来测试连接是否成功。

git clone 的花式玩法

除了最基本的克隆,git clone 还有一堆参数,能让你根据不同需求定制克隆过程。

克隆到指定文件夹

默认情况下,克隆下来的文件夹和仓库同名。如果你想换个名字,很简单,在命令后面加上新名字就行。

git clone https://github.com/aws/aws-cli.git my-aws-cli-project

只克隆特定分支或标签

有时候你并不关心默认的 main 分支,而是想直接开始在一个特定的功能分支或发布分支上工作。用 -b (或 --branch) 参数。

# 克隆后直接检出 master 分支
git clone --branch master https://github.com/aws/aws-cli.git

# 也可以指定一个标签,得到一个只读的代码快照
git clone --branch 2.27.43 https://github.com/aws/aws-cli.git

这个操作只是克隆了所有分支后,帮你自动 checkout 到指定的分支。所有其他分支在本地依然是存在的。

浅克隆(Shallow Clone)

对于像 aws-cli 这种历史悠久、提交记录成千上万的巨型仓库,完整克隆一次可能要花很长时间,也占用大量磁盘空间。但很多时候,我根本不关心几年前的提交历史。

这时候,浅克隆就派上用场了。用 --depth 参数指定你只想要最近的几次提交。

# 只拉取最近一次提交的历史记录
git clone --depth 1 https://github.com/aws/aws-cli.git

这对于 CI/CD 流水线来说是绝配。构建和部署任务通常只需要最新的代码,没必要下载完整的历史记录。速度快,占空间小。完美。

更高级的克隆姿势

如果上面的玩法还不能满足你,Git 还提供了一些更高级、更精细的控制选项,特别适合处理大型单体仓库(Monorepo)或者做仓库镜像。

只克隆单个分支

刚才提到的 --branch 参数,它只是帮你检出指定分支,但实际上还是把所有分支的数据都下载下来了。如果你确定你只需要一个分支,可以用 --single-branch 来告诉 Git,别的我全都不要。

git clone --branch feature/cliq --single-branch https://github.com/aws/aws-cli.git

这会显著减少下载的数据量和时间,让克隆过程更快。

裸仓库(Bare Repository)

你有没有想过,.git 目录和工作目录(也就是我们能看到的文件)其实是可以分开的?一个裸仓库就是只有 .git 目录内容的仓库,它没有工作目录。

git clone --bare https://github.com/aws/aws-cli.git

克隆下来你会发现,它的目录结构和普通仓库的 .git 文件夹一模一样。因为没有工作目录,你无法在里面修改文件或执行 git addgit commit 等命令。

那它有什么用?它通常被用作一个共享的中央服务器。大家可以往这个裸仓库里 push 代码,也可以从里面 pull 代码,但没人会直接在服务器上修改它。它就是一个纯粹的代码中转站。

镜像仓库(Mirror Repository)

镜像仓库和裸仓库很像,它也是没有工作目录的。你可以通过 --mirror 参数创建它。

git clone --mirror https://github.com/aws/aws-cli.git

--mirror--bare 更进一步。它不仅克隆所有分支,还会克隆所有远程跟踪分支、标签、notes 等所有引用信息,并配置成每次 git remote update 都会强制覆盖本地所有引用,以保持和源仓库一模一样。它就是用来创建一个完美的、1:1 的备份。

部分克隆(Partial Clone)

对于那些超级庞大的单体仓库,有时候我们甚至连最新的代码都不想全部下载,可能我只关心某几个目录下的文件。

部分克隆就是为了解决这个问题而生的。它通过 --filter 参数,让你只下载仓库对象的一个子集。比如,我们可以告诉 Git 只下载文件结构(tree),暂时不要下载文件内容(blob)。

git clone --filter=blob:none https://github.com/aws/aws-cli.git

这样克隆速度会快得惊人。当你需要某个文件时,Git 会按需从远程下载它的内容。这在带宽有限或磁盘空间紧张的情况下非常有用。

--filter 还有更复杂的用法,比如按文件大小过滤,或者按目录深度过滤,可以应对各种极端场景。

就这样吧。下次再用 git clone 的时候,希望你想到的不只是复制粘贴 URL。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计