SCM,软件配置管理:追踪和控制软件的变化,包括版本控制和软件配置项
软件配置项(SCI):软件中发生变化的基本单元(例如文件)
版本控制(VCS)
术语:
术语 | 含义 |
仓库(Repository) | 本地或远程的配置管理数据库(CMDB) |
工作拷贝(Working copy) | 在开发者本地机器上的一份项目拷贝 |
文件(File) | 一个独立的配置项 |
版本(Version/Revision) | 在某个特定时间点的所有文件的共同状态 |
变化(Change/Diff) | 即code churn,两个版本之间的差异 |
Head | 程序员正在其上工作的版本 |
版本控制分类
本地版本控制系统
仓库存储与开发着本地机器,无法共享和协作
集中式版本控制系统
仓库存储与独立的服务器,支持多开发者之间的协作
分布式版本控制系统
仓库存储与独立的服务器+每个开发者的本地机器
既然说到版本控制系统,我们就不得不谈谈Git,Git是一个分布式版本控制系统,一个Git仓库分为三个部分:
- .git目录:本地的CMDB
- 工作目录:本地文件系统
- 暂存区:.git母驴中的一个文件,隔离工作目录和Git仓库
文件状态也分为三种
文件状态 | 意义 |
已修改 | 工作目录中的该文件和Git仓库中的有差异,但尚未保存到暂存区 |
已暂存 | 工作目录中的该文件和Git仓库中的有差异,且已经保存到暂存区 |
已提交 | 工作目录中的该文件和Git仓库中的相同 |
Object Graph对象图是一个有向无环图,描述了版本之间的演化关系。一条边A->B表示在版本B的基础上做出变化,形成了版本A。
- 一般情况:每个Commit指向一个父亲
- 分支:多个commit指向一个父亲
- 合并:一个commit指向两个父亲
- 一个“分支“只是指向commit的别名
- HEAD指向当前工作的commit
一个commit存储一个树形节点。tree中包含了数个blob;每个blob是一个压缩了的仓库文件,不保存文件名信息。对于每个文件的每个版本(或是不同文件名但内容相同的文件),Git只会存储一个blob,而允许多个Commit tree指向一个blob。
一个commit中与之前相比未发生变化的文件,无需重复存储。文件未发生变化,则后续多个版始终指向一个blob;文件发生变化了,存储两份不同的blob,两个版本指向不同的blob
传统VCS和Git相比
传统VCS:存储版本之间变化的代码行
Git:存储发生变化的文件,不变化的文件不重复存储