Appearance
Git 基础概念
理解Git的核心概念是掌握Git的关键。本章将详细介绍Git的基本概念和工作原理。
Git的核心概念
仓库(Repository)
Git仓库是存储项目文件和版本历史的地方。每个仓库都包含:
- 工作区(Working Directory):实际的项目文件
- 暂存区(Staging Area):准备提交的文件变更
- 版本库(Repository):包含完整的提交历史
工作区 ←→ 暂存区 ←→ 本地仓库 ←→ 远程仓库
提交对象(Commit)
提交是Git历史的基本单位,每个提交包含:
- 指向父提交的指针(第一个提交没有父提交)
- 作者和提交者信息
- 提交时间戳
- 提交信息
- 指向树对象的指针
树对象(Tree)
树对象表示特定时间点的目录结构,类似于文件系统的目录。
索引(Index)
索引也称为暂存区,是工作区和版本库之间的中间区域,用于准备下一次提交。
Git的数据模型
Git使用内容寻址文件系统,所有数据都以对象的形式存储:
Blob对象
- 存储文件内容
- 每个文件内容生成一个唯一的SHA-1哈希值
- 不存储文件名,只存储内容
Tree对象
- 指向Blob对象和其他Tree对象
- 存储目录结构和文件名
- 可以包含子目录
Commit对象
- 指向一个顶级Tree对象
- 包含提交信息、作者信息和时间戳
- 指向前一个Commit对象(父提交)
三种状态
Git中的文件有三种状态:
已提交(Committed)
- 文件已保存到本地仓库中
- 安全地存储在Git数据库中
已修改(Modified)
- 文件在工作区被修改
- 但尚未提交到暂存区
已暂存(Staged)
- 文件已标记要包含在下次提交中
- 保存在暂存区
Git工作流程
基本工作流程
1. 在工作区修改文件
2. 将文件添加到暂存区 (git add)
3. 提交暂存区的更改 (git commit)
4. 推送到远程仓库 (git push)
详细流程示例
bash
# 1. 检出仓库或更新本地仓库
git clone https://github.com/user/repo.git
# 或
git pull origin main
# 2. 在工作区修改文件
echo "new content" >> myfile.txt
# 3. 查看状态
git status
# 输出类似:
# 未暂存的更改:
# (使用 "git add <文件>..." 更新暂存区)
# 修改: myfile.txt
# 4. 添加到暂存区
git add myfile.txt
# 5. 查看状态
git status
# 输出类似:
# 要提交的更改:
# (使用 "git commit" 提交更改)
# 修改: myfile.txt
# 6. 提交更改
git commit -m "Add new content to myfile"
# 7. 推送到远程仓库
git push origin main
Git对象类型详解
Blob对象示例
bash
# 创建一个文件
echo "Hello, Git!" > hello.txt
# 将文件添加到Git(这会创建一个blob对象)
git add hello.txt
# 查看blob对象
git ls-files -s hello.txt
# 输出:100644 <blob-hash> 0 hello.txt
# 查看blob内容
git show <blob-hash>
Tree对象示例
bash
# 查看当前目录的tree对象
git write-tree
# 输出tree对象的hash
# 查看tree内容
git ls-tree HEAD
# 输出类似:
# 100644 blob <hash> hello.txt
Commit对象示例
bash
# 查看最后一次提交的详细信息
git cat-file -p HEAD
# 输出:
# tree <tree-hash>
# parent <parent-hash>
# author Your Name <email@example.com> <timestamp>
# committer Your Name <email@example.com> <timestamp>
#
# Commit message
Git引用(References)
分支(Branch)
- 指向特定提交的可移动指针
- 默认分支通常命名为main或master
标签(Tag)
- 指向特定提交的不可移动指针
- 通常用于版本发布
HEAD
- 指向当前所在分支的特殊引用
- 指向当前工作目录所基于的提交
Git的分布式特性
本地操作
Git的许多操作都在本地进行,不需要网络连接:
bash
# 以下操作都在本地完成
git log # 查看提交历史
git diff # 查看差异
git commit # 提交更改
git checkout # 切换分支
远程操作
只有涉及远程仓库的操作才需要网络连接:
bash
# 以下操作需要网络连接
git clone # 克隆远程仓库
git pull # 拉取远程更新
git push # 推送本地更改
git fetch # 获取远程更新
Git配置层级
Git配置有三个层级:
1. 系统级配置(--system)
- 针对整个系统的所有用户
- 配置文件位置:/etc/gitconfig
bash
git config --system user.name "System User"
2. 用户级配置(--global)
- 针对当前用户
- 配置文件位置:~/.gitconfig
bash
git config --global user.name "Global User"
3. 仓库级配置(--local)
- 针对当前仓库
- 配置文件位置:.git/config
bash
git config --local user.name "Local User"
配置优先级:local > global > system
Git内部结构
.git目录结构
.git/
├── HEAD # 指向当前分支
├── config # 仓库配置
├── description # 仓库描述(仅用于GitWeb)
├── hooks/ # 钩子脚本
├── info/ # 额外信息
├── objects/ # Git对象(blob、tree、commit)
└── refs/ # 引用(分支、标签)
理解这些基础概念有助于更好地使用Git,避免在使用过程中出现意外情况。Git的设计哲学是确保数据的完整性和一致性,同时提供灵活的分支和合并功能。