Skip to content

版本控制概述

什么是版本控制

版本控制(Version Control)是一种记录文件或文件集合随时间变化的系统,以便将来可以回溯到特定版本。版本控制系统(VCS)是软件开发中不可或缺的工具。

版本控制能做什么

  • 历史记录:追踪每一次文件修改,记录谁在何时做了什么改动
  • 回退恢复:任意回退到历史某个版本,从错误中快速恢复
  • 并行开发:多人同时在不同功能上工作,互不干扰
  • 代码审查:通过对比差异,进行代码审查和质量控制
  • 分支实验:在独立分支上做实验,不影响主线代码

没有版本控制会怎样

没有版本控制时,开发者通常会:

  • 手动复制目录:project-v1project-v2project-finalproject-final2
  • 用日期命名备份:project-20240101
  • 覆盖式修改,丢失历史

这种方式混乱、低效,难以协作,也容易造成数据丢失。

集中式 vs 分布式版本控制

集中式版本控制(CVCS)

代表产品:CVSSubversion(SVN)Perforce

开发者 A  ──┐
开发者 B  ──┼──→  中央服务器(单一版本库)
开发者 C  ──┘

优点:

  • 概念简单,易于理解
  • 权限管理集中,便于控制
  • 可以针对特定目录授权

缺点:

  • 单点故障:服务器宕机则所有人无法工作
  • 历史数据全在服务器,本地无完整副本
  • 网络依赖强,离线时无法提交
  • 分支操作慢,代价高

分布式版本控制(DVCS)

代表产品:GitMercurialBazaar

开发者 A(完整副本)──┐
开发者 B(完整副本)──┼──→  远程仓库(可选)
开发者 C(完整副本)──┘

优点:

  • 每个开发者都有完整的仓库副本
  • 离线也能完整工作(提交、查看历史、切换分支)
  • 没有单点故障,任意一份副本都可以恢复
  • 分支操作极其轻量快速
  • 支持灵活的工作流(多个远程仓库)

缺点:

  • 学习曲线较陡
  • 初次克隆大型仓库较慢(需要下载完整历史)

Git 的诞生与设计哲学

Git 的诞生

Git 由 Linus Torvalds(Linux 内核之父)于 2005 年创建。

起因是 Linux 内核社区与 BitKeeper 公司的版权纠纷,BitKeeper 停止向 Linux 内核项目免费提供服务。Linus 决定自己开发一个版本控制系统,目标是:

  • 速度极快
  • 设计简洁
  • 支持非线性开发(数千个并行分支)
  • 完全分布式
  • 能高效管理像 Linux 内核这样的大型项目

仅用了 10 天,Git 就基本可用,并于同年正式替代了 BitKeeper 管理 Linux 内核代码。

Git 的设计哲学

1. 快照而非差异

大多数版本控制系统存储文件的差异(delta),Git 存储的是完整快照。每次提交,Git 都保存所有文件的快照(通过哈希去重,未修改的文件只存储引用)。

差异存储(SVN 风格):
版本1: 文件A-基础版
版本2: 文件A-基础版 + 差异1
版本3: 文件A-基础版 + 差异1 + 差异2

快照存储(Git 风格):
版本1: 文件A快照1
版本2: 文件A快照2(引用A快照1 + 文件B快照1)
版本3: 文件A快照2(引用)+ 文件B快照2

2. 本地操作优先

绝大多数操作只需要本地数据,无需网络:

  • 查看历史记录
  • 对比文件差异
  • 提交代码
  • 切换分支

3. 数据完整性

Git 中的所有数据在存储前都会用 SHA-1 哈希算法计算校验和,通过该校验和引用数据。这意味着:

  • 任何文件内容改变都会被检测到
  • 不可能在 Git 不知情的情况下修改任何内容

4. 只增不减

Git 几乎只向数据库中增加数据。已提交的数据很难丢失。这让开发者可以大胆实验,无需担心破坏项目。

5. 三种状态

Git 文件有三种主要状态:已修改(modified)已暂存(staged)已提交(committed),对应三个主要区域:工作区、暂存区、本地仓库。

总结

版本控制是现代软件开发的基础设施。Git 以其分布式架构、极速的分支操作和强大的完整性保证,成为当今最流行的版本控制系统。无论是个人项目还是大型团队协作,掌握 Git 都是每位开发者的必备技能。

下一节将深入了解 Git 的核心概念,帮助你建立正确的思维模型。