git init 是本地初始化空仓库,仅生成 .git 目录,无提交、无分支、无远程配置;git clone 则完整复制远程仓库,自动初始化、关联 origin、拉取全部历史并检出默认分支,支持直接协作开发。

git init 和 git clone 完全是两类操作:一个是在本地“从零建仓”,另一个是“远程搬仓”。选错会导致仓库结构异常、远程连接丢失或历史记录缺失。
git init 是本地初始化,不涉及网络和远程仓库
它只在当前目录生成一个 .git 子目录,把普通文件夹变成 Git 可管理的空仓库。没有提交、没有分支(默认只有 main 或 master,但 HEAD 指向空)、也没有远程配置。
- 执行后
git status显示 “no commits yet” - 必须手动用
git remote add origin <url></url>才能关联远程 - 适合已有代码但还没进版本控制的场景,比如公司内部老项目补 Git
- 不会创建新目录 —— 就在你当前所在的文件夹里干活
git clone 是完整复制,自带远程链接和全部历史
它会新建一个目录(除非指定路径),自动完成:git init → git remote add origin <url></url> → git fetch → git checkout。结果是可立即开发、可直接 git pull/git push 的完整副本。
- 默认检出远程
HEAD指向的分支(通常是main) - 远程名固定为
origin,可通过git remote -v验证 - 支持
git clone -b branch-name <url></url>指定初始分支 - 若目标目录已存在且非空,命令会直接失败,不覆盖
常见误用:想 clone 却用了 init,然后 push 失败
典型错误现象是:git push -u origin main 报错 error: src refspec main does not match any。这是因为 git init 后没任何提交,main 分支根本不存在 —— Git 不会自动创建初始分支,直到你第一次 git commit。
- 补救方法:先
git add . && git commit -m "init",再git branch -M main,最后git push -u origin main - 但更省事的是:一开始就
git clone <url></url>,尤其当远程已有代码时 - 注意:clone 后如果删掉
.git再 init,就彻底断开了和原始仓库的关系,历史不可恢复
性能与安全差异容易被忽略
git clone 默认拉取全部分支的全部历史(含大文件、旧 tag),而 git init 无网络开销。但在协作中,少有人真用 git init 接入现有项目 —— 因为丢掉了所有协作上下文:谁改过什么、为什么这么改、CI 配置在哪。
- 若仓库巨大,可用
git clone --filter=blob:none或--single-branch减少数据量 - 某些老旧 SSH 服务器可能拒绝
git clone(如报diffie-hellman-group1-sha1错误),但git init不受影响 - 安全上,
git clone会继承远程仓库的 hooks、submodules、.gitattributes 等配置,可能引入意料外的行为











