讲解

获得一个 Git 仓库有两条路:从零创建,或复制别人的。git init 在当前目录创建一个新的空仓库——准确地说,是生成一个隐藏的 .git 子目录,Git 的所有数据(历史、分支、配置)都存在里面,项目文件本身原封不动。从这一刻起这个目录就叫「工作区」,git status 会告诉你哪些文件还没被跟踪。删除 .git 目录就等于删除整个仓库的历史,项目文件不受影响,但也找不回任何版本了。

git clone 则是把已有的远程仓库完整复制到本地,包括全部历史和分支:git clone 仓库地址 会在当前目录下创建一个与项目同名的文件夹,可以在末尾再加一个参数指定文件夹名。克隆下来的仓库自动配置好指向来源的远程地址(名字叫 origin),后续推送和拉取都基于它。GitHub 页面上的 Code 按钮会给出 HTTPS 和 SSH 两种地址:HTTPS 简单通用、推送时可能需要令牌认证;SSH 需要先配置密钥,之后免密,是开发者的主流选择。

怎么选?自己的新项目用 git init 起步,等要备份或协作时再在托管平台建远程仓库关联起来(后面的 remotes 一章会讲);参与已有项目、或者把自己在平台上的项目拉到新电脑,用 git clone。两条路最终得到的本地仓库没有任何差别。

示例

从零创建一个新项目并初始化仓库:

mkdir my-new-project
cd my-new-project
git init -b main
git status
cd ..

git status 会提示「位于分支 main,尚无提交」,说明仓库已就绪。克隆演示用本地仓库完成(效果和从 GitHub 克隆一样,只是不需要网络):

git clone . ../repo-backup
cd ../repo-backup && git log --oneline
cd ../repo

真实项目中克隆远程仓库的写法(需要网络,示意):

# 仅示意:从 GitHub 克隆真实仓库
git clone https://github.com/octocat/Hello-World.git
git clone git@github.com:octocat/Hello-World.git my-dir

常见坑

  • 在已有仓库里再 git init:父目录是仓库时,子目录里的新仓库会造成嵌套,子仓库的文件对父仓库不可见,极易混乱。先想清楚仓库边界。
  • 把整个硬盘或用户目录初始化成仓库:在 ~ 或桌面随手 git init,Git 会尝试跟踪成千上万个文件,status 卡死。仓库应该对应单个项目目录。
  • clone 后找不到文件:克隆会在当前目录新建一个项目文件夹,文件在里面,不在当前目录。记得 cd 进去。
  • HTTPS 克隆私有仓库反复要密码:GitHub 早已不接受账号密码做 Git 认证,需要用个人访问令牌(PAT)或改用 SSH 地址。

小结

git init 从零创建仓库,git clone 完整复制已有仓库(含历史并自动关联 origin)。两者得到的本地仓库完全等价。下一节学习日常最高频的操作:查看状态与暂存文件。