01 版本控制系统
一、Git 简介
Git 是一个开源的分布式版本控制系统,广泛用于代码管理。为什么学习 Git:
- 个人:掌握 Git 的基本操作后,你将能够更高效地管理你的代码,避免丢失重要的修改,并且可以随时回到历史版本。
- 团队:有效的组织团队协作,加速开发速度。
下面推荐一个视频教程,共 19 集,视频的优点是容易理解,缺点是不便查询。通过视频熟悉 Git 后,可继续阅读 Git 官网上的书籍继续深入学习 Git,可在我的笔记网站查询 Git 知识点。
二、版本控制系统的发展
2.1 无版本控制系
如果不使用版本控制系统,开发者往往直接在代码文件中进行修改。当项目逐渐变得复杂时,手动管理这些变更变得困难且容易出错。特 别是当多个开发者同时参与同一个项目时,如何协调各自的修改并避免冲突是一个巨大挑战。
2.2 集中化的版本控制系统
诸如 CVS、SVN(Subversion)以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
集中化的版本控制系统使用起来相对简单,管理起来也更加容易。任何人想要获取最新的文件或更新文件都需要连接到中央服务器。如果中央服务器挂掉,所有人的工作都将受到影响。

2.3 分布式版本控制系统
Git 使用分布式存储,每个人都拥有完成的项目代码,几乎所有 Git 操作都能在本地完成,十分便利、快捷。因为本地拥有完成的仓库,所以能比 SVN 做更多的操作。

三、Git 基于快照
3.1 快照 vs 差异比较
传统的版本控制系统(SVN、CVS...)基于 差异文件:

而 Git 的工作原理基于 快照:

快照 比 差异文件(SVN 方案)具有更高的效率,尤其是当你有大量文件和提交历史时,因为快照不需要复杂的计算。
详情可阅读 Git 官网的书籍。
3.2 Git 文件保存在哪儿
假设你正在编辑一个 hello-world 项目
- 不用 Git,项目结构如下:
.
├── hello-world.cpp
└── README.md
1 directory, 2 files
- 使用 Git ,项目结构如下:
.
├── .git
├── hello-world.cpp
└── README.md
2 directories, 2 files
.git/
是初始化 Git 仓库时生成的,它保存着你项目的所有历史存档。千万不要删除和手动编辑它。
.git
├── branches
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-merge-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ ├── push-to-checkout.sample
│ ├── sendemail-validate.sample
│ └── update.sample
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs
├── heads
└── tags
10 directories, 18 files
3.3 工作区 暂存区 版本库
当你使用 Git 管理你的项目之后,原本的项目文件被成为 工作区
.
├── hello-world.cpp
└── README.md
.git/
中则包含版本库和暂存区。
版本库 是 Git 为你的工作区提供永久存档。每次存档都会产生一个新的历史版本(快照)。
有时我们对工作区做一些 类似草稿的修改,如果一次次将草稿保存到版本库,版本库会越来越凌乱。有时候知识想要临时存档,于是 暂存区 被设计出来,将工作区存档到暂存区时,不会产生新的历史版本,而是用新版本覆盖旧版本。

总令我联想到计算机程序的运行结构:CPU 寄存器(执行)、内存(缓存)、硬盘(存档)。
详情可阅读 Git 官网的书籍。
四、Git 的精华
- 分支管理
Git 的分支让你“像保存文件一样保存想法”,快速尝试、独立开发、轻松协作,是现代开发不可或缺的能力。
- 良好的生态
Git 提供丰富的命令和钩子系统,并被 GitHub、GitLab、Gitea 等平台扩展出 CI/CD、代码审查等现代软件开发核心功能。