Git 从入门到精通(二):创建本地仓库与三大核心区域

前言

在上一篇文章中,我们完成了 Git 的安装与验证,算是把"工具"准备好了。但是,光有工具还不行,我们得有一个存放代码的"工作台"。在 Git 的世界里,这个工作台叫做仓库(Repository)。

很多初学者刚开始用 Git 时,只知道机械地敲 git add . 和 git commit -m "update",但完全不清楚这背后文件到底去了哪里。本篇我们将从零创建一个本地仓库,并揭开 Git 最核心的设计------工作区、暂存区、版本库。理解了这三大区域,你才算真正跨进了 Git 的大门。

1 创建本地仓库与 .git 目录探秘

要使用 Git 管理项目,第一步就是初始化一个本地仓库。我们在 Xshell 连上 CentOS 服务器后,假设要在 /home/xc 目录下创建一个名为 my-project 的项目:

bash 复制代码
# 1. 创建并进入项目目录
mkdir -p /home/xc/my-project
cd /home/xc/my-project

# 2. 初始化 Git 仓库
git init

执行 git init 后,终端会提示 Initialized empty Git repository in /home/xc/my-project/.git/。这时候你通过 ls -a 查看,会发现目录下多了一个隐藏文件夹:.git。

bash 复制代码
$ git init
Initialized empty Git repository in /home/xc/my-project/.git/
$ ls -a
.  ..  .git

这个 .git 文件夹就是 Git 的灵魂。你可以使用 tree 命令来看一下它的内部结构(如果 CentOS 提示找不到 tree 命令,可以通过 yum install -y tree 安装):

bash 复制代码
$ 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
    `-- tags

9 directories, 13 files

你会看到 HEAD、config、objects、refs 等文件和目录。

重要警告: 以后在开发过程中,千万不要手动去修改或删除 .git 目录里面的任何内容。这里是 Git 的"大脑",里面存储了所有的版本历史、配置和对象数据。如果你手动修改了里面的文件,极大概率会导致仓库彻底损坏、代码丢失。

2 配置本地仓库(用户名与邮箱)

Git 是一个分布式版本控制系统,当多人协作时,系统需要知道每一次提交是谁做的。因此,在提交代码前,我们需要配置用户的 name 和 email。这里我们重点讲只对当前本地仓库生效的配置方式:

bash 复制代码
# 配置当前仓库的用户名
git config user.name "你的用户名"

# 配置当前仓库的邮箱
git config user.email "你的邮箱地址"

配置完成后,使用以下命令可以查看当前仓库的所有配置:

bash 复制代码
git config -l

如果你发现名字或者邮箱填错了,想要删除这两项配置,可以使用 --unset 参数:

bash 复制代码
git config --unset user.name
git config --unset user.email

延伸:配置所有本地仓库(全局配置)

如果你想让这台服务器上的所有 Git 仓库都使用相同的身份,可以加上 --global 参数。这也是我们在实际开发中最常用的方式:

bash 复制代码
# 配置全局用户名与邮箱
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱地址"

同理,如果想重置/删除全局配置,只需在 --unset 命令前加上 --global 即可:

bash 复制代码
git config --global --unset user.name
git config --global --unset user.email

小结: 不加 --global 是"局部配置"(只影响当前仓库),加了是"全局配置"。局部配置的优先级高于全局配置。

3 认识三大核心区域

接下来是本节的重头戏。请对照上面的图片,我们把 Git 的核心工作流拆解为三大区域:

  1. 工作区(Working Directory): 就是服务器上你能看到的文件目录(比如刚才创建的 /home/xc/my-project 文件夹,对应图左侧的区域)。在这里你可以自由地新建、修改、删除文件。

  2. 版本库(Repository): 就是那个隐藏的 .git 目录(对应图右侧的大黑框)。它包含了 Git 所有的版本历史,是 Git 真正的"大脑"。

  3. 暂存区(Stage / Index): 它存在于版本库中,是一个临时存放区域(对应图中的 stage (index) 框)。

  4. git add 做了什么?

    当你在工作区修改了文件,执行 git add 时,Git 会将工作区中修改的内容添加进版本库的暂存区中。此时,修改还没有真正被记录为历史版本。

  5. 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 小结

这一节我们完成了三件事:

  1. 使用 git init 创建了本地仓库,并看到了神秘的 .git 目录(牢记不要手动修改它)。

  2. 学习了如何对"本地仓库"和"全局仓库"进行用户名、邮箱的配置、查看与重置。

  3. 结合图片认识了 Git 的三大核心区域,并深入了解了 add 与 commit 的底层逻辑,以及 objects 对象库、master 分支和 HEAD 指针的关系。

现在,仓库建好了,理论也懂了,可是我们还没写过一行代码。下一节,我们将正式动手,体验添加文件、查看状态、修改文件、版本回退等一系列基本操作。

相关推荐
蹊黎5 小时前
Git 从入门到精通(一):初识 Git 与环境搭建
git
゛凌乱的记忆づ1 天前
好用的md文件编辑器——TyporaS与Typora
笔记·git·typora·markdown
এ慕ོ冬℘゜1 天前
Git 基础规范:小步提交、提交信息规范与常用命令
git·svn
忘了ʷºᵇₐ1 天前
Git学习笔记
笔记·git·学习
BIBI20492 天前
换 Git 托管平台怎么做?基于 TortoiseGit 的跨平台迁移教程
windows·git·tortoisegit·问题解决·版本控制·最佳实践
echome8882 天前
Git 日常救急:撤销提交、找回误删文件和解决冲突
git·版本控制
赵民勇2 天前
Git命令详解
git
不老刘3 天前
Antigravity 的 New Worktree 模式:给 AI 代理一个安全的“平行工位”
人工智能·git·ai编程·antigravity
光谱SpectrAI3 天前
Windows 也中招:Git Bash 和 Node 仍信任泄露的 eMudhra 证书
git