单人开发
代码提交步骤:
- 写代码;
- 使用cp命令进行对已写内容备份;
- vi创建log文件记录代码变更;
- 一个版本要发布时,使用tar命令将所有文件打包归档。
多人合作开发
代码提交步骤:
- 多个程序员开发一个项目,各自完成代码;
- 将改动的文件统一发送给负责人;
- 由负责人统一将代码进行合并。
举例:补丁文件
RCS
代码提交步骤:
- 检出文件(co);
- 对文件进行编写;
- commit文件(文件生成新的版本);
- 检入文件(ci)。
缺点:
互斥写入机制。一个程序员检出文件编写时,其他人不可以进行操作。
回退历史版本:
RCS给每个文件创建了一个追踪文档(后缀,v)来记录版本历史。
在最新文档内容的基础上,减去历史上发生的改变,就可以恢复到之前的历史版本。这样,RCS就实现了备份历史和记录改变的功能。
CVS
特点:
- 引进分支概念;
- 引进库概念,文件构成一个库。
- 采用“复制-修改-合并“模式。 使用,v文件记录改变。
代码提交步骤:
- 从主干创建分支,分支是主干文件在本地复制的副本;
- 在本地进行修改,在分支提交文件修改,文件生成不同的版本;
- 分支工作结束后,将分支合并到主干;
- 使用tag记录待发版文件集合,进行发版。 如:tag v1.0 (file1:r1.3) (file2:r1.1) (file3:r1.5)
回退到历史版本
r1.0 = r2.0 - change(rb1.0.2 - rb1.0.1) - change(rb1.0.1-r1.0)
SVN
特点:
- 合并是原子操作;
- 支持管理Binary和Unicode文件;
- 采用关系型数据库来存储改变集
- svn中的版本是针对整个文件系统的(包含多个文件以及文件组织方式),每次commit生成一个整个项目文件系统树的新版本。
- 不会从库下载整个主干到本地,而只是下载主干的最新版本。
代码提交步骤:
- 从分支/主干下载最新版本代码;
- 在本地进行修改; 将修改提交到本地分支;
- 分支合并到主线。
- 回退历史版本原理与CVS相同
GIT
特点:
- git会保存blob(文件), tree(文件夹), commit和tag四种对象
- commit对象包含:文件系统树的快照、修改人、修改时间、附加消息、指向它的父对象的指针。
- 一个tag对象包含有tag的名字,和指向一个commit对象的指针。
代码提交步骤:
- clone代码库到本地分支;
- 在本地进行修改,add命令将修改的内容添加到缓存,并每一个文件计算校验和(哈希码);
- commit命令将当前版本的文件快照保存到 Git 仓库中;
- 最终将校验和加入到暂存区域等待提交分支合并到主线。
回退到历史版本:
根据commit里的父级指针回退
参考文档:
https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%AE%80%E4%BB%8B
https://blog.csdn.net/blueblood7/article/details/41941281