Version Control
什么是VC:即版本控.
包含: 集中式和分布式;
1.常见的集中式:CVS(最早、开源、免费),SVN(开源、免费,目前用的最多),VSS(集成在Visual studio中)…
工作流程:
我们比较熟悉的SVN是集中式的版本控制系统,回想一下在使用svn时,每次干活之前,需要 先从中央服务器(服务端)取出最新的版本,然后开始工作,干完活了,工作完后推送给中央服务器。此时的中央服务器就好比是一个图书馆,如果你要修改一本书,需要先从图书馆借出来,然后回到自己家修改,改完之后,需要在送回到图书馆。
分布简图:
特点:
有一个单一的集中管理的服务器,保存所有文件的修订版本,所有代码库。
对网络的依赖性强,必须联网才能工作,上传速度受网络状况、带宽影响。
客户端记录文件内容的具体差异,每次记录有哪些文件做了更新,以及更新了哪些行的什么内容。
缺点:
中央服务器的单点故障。 如果中央服务器发生宕机,所有客户端将无法提交更新、还原、对比等,也就无法协同工作。如果磁盘发生故障,信息尚无备份,还会有数据丢失的风险。
2.常见的分布式版本控制:git(免费、开源)、 Mercurial(轻量级) 、Monotone(免费)
工作流程:分布式版本控制系统是没有“中央服务器”,每个人的电脑上都是一个完整的版本库,工作的时候,不再需要联网。开始工作前,在客户端克隆出完整的代码仓库,然后就可以在家、在公交车等等随心所欲地修改代码并提交了,提交到本地电脑,等到有网的时候就可以一次性地将本地仓库推送到远端仓库(临时中心服务器)中,这样一来,每个人都可以独立进行改动资料,并且所有的改动都是在完整资料信息的环境下进行的。
分布简图:
特点:
本地客户机进行操作,离线工作,快速。
安全性高,每个人电脑里都有完整的版本库,一个人的电脑换了复制其他人的一份就可以了。
原子性提交,提交不会被打断(git)。
工作模式非常灵活(传统的集中式工作流 + 特殊工作流 + 特殊工作流和集中式工作流的组合)。
缺点: 缺少权限管理、命令复杂混乱
VC的作用:
最基本最重要的原因当然是版本回复reversion。
随着开发,代码不断地在演化。如果你在写代码的时候发现一秒钟前错误的删除了一行代码,你会很快的用ctrl+z来撤销修改,从而回复你错删的代码。但是如果你经过一个小时的努力,改了很多的代码文件,你发现这个修改是不可行的,需要倒退回去,你改怎么办?有人有比较好的习惯,当认为目前有里程碑意义的时候就把代码全备份,如果后面发现想倒退回来的时候就删除修改后的,重新启用之前备份的。这样可以解决一些问题,但是这是手工的,很麻烦。只要是麻烦的事情都会容易让你懒于去做。如果有可以工具,让你很方便的退回到以前的某个时候的代码状态,是不是很好?这就是版本控制系统要解决的问题。
还有一个重要的原因就是变更跟踪。如果你手工备份,是不是也得写一个readme文件,说明为什么要修改。如果是多人协同开发,你还想知道是谁修改的。如果有一个工具可以帮你自动维护这些信息,让你很容易达到目的,何乐而不为呢?
另外一个重要的原因就是bug跟踪。如果你在一个稳定的版本上做了修改,发布以后发现有bug了。你首先想到的肯定是你修改导致的,如果你能快速的找到你的修改点,是不是很容易定位错误。还有另一种情况,在发现bug的时候你的代码又前进了很多,你要想重现bug是不是要利用之前的哪一个版本来测试?
综合这些问题,我们需要一个版本控制系统来:
1. 维护代码的演化历史
2. 记录历史变化的原因和说明
3. 如果是多人开发,就会发生多人修改同一个文件的可能,还得保证彼此不会覆盖他人的代码,甚至能智能地合同。
常用的VC:
就分布式版本控制系统 - Git 而言.
1. repository
因为没有一个集中式的repository,那么每一个人都有自己的一个repository。
2. branch
和一般的分支没有什么区别,每个分支都是一个开发演化路径,也就是由一系列的commit构成的。每个commit都对应这个项目的一个snapshot。可以通过“git branch”来查看当前的分支。
3. head
既然分支是由一系列的commit构成的,那么最近的一个commit对应的那个snapshot就是这个分支的head。
4. master
master就是主干分支。
5. clone
既然每个人都有一个,当你想在一个已有的repository上继续工作的话,你就可以clone一个。刚刚clone的repository就源repository的master的head。
6. remote-tracking branches
虽然clone的时候只是copy了master的head,但是也有对源repository上其他的分支的track。那就是remote-tracking branches。你可以通过“git branch -r”来查看。