Git 完全指南 / 01 - 简介:版本控制概念、Git 历史、集中式 vs 分布式
第一章:Git 简介
理解版本控制的本质,是掌握 Git 的第一步。
1.1 什么是版本控制
版本控制(Version Control System, VCS)是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。它允许你:
- 回溯历史:将文件回退到之前的某个状态
- 追踪变更:查看每次修改的内容、时间和作者
- 并行协作:多人同时在同一项目上工作而不互相覆盖
- 分支实验:创建独立的实验分支,不影响主线代码
- 备份恢复:分布式系统天然具备完整备份能力
版本控制的演进
本地版本控制 → 集中式版本控制 → 分布式版本控制
(RCS, 1982) (CVS/SVN, 1990s) (Git, 2005)
| 阶段 | 代表工具 | 核心特点 | 缺陷 |
|---|---|---|---|
| 本地 VCS | RCS | 本地补丁文件管理 | 无法协作 |
| 集中式 VCS | CVS、Subversion | 单一中央服务器 | 单点故障 |
| 分布式 VCS | Git、Mercurial | 每个节点完整镜像 | 学习曲线陡 |
1.2 Git 的诞生历史
背景:Linux 内核的版本管理困境
2005 年之前,Linux 内核开发使用 BitKeeper 这一商业分布式版本控制系统。BitKeeper 的许可证持有方 Larry McVoy 撤销了对开源社区的免费使用许可,迫使 Linux 内核社区寻找替代方案。
Linus Torvalds 的创造
2005 年 4 月 3 日,Linux 之父 Linus Torvalds 开始编写 Git。他的设计目标极为明确:
- 速度优先:分布式操作必须快
- 简单设计:内部数据结构清晰
- 完全分布式:支持离线工作
- 防止篡改:内容通过 SHA-1 哈希校验
- 高效处理大项目:支持像 Linux 内核这样的超大型仓库
💡 趣闻:Git 这个名字有多重含义。Linus 自嘲说这是"the stupid content tracker"(愚蠢的内容追踪器)。在英式俚语中,git 意为"讨厌的人"。
里程碑时间线
| 时间 | 事件 |
|---|---|
| 2005-04-03 | Linus 开始编写 Git |
| 2005-04-07 | 首次用于 Linux 内核提交 |
| 2005-06 | Git 性能已足够支撑内核开发 |
| 2005-07 | Junio Hamano 成为维护者 |
| 2007 | Git 被广泛采用,超越 BitKeeper |
| 2008 | GitHub 上线,推动 Git 全球普及 |
| 2022 | 迁移至 SHA-256,修复 SHA-1 漏洞 |
1.3 集中式 vs 分布式
集中式版本控制(Centralized VCS)
集中式系统如 CVS、Subversion (SVNN) 使用单一中央服务器存储所有版本数据。
┌─────────────┐
│ 中央服务器 │ ← 所有版本历史
│ (Single │
│ Server) │
└──────┬───────┘
│ 网络
┌────┼────┐
▼ ▼ ▼
用户A 用户B 用户C ← 只有最新版本快照
工作流程:
- 开发者从中央服务器 checkout 最新代码
- 本地修改后 commit 到中央服务器
- 必须联网才能提交和查看历史
致命缺陷:
- 🔴 单点故障:服务器宕机,所有人无法工作
- 🔴 单点丢失:服务器硬盘损坏,历史全部丢失
- 🔴 网络依赖:所有操作都需要网络连接
- 🔴 分支笨重:创建和合并分支代价高昂
分布式版本控制(Distributed VCS)
Git 等分布式系统中,每个开发者本地都有完整的仓库克隆。
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 开发者 A │◄──►│ 开发者 B │◄──►│ 开发者 C │
│ 完整仓库 │ │ 完整仓库 │ │ 完整仓库 │
└──────────┘ └──────────┘ └──────────┘
▲ ▲ ▲
└───────────────┼───────────────┘
│
┌───────▼───────┐
│ 远程仓库 (可选) │
│ (GitHub等) │
└───────────────┘
核心优势:
- 🟢 离线工作:所有操作本地完成,无需网络
- 🟢 完整备份:每个克隆都是完整备份
- 🟢 极速操作:本地操作,无需等待网络
- 🟢 灵活工作流:支持多种分支和合并策略
详细对比表
| 特性 | 集中式 (SVN) | 分布式 (Git) |
|---|---|---|
| 仓库结构 | 单一中央仓库 | 每个开发者拥有完整仓库 |
| 离线操作 | ❌ 不支持 | ✅ 完全支持 |
| 分支代价 | 重量级,较慢 | 轻量级,瞬间完成 |
| 合并效率 | 较慢,易冲突 | 极快,智能合并 |
| 速度 | 依赖网络 | 本地操作极快 |
| 存储效率 | 中等 | 高(打包压缩) |
| 学习曲线 | 平缓 | 较陡 |
| 单点故障 | 🔴 严重 | 🟢 无 |
| 权限控制 | 细粒度目录权限 | 仓库级别(需平台支持) |
| 大文件支持 | 原生支持 | 需要 LFS 扩展 |
| 原子提交 | ✅ | ✅ (Git 更快) |
| 适用场景 | 企业内网、权限管控 | 开源项目、分布式团队 |
1.4 Git 的核心设计理念
1.4.1 快照而非差异
传统 VCS(如 SVN)存储的是文件差异(delta):
版本1 → [diff] → 版本2 → [diff] → 版本3
Git 存储的是文件快照(snapshot):
版本1 [完整快照] → 版本2 [完整快照] → 版本3 [完整快照]
💡 Git 对未修改的文件只存储引用指针,不会造成空间浪费。
1.4.2 三层架构
┌─────────────────────────────────────────┐
│ 工作区 (Working Directory) │ ← 你编辑文件的地方
├─────────────────────────────────────────┤
│ 暂存区 (Staging Area) │ ← git add 后的区域
│ 也叫 Index │
├─────────────────────────────────────────┤
│ 仓库 (Repository) │ ← git commit 后的永久记录
│ .git 目录 │
└─────────────────────────────────────────┘
| 层级 | 存储位置 | 操作命令 | 说明 |
|---|---|---|---|
| 工作区 | 项目目录 | 直接编辑 | 你看到和编辑的文件 |
| 暂存区 | .git/index | git add | 准备提交的变更快照 |
| 仓库 | .git/objects | git commit | 永久保存的版本记录 |
1.4.3 一切皆对象
Git 的对象模型(Object Model)包含四种核心对象:
| 对象类型 | 说明 | 存储内容 |
|---|---|---|
| blob | 文件快照 | 文件内容 |
| tree | 目录快照 | 文件名、blob/tree 引用 |
| commit | 提交记录 | 作者、时间、tree 引用、父提交 |
| tag | 标签 | 指向 commit 的引用 |
commit ←── tree ←── blob (file1.md)
│ ├── blob (file2.md)
│ └── tree (subdir)
│ └── blob (file3.md)
▼
parent commit ←── tree ←── ...
1.4.4 内容寻址存储
Git 使用 SHA-1 哈希(2022 后逐步迁移至 SHA-256)作为对象的唯一标识:
# 文件内容决定了它的哈希值
$ echo "Hello Git" | git hash-object --stdin
557db03de997c86a4a028e1ebd3a1ceb225be238
# 相同内容永远产生相同哈希
$ echo "Hello Git" | git hash-object --stdin
557db03de997c86a4a028e1ebd3a1ceb225be238
这意味着:
- 相同内容只存储一次(去重)
- 任何篡改都能被检测到
- 完整性校验内建于系统中
1.5 Git 的应用领域
Git 已远远超越代码管理的范畴:
| 应用场景 | 说明 |
|---|---|
| 软件开发 | 最主流的代码版本管理 |
| 文档协作 | 技术文档、书籍写作 |
| 配置管理 | 服务器配置、IaC (Infrastructure as Code) |
| 数据科学 | 数据集版本管理、模型追踪 |
| 学术研究 | 论文版本管理、实验记录 |
| 游戏开发 | 资源管理(配合 LFS) |
| 网站部署 | Git-based 部署(如 Netlify、Vercel) |
| 笔记管理 | Obsidian、Logseq 等工具的底层同步 |
1.6 Git 的版本命名规范
Git 的版本号格式:主版本.次版本.修订版本
| 版本线 | 特点 |
|---|---|
| 2.30+ | 推荐最低版本,支持 sparse-checkout cone mode |
| 2.38+ | 支持 SHA-256 实验特性 |
| 2.40+ | 性能优化、安全修复 |
查看当前版本:
$ git --version
git version 2.45.0
业务场景
| 场景 | 为什么选择 Git |
|---|---|
| 初创团队协作 | GitHub/GitLab 免费方案,低成本启动 |
| 开源项目贡献 | 行业标准,所有主流开源项目使用 Git |
| 企业内部开发 | GitLab 自建方案,权限控制完善 |
| 个人知识管理 | 本地仓库 + 远程同步,安全可靠 |
| DevOps 自动化 | Git 事件触发 CI/CD,自动测试和部署 |
| 微服务架构 | 每个服务独立仓库,子模块管理依赖 |
扩展阅读
- Pro Git Book — 官方推荐的免费 Git 教材
- Git 内部原理 — 深入理解对象模型
- A Tutorial Introduction to Git — 官方入门教程
- Git from the Bottom Up — 从底层理解 Git
- Think Like (a) Git — Git 思维模型
🔗 下一章:02 - 安装配置 — 在各平台安装 Git 并完成初始配置