版本控制软件是任何一个协作开发项目所需要使用的一个很重要的基础工具,尤其是软件开发项目,不管是个人开发或是团队协作开发,都可以通过版本控制软件获得巨大的好处。
版本控制软件的定义
使用科学的软件管办理方法,控制软件开发与维护过程中的每一个细节,按照过程功能形成不同的版本,必须具备软件备份、注释,任一版本的回溯和版本间差异化比较的功能。
常用版本控制软件的分类
分布式的核心设计是同步,而不是主从。
集中式版本软件控制
它的典型代表是 SVN 软件,在团队协作开发的过程中,所有开发者通过网络连接到中央版本库,取出任一版本到计算机本地进行开发维护,任务完成后把本地代码文件上传到中央版本库。
但是客户端代码的更新与提交等操作必须在与服务器连接的基础上,也就是要联网,客户端的版本并不是中央版本库的完整拷贝,在没有联网的情况下,客户端无法查看到中央版本库的所有历史提交信息,也无法进行任务的提交与更新。
当服务器磁盘故障,将导致版本库数据全部丢失,而开发者本地机器存放的只是某个版本的代码。
集中式版本控制系统更适用于项目管理,按照目录存放文件。项目管理各个环节的文件,按照目录存放在服务器中,便于项目管理者随时查看。SVN 软件会在每个目录下都产生 .svn 目录。
分布式版本控制软件
它的典型代表是 Git 软件,Git 将中央版本克隆到本地后,开发者无论是复制、更新、还是查询,只需要和本地文件打交道,无需连接网络到远程服务器,任务完成后版本可以本地离线提交,等网络便利时再推送到中央版本库。
Git 对于每个工程只会产生一个 .git 目录,这个工程所有的版本控制信息都在这个目录里,它拥有中央版本库上所有的东西,例如标签、分支、版本信息等。
Git 实现机制
Git 在实现机制上,由三个关键点:
- 版本库的本地化
- 文件的快照保存
- 基于内容的寻址空间
版本库的本地化
Git 将中央版本库克隆到本地后,大部分操作只需要跟本地文件打交道,无需网络连接到远程中央版本库。在没有网络的情况下可以实现新版本的提交,等待网络便利后,联网推送到中央版本库即可。
本地版本库拥有中央版本库中所有的东西,所有版本信息位于 .git 目录中,我们可以查看分支、版本回溯、提交记录查询等操作。
文件的快照保存
【如何检测文件变化?】
Git 使用字节级别的比较来检测文件的变化。具体来说,Git 在存储文件快照时,会计算文件的SHA-1哈希值。当文件发生更改时,Git会重新计算文件的SHA-1哈希值,并比较新旧哈希值是否相同。
【如何存储变化后的文件?】
- 在工作目录中修改文件;
- 暂存文件,将文件的快照放入暂存区域;
- 提交更新,找到暂存区域的文件,将快照永久性存储到Git仓库目录。
Git保存每个文件的每个版本的完整内容。当你执行 git add 命令时,Git 会为文件生成一个快照。这个快照会记录当前文件的内容和元数据,例如文件的权限和时间戳等。然后,这个快照会被存储在 Git 对象库中,并被赋予一个唯一的哈希值。
基于内容的寻址空间
Git 是一套内容寻址(content-addressable)文件系统,Git 采用 HashTable 的方式进行查找,通过简单的存储键值对(key value pair) 的方式来实现内容寻址,而 key 就是文件(头+内容)的哈希值,value 就是经过压缩后的文件内容。
如下公式所示:
Key = sha1(file_header + file_content)
Value = zlib(file_content)
Git 的工作流程
在 Git 中,工作目录(working directory)是用户进行修改的地方,而暂存区是一个用于存储即将提交的更改的地方。
在 Git 中,文件在本地有三个阶段:没有被 track(跟踪)的,放在暂存中的,提交的。当一个文件没有使用 git add 时,它就是 untrack 的,当使用git add之后,文件被 track 且被放入暂存。在每次提交之后,Git 会保存整个文件的快照。
- git clone,将整个远程仓库克隆到本地,包括被克隆仓库的版本信息;
- git fetch,克隆远程库的一个分支;
- git pull,是 git fetch 和 git merge 两个步骤的简写,取回远程仓库的最新内容并合并到本地。
- git add,文件修改后,track 文件,并将文件快照放入暂存区;
- git commit,将暂存区的文件快照迁入当前分支的版本库中,commit-id 作为该版本快照文件索引。
Git 软件下的软件开发质量管理方法
Git 缺点
- 对创建仓库、分支等操作没有管理权限分级
- 无法保护中央代码岔仓库不被污染
- 并行开发的代码提交会出现冲突
软件研发管理模式
为了弥补 Git 软件的不足,以及更好的服务软件开发的整个生命周期,很多平台都推出了自己的代码仓库管理系统,如 github、gitlab、gitee等。它们集合了源代码托管、流水线等功能,使得整个项目的管理更高效。