4 初始化力场仓库

万事开头难。但仓库初始化这事儿,说难也难,说简单也简单。我自己带团队的时候,经常发现新人第一步就栽在「到底用 init 还是 clone」上。咱们今天就把这个坎儿迈过去,顺便把最核心的那个三区域模型刻在脑子里。

4.1 两把钥匙:git init 与 git clone

初始化一个力场仓库,有两种方式:

  • 从零开始 —— 用 git init 把当前目录变成仓库
  • 从远程复制 —— 用 git clone 把别人建好的仓库搬下来

我个人习惯,如果是全新项目,绝对首选 git init。为什么呢?因为干净。没有历史包袱,commit 记录完全由自己掌控。我记得刚转行做版本管理那会儿,老想着偷懒,直接 clone 别人的模板仓库,结果里面一堆莫名其妙的分支和 tag,清理花了一个下午。

核心区别表
维度git initgit clone
适用场景新建本地项目需要现有远程仓库
是否要求远程不需要必须提供 URL
创建后目录空工作区 + .git已有文件 + .git
远程关联需手动 git remote add自动关联 origin

实际操作很简单。打开终端,进到你的力场文件目录:

mkdir my-force-field
cd my-force-field
git init

执行完你会看到类似 Initialized empty Git repository in /path/to/my-force-field/.git/。这就代表仓库骨架搭好了。嗯,这里要注意:.git 目录就是仓库的命根子,里面存着所有版本快照、配置、引用。没事别手痒去删它,删了等于仓库连根拔起。

那 git clone 什么时候用呢?说白了,就是你想参与别人的力场项目,或者从公司服务器同步一份代码。举个例子:

git clone https://github.com/example/force-field-toolkit.git

这命令会做两件事:第一,在当前目录下创建一个 force-field-toolkit 文件夹;第二,把远程所有历史拉下来,自动配好 origin。我曾经犯过一个错:clone 之后直接修改文件,忘了先建分支,结果把 master 的提交搞乱了。避坑指南:git clone 后第一件事,git checkout -b my-feature。

4.2 三区域模型——你必须要看清的地图

搞初始化仓库,不搞懂工作目录、暂存区、仓库这三个区域的关系,后面绝对会迷路。我刚开始接触 Git 的时候,以为只有工作目录和仓库两层,结果 add 和 commit 傻傻分不清,丢了好几次改动。

来看看这个三区模型:

三区域模型与数据流向 工作目录 Working Directory 你看到的文件 可编辑、可删除 暂存区 Staging Area .git/index 存放下一次要提交的快照 仓库 Repository .git/objects 永久存储提交历史 git add git commit git checkout / git restore 💡 文件状态变迁:未跟踪 → 已暂存 → 已提交。每个区域独立,互不干扰。

你想想看,工作目录就是你电脑上能看到的文件,随便改。暂存区像一个中转站,你把改好的文件用 git add 放进去。仓库是最终存档位置,只有跑到仓库里的内容,才算真正被版本管理了。

为什么会分三个区?直接一个区不行吗?我第一次也这么想。后来在项目中遇到过这么个事:我同时改了三个力场文件,但只想把前两个提交,第三个还没改完。没有暂存区的话,要么全提交要么全不提交,太死板。暂存区给了你「挑着提交」的自由。

4.3 第一个力场文件提交

理论讲完,咱们实战走一遍。假设你刚建了一个力场项目,里面有个核心文件 force_field.cfg。第一件事,看看仓库状态:

git status

你会看到类似:

On branch master
No commits yet
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    force_field.cfg

文件是「未跟踪」状态。好,把它添加到暂存区:

git add force_field.cfg
git status

这时输出会变成:

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   force_field.cfg

看到「Changes to be committed」了吗?文件已经躺在暂存区了。接下来提交:

git commit -m "初始提交:添加力场配置文件"

执行后,Git 会告诉你:

[master (root-commit) a1b2c3d] 初始提交:添加力场配置文件
 1 file changed, 12 insertions(+)
 create mode 100644 force_field.cfg

恭喜,第一个提交完成了。这里面有个细节:-m 后面的提交信息必须写清楚「为什么改」,而不是「改了什么」。我记得有一次紧急修复,只写了「fix bug」,过了两个月看日志完全想不起 fix 了啥。从此我要求团队所有提交信息必须包含动机。

小技巧: 建议第一次提交前,先创建一个 .gitignore 文件,把编译产物、临时文件排除在外。否则一不小心把几百 MB 的中间文件加进来,后悔都来不及。
警告: 初始化仓库后,不要急着用 git add . 一股脑全加。先 git status 看看哪些文件不该进版本控制,比如 *.log、node_modules/、__pycache__ 等。我曾经把一个带密码的配置文件直接 add 进去了,结果推上远程才发现,只能重新生成密钥。

回到三区模型,你可以用 git log 看看刚产生的提交:

git log --oneline

输出:

a1b2c3d (HEAD -> master) 初始提交:添加力场配置文件

至此,整个「初始化 — 暂存 — 提交」的闭环就走通了。往后每改一次力场文件,都重复这个流程:edit → add → commit。你想想看,是不是比想象中简单?但千万别小看这第一步,很多团队在初始化阶段没统一规范,后面 merge 冲突、丢失改动全来了。

嗯,今天就到这。拿着这个三区模型去多练练,闭着眼也能说清楚「工作目录、暂存区、仓库」的关系。