前言
在上一篇文章中,我们完成了 Git 的安装与验证,算是把“工具”准备好了。但是,光有工具还不行,我们得有一个存放代码的“工作台”。在 Git 的世界里,这个工作台叫做仓库(Repository)。
很多初学者刚开始用 Git 时,只知道机械地敲git add .和git commit -m "update",但完全不清楚这背后文件到底去了哪里。本篇我们将从零创建一个本地仓库,并揭开 Git 最核心的设计——工作区、暂存区、版本库。理解了这三大区域,你才算真正跨进了 Git 的大门。
1 创建本地仓库与 .git 目录探秘
要使用 Git 管理项目,第一步就是初始化一个本地仓库。我们在 Xshell 连上 CentOS 服务器后,假设要在/home/xc目录下创建一个名为my-project的项目:
# 1. 创建并进入项目目录mkdir-p/home/xc/my-projectcd/home/xc/my-project# 2. 初始化 Git 仓库gitinit执行git init后,终端会提示Initialized empty Git repository in /home/xc/my-project/.git/。这时候你通过ls -a查看,会发现目录下多了一个隐藏文件夹:.git。
$gitinit Initialized empty Git repositoryin/home/xc/my-project/.git/ $ls-a....git这个.git文件夹就是 Git 的灵魂。你可以使用tree命令来看一下它的内部结构(如果 CentOS 提示找不到tree命令,可以通过yum install -y tree安装):
$ tree .git .git|-- branches|-- config|-- description|-- HEAD|-- hooks||-- applypatch-msg.sample||-- commit-msg.sample||-- post-update.sample||-- pre-applypatch.sample||-- pre-commit.sample||-- prepare-commit-msg.sample||-- pre-push.sample||-- pre-rebase.sample|`-- update.sample|-- info|`-- exclude|-- objects||-- info|`-- pack`-- refs|-- heads `-- tags9directories,13files你会看到HEAD、config、objects、refs等文件和目录。
重要警告:以后在开发过程中,千万不要手动去修改或删除
.git目录里面的任何内容。这里是 Git 的“大脑”,里面存储了所有的版本历史、配置和对象数据。如果你手动修改了里面的文件,极大概率会导致仓库彻底损坏、代码丢失。
2 配置本地仓库(用户名与邮箱)
Git 是一个分布式版本控制系统,当多人协作时,系统需要知道每一次提交是谁做的。因此,在提交代码前,我们需要配置用户的name和email。这里我们重点讲只对当前本地仓库生效的配置方式:
# 配置当前仓库的用户名gitconfig user.name"你的用户名"# 配置当前仓库的邮箱gitconfig user.email"你的邮箱地址"配置完成后,使用以下命令可以查看当前仓库的所有配置:
gitconfig-l如果你发现名字或者邮箱填错了,想要删除这两项配置,可以使用--unset参数:
gitconfig--unsetuser.namegitconfig--unsetuser.email延伸:配置所有本地仓库(全局配置)
如果你想让这台服务器上的所有 Git 仓库都使用相同的身份,可以加上--global参数。这也是我们在实际开发中最常用的方式:
# 配置全局用户名与邮箱gitconfig--globaluser.name"你的用户名"gitconfig--globaluser.email"你的邮箱地址"同理,如果想重置/删除全局配置,只需在--unset命令前加上--global即可:
gitconfig--global--unsetuser.namegitconfig--global--unsetuser.email小结:不加
--global是“局部配置”(只影响当前仓库),加了是“全局配置”。局部配置的优先级高于全局配置。
3 认识三大核心区域
接下来是本节的重头戏。请对照上面的图片,我们把 Git 的核心工作流拆解为三大区域:
工作区(Working Directory):就是服务器上你能看到的文件目录(比如刚才创建的
/home/xc/my-project文件夹,对应图左侧的区域)。在这里你可以自由地新建、修改、删除文件。版本库(Repository):就是那个隐藏的
.git目录(对应图右侧的大黑框)。它包含了 Git 所有的版本历史,是 Git 真正的“大脑”。暂存区(Stage / Index):它存在于版本库中,是一个临时存放区域(对应图中的
stage (index)框)。git add做了什么?
当你在工作区修改了文件,执行git add时,Git 会将工作区中修改的内容添加进版本库的暂存区中。此时,修改还没有真正被记录为历史版本。git commit做了什么?
当你确认无误后,执行git commit,Git 会将暂存区中的内容提交到master分支下,这就是一次真正的版本保存。
4 揭秘版本库内部:对象与索引
结合这张图,我们再来深挖一下版本库内部的底层逻辑。理解这些底层的指针与对象关系,是掌握Git 高效存储机制的关键:
对象库(objects):位于
.git/objects目录下。无论是执行add还是commit,Git 都会将文件内容计算哈希值,打包成一个个Git 对象(git object),并统一存放在objects库中。这是 Git 真正保存数据的地方。暂存区的本质:仔细看图,
stage (index)里面放的不是真实文件,而是指向 objects 的索引(指针)。master 分支的本质:同理,
master分支里存放的也是一棵目录树,这棵树上的每一个文件节点,最终都指向 objects 库中的对象索引。HEAD:图右上角的
HEAD是一个指针,它始终指向当前所在的分支(目前是master)。只要拿到HEAD,Git 就能顺藤摸瓜,找到master对应的那棵树,从而读取整个版本库的内容。
一句话总结:工作区是看得见的文件,暂存区是待提交的索引清单,对象库(objects)是真正存放内容的保险箱,而
HEAD是带你寻宝的指南针。
我们也能在.git目录中看到一些相关内容:
5 小结
这一节我们完成了三件事:
使用
git init创建了本地仓库,并看到了神秘的.git目录(牢记不要手动修改它)。学习了如何对“本地仓库”和“全局仓库”进行用户名、邮箱的配置、查看与重置。
结合图片认识了 Git 的三大核心区域,并深入了解了
add与commit的底层逻辑,以及 objects 对象库、master分支和HEAD指针的关系。
现在,仓库建好了,理论也懂了,可是我们还没写过一行代码。下一节,我们将正式动手,体验添加文件、查看状态、修改文件、版本回退等一系列基本操作。