git clone 是什么
git clone 把远端仓库完整复制到本地:取回全部提交历史、建立名为 origin 的远端、检出默认分支,并让本地分支跟踪远端同名分支。它是获取代码的第一步,克隆完成后日常同步改用 git pull 或 git fetch,不需要反复克隆。地址支持 HTTPS、SSH、本地路径与 git 协议四种写法。
克隆实际做了哪几步
一次 clone 等价于初始化仓库、添加远端、取回对象与引用、检出默认分支并建立跟踪这四步动作的组合。明白这一点,就能理解 clone 的参数大多是在覆盖这几步的默认行为:-b 改检出哪条分支,--depth 改取回多少数据,--recurse-submodules 追加一步初始化子模块。
基本信息
| 适用平台 | Linux / macOS / Windows(Git 2.x) |
|---|---|
| 语法 | git clone [选项] <仓库地址> [目标目录] |
| 地址形式 | https://、git@host:path、git://、本地路径 |
| 认证方式 | HTTPS 走凭据助手,SSH 走密钥 |
| 常用选项 | -b 指定分支;--depth 浅克隆;--recurse-submodules 拉子模块 |
典型使用场景
- 接手项目:第一次把代码拉到本地,克隆后即可构建运行
- 并行开发:同一仓库克隆到不同目录,互不干扰
- 只取维护分支:用 -b release/2.x 直接检出长期分支
- 含子模块的项目:加 --recurse-submodules 一次拉齐依赖代码
- CI 优化:用 --depth 1 只取最新提交,缩短流水线耗时
- 做镜像或备份:用 --mirror 复制包含全部引用的裸仓库
常用示例
常用示例
git clone https://github.com/org/repo.git # 默认克隆到 repo 目录
git clone git@github.com:org/repo.git mydir # SSH 地址并指定目录名
git clone -b release/2.x https://example.com/org/repo.git # 直接检出指定分支
git clone --recurse-submodules https://example.com/org/repo.git # 连子模块一起拉
git clone --depth 1 https://example.com/org/repo.git # 只要最新一次提交
git clone --mirror https://example.com/org/repo.git # 裸仓库镜像,可用于备份
git remote -v # 克隆后核对 origin 地址
git branch -vv # 核对本地分支的跟踪关系克隆产生哪些东西
| 产物 | 说明 | 怎么核对 |
|---|---|---|
| origin 远端 | 自动指向克隆来源地址 | git remote -v |
| 默认分支 | 按远端 HEAD 检出到工作区 | git branch --show-current |
| 远端跟踪分支 | origin/main 等只读镜像引用 | git branch -r |
| 跟踪关系 | 本地 main 跟踪 origin/main | git branch -vv |
| 完整历史 | 含全部提交、标签与分支引用 | git log --oneline | head |
| 子模块 | 仅在使用递归选项时初始化 | git submodule status |
| 浅克隆 | 只有最近若干条提交 | git rev-parse --is-shallow-repository |
| 镜像仓库 | --mirror 时全部引用都存在本地 | git remote -v 看 fetch 与 push 地址 |
clone 是一次性取回全部历史的动作。之后同步用 git pull,或者先 fetch 再人工决定合并方式,不要在原有仓库上再克隆一份。
把仓库克隆到另一个仓库目录内部会形成嵌套仓库,外层提交时可能把内层当成普通目录收录,生成没有内容的 gitlink,删除前先想清楚归属。
仓库很大时克隆断线重试会从头开始。可先用 --depth 1 拿到可用的基线,需要追溯历史时再用 git fetch --unshallow 补全为完整仓库。
浅克隆与子模块的取舍
仓库体积大时,--depth 1 只取最新一次提交的快照,克隆时间与磁盘占用都明显下降,代价是历史不完整:git log、git blame、git bisect 都会受限,合并到旧基线也可能失败。含子模块的项目必须额外加 --recurse-submodules,否则子目录是空的,构建会直接失败。两个选项可以叠加使用,但在需要追溯历史之前要先把数据补齐。
克隆完成后先用 git remote -v 与 git branch -vv 核对 origin 地址和跟踪关系,再开始改动,能避免把提交推到错误的远端或错误的分支上。
远端删除的分支不会自动从本地消失,定期 git fetch --prune 清理远端跟踪引用,可以让 git branch -r 与日志展示保持干净。
克隆是只读拉取,不会改动远端。若只需要查阅而不打算提交,克隆到临时目录即可,不必关心本地分支与上游的跟踪关系。