Skip to content
On this page

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)

  • 指向特定提交的不可移动指针
  • 通常用于版本发布
  • 指向当前所在分支的特殊引用
  • 指向当前工作目录所基于的提交

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的设计哲学是确保数据的完整性和一致性,同时提供灵活的分支和合并功能。