# 为什么代码需要版本控制:从手工备份到分布式 Git
代码只要持续修改,就会产生“现在是什么样、以前是什么样、为什么变成这样”的问题。手工复制目录只能留下若干副本,版本控制记录的则是项目变化的过程。
Git 采用分布式版本控制:每个完整克隆的本地仓库都能独立记录和查询历史,联网主要用于与其他仓库交换变化。这正是 Git 能同时支持个人版本管理和团队协作的基础。
## 多保存几个副本为什么不够
没有版本控制工具时,我们很容易得到这样的目录:
```text
project
project-修改版
project-最终版
project-最终版2
```
复制文件确实留下了旧内容,却很难继续回答:
- 两个版本具体差在哪里?
- 这次修改是谁完成的,为什么修改?
- 多个人同时改动时,怎样合并各自的成果?
- 问题是什么时候出现的?
- 怎样回到一个确定可靠的状态?
版本控制系统记录的不只是文件副本,还包括项目随时间变化的过程。它让我们能够比较版本、追踪修改、恢复内容,并组织多人协作。
## 集中式版本控制
集中式版本控制系统通常由一台中央服务器保存主要版本历史,成员从服务器取得文件,再把修改提交回服务器。
它的优点是管理方式直观,权限和历史集中在一个位置。但中央服务器也是协作中的关键节点:服务器无法访问时,很多依赖服务器的操作会受到影响;如果中央数据没有可靠备份,故障影响也会更集中。
可以把它想成公司统一管理的档案室。所有人都围绕同一个档案室借阅和归还资料。
## 分布式版本控制
分布式版本控制系统不只把当前文件交给开发者,本地仓库通常还拥有完整的项目历史。浅克隆、部分克隆等特殊方式可能只取得部分数据,但不影响这里建立的基本认识。
因此,即使暂时没有网络,开发者仍然可以在本地记录版本和查看历史。需要协作时,再与其他仓库交换变化。
这相当于每位成员都有一套可以独立工作的档案副本,之后再与其他档案库同步变化。
## Git 和 GitHub 分别是什么
Git 是分布式版本控制工具。GitHub、GitLab 等平台可以托管 Git 仓库,并提供评审、权限和团队协作能力,但它们不是 Git 本身。
没有代码托管平台,Git 仍然能够在本地管理项目历史;接入托管平台以后,团队才更方便地共享这些历史。
## 分布式仓库保存的不只是当前文件
分布式版本控制并不是让每位开发者多保存一份当前项目目录,而是让本地仓库也具备记录和查询版本历史的能力。
为了做到这一点,Git 需要区分三类内容:
- 当前正在编辑、还可能继续变化的内容;
- 已经选择好、准备记录为下一个版本的内容;
- 已经形成提交、可以追溯和比较的历史。
Git 通过工作区、暂存区和版本库区分这三类内容,它们共同构成记录一次修改时最重要的心智模型。
## 总结
版本控制真正管理的是项目变化的过程。集中式系统围绕中央历史协作,分布式系统让本地也拥有历史和独立工作能力。Git 采用分布式设计,所以查看历史和记录版本都可以先在本地完成。
## 参考资料
- [Git 官方资料:About Version Control](https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control)
- [Git 官方资料:What is Git?](https://git-scm.com/book/en/v2/Getting-Started-What-is-Git)