跳到主要内容

01 版本控制系统

一、Git 简介

Git 是一个开源的分布式版本控制系统,广泛用于代码管理。为什么学习 Git:

  • 个人:掌握 Git 的基本操作后,你将能够更高效地管理你的代码,避免丢失重要的修改,并且可以随时回到历史版本。
  • 团队:有效的组织团队协作,加速开发速度。

下面推荐一个视频教程,共 19 集,视频的优点是容易理解,缺点是不便查询。通过视频熟悉 Git 后,可继续阅读 Git 官网上的书籍继续深入学习 Git,可在我的笔记网站查询 Git 知识点。

二、版本控制系统的发展

2.1 无版本控制系

如果不使用版本控制系统,开发者往往直接在代码文件中进行修改。当项目逐渐变得复杂时,手动管理这些变更变得困难且容易出错。特别是当多个开发者同时参与同一个项目时,如何协调各自的修改并避免冲突是一个巨大挑战。

git-01-无 git

2.2 集中化的版本控制系统

诸如 CVS、SVN(Subversion)以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

集中化的版本控制系统使用起来相对简单,管理起来也更加容易。任何人想要获取最新的文件或更新文件都需要连接到中央服务器。如果中央服务器挂掉,所有人的工作都将受到影响。

image-20250414224101798

2.3 分布式版本控制系统

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

image-20250414223623176

三、Git 基于快照

3.1 快照 vs 差异比较

传统的版本控制系统(SVN、CVS...)基于 差异文件

存储每个文件与初始版本的差异。

而 Git 的工作原理基于 快照

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 为你的工作区提供永久存档。每次存档都会产生一个新的历史版本(快照)。

有时我们对工作区做一些类似草稿的修改,如果一次次将草稿保存到版本库,版本库会越来越凌乱。有时候知识想要临时存档,于是 暂存区 被设计出来,将工作区存档到暂存区时,不会产生新的历史版本,而是用新版本覆盖旧版本。

image-20250423164032544

总令我联想到计算机程序的运行结构:CPU 寄存器(执行)、内存(缓存)、硬盘(存档)。

详情可阅读 Git 官网的书籍。

四、Git 的精华

  • 分支管理

Git 的分支让你“像保存文件一样保存想法”,快速尝试、独立开发、轻松协作,是现代开发不可或缺的能力。

  • 良好的生态

Git 提供丰富的命令和钩子系统,并被 GitHub、GitLab、Gitea 等平台扩展出 CI/CD、代码审查等现代软件开发核心功能。