强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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。他的设计目标极为明确:

  1. 速度优先:分布式操作必须快
  2. 简单设计:内部数据结构清晰
  3. 完全分布式:支持离线工作
  4. 防止篡改:内容通过 SHA-1 哈希校验
  5. 高效处理大项目:支持像 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)

集中式系统如 CVSSubversion (SVNN) 使用单一中央服务器存储所有版本数据。

┌─────────────┐
│ 中央服务器   │  ← 所有版本历史
│  (Single     │
│   Server)    │
└──────┬───────┘
       │ 网络
  ┌────┼────┐
  ▼    ▼    ▼
用户A 用户B 用户C  ← 只有最新版本快照

工作流程

  1. 开发者从中央服务器 checkout 最新代码
  2. 本地修改后 commit 到中央服务器
  3. 必须联网才能提交和查看历史

致命缺陷

  • 🔴 单点故障:服务器宕机,所有人无法工作
  • 🔴 单点丢失:服务器硬盘损坏,历史全部丢失
  • 🔴 网络依赖:所有操作都需要网络连接
  • 🔴 分支笨重:创建和合并分支代价高昂

分布式版本控制(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,自动测试和部署
微服务架构 每个服务独立仓库,子模块管理依赖

扩展阅读


🔗 下一章02 - 安装配置 — 在各平台安装 Git 并完成初始配置