README
Git 是目前世界上最先进的分布式版本控制系统(没有之一)。
Git 是用 C 语言开发的。
CVS 及 SVN 都是集中式的版本控制系统,而 Git 是分布式版本控制系统。
为什么使用版本控制?
在开发过程中,大部分情况下是团队开发,即使是个人开发,我们也想对整个项目进行代码管理与备份等等。最原始的版本控制方法是:每次备份一份代码,标记版本号,压缩,存储到计算机硬盘。显然,这不是一个合理的解决办法,随着版本的增多,硬盘空间会越来越小,而且,这不利于我们查看不同版本间的差异、版本的回退,以及多人协同开发。
在团队开发过程中,对代码进行合并管理的时候,总需要一些工具可以自动合并,版本控制系统应运而生。运用版本控制系统,我们可以对代码进行版本管理,可以随时查看之前版本的内容,随时回溯到之前版本中。团队合作的时候也可以自动合并代码,而不需要用一个共享文件,或者是进行定期的备份。
CVS 是最早的开源而且免费的集中式版本控制系统,直到现在还有不少人在用。由于 CVS 自身设计的问题,会造成提交文件不完整,版本库莫名其妙损坏的情况。同样是开源而且免费的 SVN 修正了 CVS 的一些稳定性问题,是目前用得最多的集中式版本库控制系统。
Git诞生
很多人都知道,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 可以向 BitMover 公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:
Linus 花了两周时间自己用 C 写了一个分布式版本控制系统,这就是 Git!一个月之内,Linux 系统的源码已经由 Git 管理了!牛是怎么定义的呢?大家可以体会一下。
Git 迅速成为最流行的分布式版本控制系统,尤其是 2008年,GitHub 网站上线了,它为开源项目免费提供 Git 存储,无数开源项目开始迁移至 GitHub,包括 jQuery,PHP,Ruby 等等。
历史就是这么偶然,如果不是当年 BitMover 公司威胁 Linux 社区,可能现在我们就没有免费而超级好用的 Git 了。
集中式vs分布式
集中式版本控制系统,版本库是集中存放在中央服务器的。
每个开发者都在他自己的计算机上又一个包含所有项目文件的工作目录(工作区),当该开发者在本地做了更改之后,他就会定期把修改提交给中央服务器。然后,开发者在执行更新操作的同时也会从该服务器上拾取出其他开发者所做的修改,中央服务器上存储着这些文件的当前版本和历史版本。
而分布式版本控制系统根本没有 “中央服务器”。
每一个开发者都同时拥有一个用于当前文件操作的工作区与一个用于存储该项目所有版本、分支以及标签的本地版本库。每个开发者的修改都会被载入成一次次的新版本提交,首先提交到本地版本库中。然后,其他开发者就会立即看到新的版本。通过 pull 和 push 命令,我们可以将这些修改从一个版本库传送到另一个版本库中。
多人协作中,我们可以指定一个人的电脑作为总仓库,所有人从他的电脑上提交更新,拉取别人的提交。这个人其实就充当了集中式中的中央服务器的角色。这样做是为了避免你的提交需要推到多个人的电脑,避免你需要从多个人电脑抓取新提交。
集中式版本控制系统人最大缺点:联网才能使用,上传速度慢。工作前要先从中央服务器获取最终新版本,工作完成后,要将文件传到中央服务器。如果提交一个大的文件,上传速度会很慢。
分布式版本的特点:可有可无的中央服务器。虽然在分布式版本控制中也有中央服务器的概念,但它只是为了利于交换版本,在开发中不是必要的。它的优点体现在:一、不需要联网也能工作 — 版本管理不依赖于中央服务器,可以在本地版本库进行开发工作;二、安全性高 — 即使不小心把中央服务器的版本库删了,也可以从任意一个开发者电脑中复制一份回去,两者的版本库是一样的。
Git与SVN区别
- Git 是分布式版本控制系统,SVN是集中式版本控制系统。
- Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
- 分支不同:SVN 中的分支是版本库中的另外一个目录;
- 全局的版本号: Git 没有全局版本号,而 SVN 有。目前为止,这是跟 SVN 相比,Git 缺少的最大的一个特征。
- Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。