Day05_01_Git教程之版本控制简介
版本控制简介
一.为什么需要版本控制
1. 概述
在软件开发过程,每天都会产生新的代码,代码合并的过程中可能会出现如下问题:
- 代码被覆盖或丢失;
- 代码写的不理想希望还原之前的版本;
- 希望知道与之前版本的差别;
- 是谁修改了代码以及为什么修改;
- 发版时希望分成不同的版本(测试版、发行版等)
因此,我们希望有一种机制,能够帮助我们:
- 可以随时回滚到之前的版本;
- 协同开发时不会覆盖别人的代码;
- 留下修改记录,以便随时查看;
- 发版时可以方便的管理不同的版本.
2. 什么是版本控制系统
一个标准的版本控制系统 Version Control System (VCS),通常需要有以下功能:
- 能够创建 Repository (仓库),用来保存代码;
- 协同开发时方便将代码分发给团队成员;
- 记录每次修改代码的内容、时间、原因等信息;
- 能够创建 Branch (分支),可以根据不同的场景进行开发;
- 能够创建 Tag (标签),建立项目里程碑.
3. 版本控制系统的发展史
版本控制系统发展至今有几种不同的模式:
3.1 Local VCS
本地使用 复制/粘贴
的方式进行管理,缺点是无法协同开发
3.2 Centralized VCS (Lock,悲观锁)
中央集中式版本控制系统团队共用仓库,当某人需要编辑文件时,进行锁定,以免其他人同时编辑时造成冲突。缺点是虽然避免了冲突,但不是很方便。其他人需要排队才能编辑文件,如果有人编辑了很久或是忘记解锁就会造成其他人长时间等待的情况。
3.3 Centralized VCS (Merge,乐观锁)
中央集中式版本控制系统团队共用仓库,不采用悲观锁方式来避免冲突,而是事后发现如果别人也修改相同文件(冲突),再进行手动修改解决。有很多 VCS 属于这种类型,如:CVS,Subversion,Perforce 等
中央集中式版本控制系统的共同问题是,做任何操作都需要和服务器同步,如果服务器宕机则会造成无法继续工作的窘迫。
3.4 Distributed VCS
分布式版本控制系统,本地也拥有完整的代码仓库,就不会出现上述集中式管理的问题,即使没有网络,依然可以 commit
和看 log
,也无需担心服务器同步问题。如:Git,Mercurial,Bazaar 等就属于分布式版本控制系统。缺点是功能比较复杂,上手需要一定的学习时间。
二. Git简介
1. Git与Linux的关系
Linus在1991年创建了开源的Linux,从此Linux系统不断发展,很快就成了最大的服务器系统软件了.Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,所以有很多人在世界各地为Linux编写代码,那么Linux的代码是如何管理的呢?
在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!!
你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用.有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符.
但是到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了.社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统.
在2005年的时候,Linux社区里的一个牛人,开发Samba的Andrew试图**BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了,于是BitMover公司怒了,要收回Linux社区的免费使用权.
于是Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!
Git很快就成为了最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等.
历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了.
2. 什么是Git
Git是目前世界上最先进的分布式版本控制系统(没有之一)!

- Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目;
- Git 是 Linus Torvalds 为了帮助管理Linux 内核开发而开发的一个开放源码的版本控制软件;
- Git 与常用的版本控制工具CVS,Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持.
三.Git 的一般工作流程
- 克隆 Git 资源作为工作目录;
- 在克隆的资源上添加或修改文件;
- 如果其他人修改了,你可以更新资源;
- 在提交前查看修改;
- 提交修改;
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交.

四.Git工作原理/流程图
概念解释:
- Workspace: 工作区;
- Index / Stage: 暂存区;
- Repository: 仓库区(或本地仓库);
- Remote: 远程仓库.
五.SVN与Git的最主要的区别?
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就郁闷了。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
Git的优势不单是不必联网这么简单,后面我们还会看到Git极其强大的分支管理功能,把SVN等远远抛在了后面。
CVS作为最早的开源而且免费的集中式版本控制系统,直到现在还有不少人在用。由于CVS自身设计的问题,会造成提交文件不完整,版本库莫名其妙损坏的情况。同样是开源而且免费的SVN修正了CVS的一些稳定性问题,SVN是目前用得最多的集中式版本库控制系统。