问题
在项目编写中,每个开发人员都需要去开发,维护代码。
初代,使用一个共享文件夹,出现的问题:
- 文件锁,张三在修改a.txt,李四也在修改a.txt
- 追溯,谁修改了什么,学习,借鉴,检查
- 备份,上线项目,A完成了新的功能,需要发布。B维护了代码,但是未完成。
解决问题
经过发展,出现了版本管理系统
完成功能,初版为A,张三修改后,版本为B,李四修改,版本为C
-
版本的提交,提交时生成版本号。
-
版本的管理,回退到某个版本号,查看某个版本号修改的内容。
-
文件冲突合并。
版本控制系统
分为两大类:集中式和分布式
集中式的版本控制系统:SVN,CVS
分布式的版本控制系统:Git,BitKeeper,Mercurial(python实现),GNU Bazaar(python实现)
集中式的版本控制系统
说明:
常用SVN。SVN的服务器是自己搭建的,需要通过在同一局域网下进行使用。
想法:
版本库是集中存放在中央服务器
的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
使用:
小公司,SVN服务器就在局域网内,SVN的确可以在断网(不断局域网)情况下工作。
中大型公司,SVN服务器一般是独立出来的,不在局域网内的,你完成计划的工作内容,需要提交做成一个版本,但是由于版本库是在中央服务器,于是你要等网络联通之后,才可以提交
举例:
-
服务器没了,那你丢掉了所有历史信息,因为你的本地只有当前版本以及部分历史信息。
-
svn像银行,完整账本只有银行有,作为终端节点可以向银行查询账本,但如果某一天银行没了,整个完整账本就没了
断网的情况下,SVN不工作,既不能提交也不能回滚。
缺点:
- 断网情况下,SVN不工作,既不能提交也不能回滚,无法对版本进行管理。
- 网速慢的话,可能提交一个10M的文件就需要5分钟
分布式的版本控制系统
说明:
常用Git。GitHub是Git的仓库,通过HTTPS、SSH、GitHub CLI这三种方法进行提交等操作。
想法:
分布式版本控制系统根本没有中央服务器
,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。 既然是多人协作,我们肯定是需要指定一个人的电脑作为总仓库,所以人从他的电脑上提交更新,拉取别人的提交,这样才能保证他的仓库保留了所有人的改动。 这个人其实就充当了集中式中的服务器仓库的角色。
举例:
-
GitHub服务器没了,你不会丢掉任何git历史信息,因为你的本地有完整的版本库信息。你可以把本地的git库重新上传到另外的git服务商。
-
比特币的区块链设计就类似git,人手一份全账本,只是用p2p全网同步,而git通常搞个中心化服务来同步