大家都说 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 fetch、git pull、git push 这些都是在你已经有了本地仓库之后,用来同步更新的日常操作。
git clone 基本上是一次性买卖。你用它来加入一个新项目,或者想给某个开源项目做贡献。它帮你省去了所有初始化的麻烦。
当你执行 git clone 时,背后发生了四件事:
- 下载所有东西:Git 会把远程仓库的文件、分支、标签和全部提交历史都拉下来。
- 创建
.git目录:这是 Git 的核心,一个隐藏目录,里面存放着所有版本历史、配置等元数据。 - 设置远程连接:Git 会自动把克隆的那个远程仓库地址标记为
origin。这样你后面用git pull或git push就很方便了。 - 检出默认分支:它会把默认分支(通常是
main或master)的内容解压到你的工作目录,让你马上就能开始干活。
关键在于,克隆下来的仓库是一个功能齐全的独立实体。你可以在本地提交、创建分支,甚至把它当作另一个远程仓库给别人克隆。这和 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 add、git 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。
关于
关注我获取更多资讯