外观
02 · 创建与克隆仓库
这一章只解决「仓库从哪来、远程叫什么、我跟踪的是谁」。
git init
作用: 在当前目录创建新的 Git 仓库(生成 .git/)。
改动范围: 新建本地仓库。没有远程,没有提交。
典型场景:
- 本地先写着玩的项目,稍后才挂到 GitHub。
- 一个从来没用过 Git 的旧目录,要开始版本管理。
常用写法:
bash
mkdir demo && cd demo
git init
git add .
git commit -m "chore: 初始提交"init.defaultBranch 决定第一笔提交后默认分支名(现在多为 main)。
git init --bare: 创建一个没有工作区的「裸仓库」,通常给服务器当远程用。日常开发不要在业务目录里 --bare。
不要这样用: 在已经是 Git 仓库的目录里再 init 套娃(会提示 already initialized;一般无害,但说明你可能走错目录)。在家目录或磁盘根目录 git init 会把整盘当成一个仓库。
做错了怎么办: 如果是空仓库、还没有你在乎的提交,删掉 .git/ 即可回到普通目录。已经有提交时,删 .git/ 等于丢掉全部历史,先看 急救手册。
git clone
作用: 把远程仓库完整(或按选项裁剪)复制到本地,自动加上名为 origin 的远程,并检出默认分支。
改动范围: 新建本地目录 + 本地历史 + 远程跟踪分支。不改远程。
典型场景:
- 加入已有项目,第一次把代码拿到电脑上。
- 仓库很大,只想要最近历史或某一个分支。
- 仓库带 submodule,希望一次拉全。
常用写法:
bash
# 最常见:HTTPS 或 SSH
git clone https://github.com/example/demo.git
git clone git@github.com:example/demo.git
# 指定本地目录名
git clone https://github.com/example/demo.git my-demo
# 只检出某个分支(仍会配置 origin)
git clone --branch feature/login --single-branch https://github.com/example/demo.git
# 浅克隆:只要最近 1 次提交,历史会不完整
git clone --depth 1 https://github.com/example/demo.git
# 带子模块
git clone --recurse-submodules https://github.com/example/demo.git浅克隆之后如果要补全历史:
bash
git fetch --unshallow不要这样用:
- 仓库已经乱了,第一反应是删掉再 clone。本地未推送的 commit、stash、reflog 会一起没。先走急救手册。
- 在已有项目目录内部再 clone 一份,变成套娃路径,IDE 容易打开错仓库。
做错了怎么办: clone 下错分支,不必重来:
bash
git fetch origin
git switch mainclone 到错误路径:文件夹挪走即可,Git 不依赖绝对路径(注意 submodule / worktree 是例外,见第 08、11 章)。
git remote
作用: 管理「远程仓库地址」的别名,默认那个别名是 origin。
改动范围: 仅 .git/config。不改提交,不自动推送。
典型场景:
git clone下来后确认远程对不对。- 本地
init的仓库,第一次挂上 GitHub。 - 同一个项目有两个远程:
origin(自己的 fork)和upstream(原仓库)。 - 仓库搬家,URL 变了。
常用写法:
bash
git remote -v
git remote add origin git@github.com:example/demo.git
git remote add upstream git@github.com:acme/demo.git
git remote rename origin old-origin
git remote remove old-origin
# 只改地址,保留名字
git remote set-url origin git@github.com:example/demo.git加上远程之后,第一次推当前分支并建立跟踪:
bash
git push -u origin main之后直接 git push / git pull 即可。跟踪关系可用 git branch -vv 查看。
不要这样用: git remote remove origin 之后以为提交也没了。提交还在本地,只是不知道往哪推。
做错了怎么办: 删错 remote,按上面 remote add 加回来。URL 写错导致 push 到别人的空仓库:本地历史仍在,改 set-url 再推到正确地址;已推到错误远程的提交,去那个远程删除或作废(权限和礼貌问题,不是 Git 语法问题)。
远程跟踪分支是什么
git branch -vv 里类似:
* main a1b2c3d [origin/main] feat: 登录表示本地 main 跟踪 origin/main。origin/main 只在 fetch / pull / push 时更新。

这不是分叉故障,只是「本地比远程新」。git status 会写 ahead 1。反过来 behind 表示远程有你没拿的提交。
下一章:03 · 日常改代码与提交