Skip to content

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 main

clone 到错误路径:文件夹挪走即可,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/mainorigin/main 只在 fetch / pull / push 时更新。

本地 main 在 C4,origin/main 仍停在 C3,属于 ahead 1,不是故障。

这不是分叉故障,只是「本地比远程新」。git status 会写 ahead 1。反过来 behind 表示远程有你没拿的提交。


下一章:03 · 日常改代码与提交