00. 改崩代码不敢回退?Git 版本控制 3 分钟救你狗命

「Git」系列已发布: 00. 改崩代码不敢回退?Git 版本控制 3 分钟救你狗命(本文) | 01. Git 装完不会配?Windows/macOS/Linux 三端配置一次到位

版本控制的发展史里藏着 Git 解决的核心痛点。本文从“为什么需要版本控制”讲起,帮你建立对 Git 的底层认知,改崩了也敢回退。

如果你写过代码,大概率经历过这种事:改了一下午的功能发现方向错了,想回到上午的状态却不知道怎么回退。或者同事和你同时改了一个文件,合并的时候一团乱麻。

版本控制系统就是用来收拾这种局面的。它做的事可以概括为四件:

  • 回溯历史:任何时候都能回到文件的任意历史版本,看谁在什么时候改了什么。
  • 多人协作:多人同时改同一份代码,自动或半自动地合并这些修改——不用再靠 IM 传文件了。
  • 分支开发:从主线拉一个独立分支搞功能或修 bug,搞完再合回去,不影响主线。
  • 容灾恢复:手滑删了文件?从版本库里找回来就行。
    版本控制这件事,经历了几代演进。

一、本地版本控制:从手动复制说起

最早的"版本控制"说出来有点好笑——复制文件,在文件名后面加版本号。报告_v1.doc、报告_v2_final.doc、报告_v2_final_最终版.doc……谁还没见过这种命名?

这招简单,但基本没法做 diff,也看不出两个版本之间到底改了什么。

后来有了 RCS(Revision Control System),在本地磁盘上维护一个补丁集,每个补丁记录文件从版本 A 到版本 B 的变化。通过叠加补丁就能重建任意时间点的文件:


# RCS 基本工作流程示意

ci -u report.txt    # 将文件检入版本库
co -l report.txt    # 检出文件并锁定编辑

二、集中式:CVS、SVN 的时代

RCS 解决了个人版本管理,但团队协作怎么办?于是集中式版本控制系统(CVCS)出场了。CVS、Subversion(SVN)、Perforce 都是这路子。

核心思想很简单:弄一个中央服务器,所有版本的代码都放上面,每个人从服务器 checkout 最新版本,干完活再 commit 回去。


# SVN 典型工作流

svn checkout https://svn.example.com/project/trunk  # 检出项目
svn update                                           # 更新到最新版本

# 编辑文件...

svn commit -m "修复了登录页面的CSS布局问题"           # 提交修改

集中式模型管理方便
、权限控制清晰——但它有个致命伤:单点故障。中央服务器一挂,所有人都没法提交、没法看历史、没法干活。而且开发者离线时基本废了,连 commit 都做不了。

三、分布式:Git 怎么处理这个问题

分布式版本控制系统(DVCS)直接把上面的痛点干掉了。Git、Mercurial、Bazaar 都是这个阵营的。
在 DVCS 里,每个开发者 clone 下来的不只是最新代码——而是完整的版本库,包含全部历史记录。这意味着:

  • 就算中央服务器彻底挂了,随便拿一个开发者的本地仓库就能完整恢复整个项目。
  • 离线状态下可以自由 commit、切分支、看历史,等有网了再 push。
  • 每个本地仓库天然就是一份完整备份。

三种模型的对比一目了然:

特性 本地(RCS) 集中式(SVN) 分布式(Git)
历史存哪 本地磁盘 中央服务器 每个克隆副本
离线提交 支持 不支持 支持
多人协作 不支持 支持(需联网) 支持(可离线后同步)
单点故障风险 无(仅影响单机) 极高 几乎为零
分支操作成本 高 中 极低

3.1 Git 的核心设计思路

Git 是 Linus Torvalds 在 2005 年写的,最初就是为了管 Linux 内核源码。它的设计目标简单粗暴:快、数据不能丢、支持分布式非线性工作流。

3.1.1 快照,不是差异

SVN 这类系统存的是"差异"——记录文件从版本 A 到版本 B 改了什么。想重建某个版本?得从初始版本开始,逐个打补丁。
Git 不这么干。每次提交都是整个项目的完整快照。如果某个文件没变,Git 不重新存它,而是留一个指向上一个版本的引用。这个设计让分支切换、历史查看之类的操作快到离谱。

下面用 mermaid 对比两种存储模型:

SVN 模式(基于差异):

flowchart LR V1["v1
file"] -->|"+patch"| D1["Delta1"] D1 -->|"+patch"| D2["Delta2"] D2 -->|"+patch"| D3["Delta3"]

Git 模式(基于快照):

flowchart LR subgraph v1[v1] A1[A] B1[B] end subgraph v2[v2] A2[A] B2[B'] end subgraph v3[v3] A3[A'] B3[B'] C3[C] end subgraph v4[v4] A4[A'] B4[B'] C4[C'] end v1 --> v2 --> v3 --> v4

SVN 要重建某个版本得从初始版本逐个打补丁;Git 每次提交都是完整快照,文件没变就保留对上一版本的引用,无需重建。

3.1.2 本地操作优先

Git 的绝大多数操作只访问本地文件,不需要网络。这和 SVN 形成鲜明对比——SVN 里svn log要连服务器,svn diff也要连服务器。
本地操作的优势是实打实的:

git log --oneline --graph    # 完整提交历史,秒出
git diff HEAD~3 HEAD         # 最近三次提交的变化,秒出

3.1.3 三种状态、三个区域

理解 Git 的文件状态流转是整个知识体系里最重要的一环。
Git 里的文件只有三种状态:

  1. 已修改(modified):文件改了,但 Git 还没记录。
  2. 已暂存(staged):当前版本已被标记,包含在下一次提交里。
  3. 已提交(committed):文件已经安全存进本地 Git 数据库了。

对应三个工作区域:

区域 说明 状态
工作目录(Working Directory) 你正在编辑的文件 已修改
暂存区(Staging Area / Index) 即将提交的文件快照 已暂存
Git 仓库(.git 目录) 元数据和对象数据库 已提交

流转方向:


# 工作目录 -> 暂存区

git add file.txt

# 暂存区 -> Git 仓库

git commit -m "描述信息"

# 三区流转示意

# 工作目录 --(git add)--> 暂存区 --(git commit)--> Git 仓库

3.2 Git 怎么保证数据不丢

Git 把所有数据当成一个内容可寻址的文件系统。提交、文件、目录——一切对象都通过 SHA-1 哈希值来标识和校验。


# 每次提交都有一个唯一的 SHA-1 校验和

$ git log --oneline
a3f2b1c 修复用户登录令牌过期问题

2c1f4b6 初始化项目结构

这意味着三件事:

  • 不可篡改:改写提交历史会生成全新的哈希值,没法偷偷覆盖已有记录。
  • 自动校验:每次操作 Git 都会校验对象完整性。磁盘坏了、被人篡改,立刻就能发现。
  • 全局唯一:40 位 SHA-1 碰撞概率约 2^80 分之一,实际使用中每个 commit ID 可以认为是全球唯一的。

3.3 跟其他版本系统比一下

对比维度 Git SVN Mercurial
架构模型 分布式 集中式 分布式
存储方式 快照 差异 差异+快照混合
分支模型 轻量指针,创建几乎无成本 目录拷贝,成本高 轻量指针
离线能力 完全支持 只能编辑,不能提交/查历史 完全支持
学习曲线 较陡 平缓 介于两者之间
生态系统 GitHub / GitLab / Bitbucket 等 传统,托管平台少 托管平台较少
社区活跃度 极高(事实标准) 持续下降 较小

四、系列路线图

本系列从零开始,按这个顺序往下走:

  1. 安装与环境配置(第 01 篇)
  2. 核心配置详解(第 02 篇)
  3. 基本工作流与核心概念实操(第 03 篇)
  4. 仓库初始化与克隆(第 04 篇)
  5. 文件状态与生命周期管理(第 05 篇)
  6. 提交与日志管理(第 06 篇)
  7. 分支管理基础与进阶(第 07-08 篇)
  8. 远程仓库协作(第 09 篇)
  9. 标签与版本发布(第 10 篇)
  10. 变基与历史整理(第 11-12 篇)
  11. Hooks 与子模块(第 13-14 篇)
  12. 工作流模型对比与实践(第 15 篇)
  13. 高级调试与性能优化(第 16-17 篇)
  14. 安全实践与最佳实践总结(第 18-19 篇)

五、文章引用

下一篇:01. Git 装完不会配?Windows/macOS/Linux 三端配置一次到位

📌 本文首发于微信公众号 【运维知识点滴】——专注运维实战干货,微信搜索“运维知识点滴”或扫下方二维码关注,更新不迷路。
📎 微信原文:00. 改崩代码不敢回退?Git 版本控制 3 分钟救你狗命

微信公众号【运维知识点滴】 微信小程序【A5单据合并&大试卷拆分转A4打印】
运维实战干货 · 关注追更 Word 转 PDF · 试卷/发票打印神器 · 免费
运维实战干货 · 关注追更 Word 转 PDF · 试卷/发票打印神器 · 免费

💡 小程序【A5单据合并&大试卷拆分转A4打印】是干嘛的? 一个 Word 转 PDF 的打印神器,专治“文档版式和打印机对不上”:

  • A3 试卷打不出来? 学校发的电子版试卷多是 A3,家用打印机只吃 A4——上传 Word 一键转换:可缩到一页 A4(页数不变),也可对半拆成两张 A4(1:1 原大、字更清晰),两种模式自选;
  • 版式不乱:真实渲染引擎原样转换、绝不重排内容,转出的 PDF 和原 Word 排版一致,公式/表格/图片不跑版;
  • 两张 A5 单据拼一张 A4:出租车票、火车票等报销凭证拼版后,一次打印、整齐粘贴;
  • 隐私省心:无需注册,转换结果留存 5 天、最多下载 5 次即自动删除,不留任何历史记录;
  • 微信扫码即用,免费、免安装,支持 doc / docx(≤50MB)。