什么是“版本控制”?我为什么要关心它呢? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。在 GIT CODE 中,我们对保存着软件源代码的文件作版本控制,但实际上,你可以对任何类型的文件进行版本控制。
我想看一看 Git 诞生的故事
引用如下:
git 从开始到诞生,Torvalds 这位天才只用了 10 天的时间。
极具前瞻性的三个诉求
在确定开发 git 前,Torvalds 对市面上多个版本管理方案进行过评估,但现有的方案都不令人满意,最终决定开发自己的版本管理系统。
Torvalds 认为,健壮的版本管理系统应当有以下三个特性:
可靠性(reliable)
数据的存入取出必须是安全的、一致的。所有行为都要校验,仓库任何部分不允许篡改。在今天看来,这并不是什么高明之举,但在当时,绝大多数的 SCM 都做不到这一点。那时候,人们依赖保护中央服务器来保证数据不被篡改,而不是依靠版本管理自身的设计来保证。
Torvalds 认为,应当通过算法来保证,仓库任何一个字节被篡改,都能够被发现。
高效(high-performance)
这是 git 极具优势的特性。Torvalds 认为,版本管理的所有操作都必须在毫秒级内完成:这是对 svn 最大的批评。查日志、拉分支、合并、提交这些高频率操作,必须能够在本地能够完成,而不是等待服务器响应。这一特性直接决定了 git 能够被广泛传播。
作为对比,svn 每一步操作都在等待数据包成为了人们口中的诟病。
分布式(distributed)
以往人们在备份资料上花了很大精力:传统的中央服务器,资料受损是灾难性事故。现在,所有人电脑中的 git 仓库都是一致的,每个人的仓库都是完整的副本。完整的副本意味着可以在本地做所有事;允许相互同步促使它被设计成为自带数据校验。
最终,Torvalds 围绕着这三个诉求,用 10 天的时间创造出 git。
事实证明,这些想法是极具前瞻性的。git 在解决原有诉求的前提下,还解决了长久以来的一些痛点。
刺破痛点
从工程的角度看,许多 SCM 方案都有各自的杀手锏,例如 BitKeeper 在超大型项目的优越性能,以及 SVN 精准的权限控制。但在实际生产方面,则有所欠缺。
代码政治
大多数 SCM 都存在权限争议问题,特别是在超大型项目上。开发者最常见的发问是,你凭啥不给我权限?在有些企业,代码管理被沦为政治工具,权限则被视为权利的象征。分布式的 git 则不存在此问题,如果你拥有该仓库,你就拥有了所有的权限。
提交粒度
如果「提交代码」容易对他人造成影响,那么就没人愿意频繁提交。在开发阶段,由于代码始终无法完美(例如,包含测试代码、代风格错误、还有待改动),以至于总是无法提交代码(强行提交将造成他人无法运行)。导致的结果是,大量改动堆积,最后一次性提交。这样的后果是,单个 commit 提交粒度极大,还会导致合并、code review、乃至回滚的困难。而 git 的 commit 操作不需要推送到远程,因此随意提交也不会不影响他人。
创建新分支
在许多 SCM,创建新分支是「重量级操作」,并且所有人可见。在许多项目看来,创建新分支是重大行为。因为创建新分支影响重大,因此开发人员不会随意创建新分支。这直接导致了同一个分支上需要承载大量的业务。而由于 git 的操作是本地化的,你可以随意创建分支(毫秒级操作)并行多个子迭代,迭代完毕且合并分支后,再删除分支标签。最后推送到远程服务器,他人并不知晓你创建过什么分支。
开源,共筑,影响力
革新总是艰难的。当 Linux 开发团队决定使用 git 作为版本管理的时候,社区反对声音并不小,理由是 git 太难用了。实际上,确实是这样的,Torvalds 也承认了这点。
技术服众还不够。Torvalds 的领导力是惊人的,他发动社区力量让大家投入到 git 的开发当中。随着开发的深入,git 命令变得更简单,更易用。另一方面,开源有助于集思广益,并且避免腐败。
后来的事,大家都知道了。git 逐渐被大众接受,为 git 提供托管服务的 github 于 2008 年 2 月上线,从此 git 点亮万家灯火。
Git由Linus开发,是由C语言实现的分布式版本控制系统。
集中式VS分布式
集中式:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
集中式的缺点:必须联网才能工作,在网速限制的地方效率低。
分布式:分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库。这样,工作的时候,就不需要联网了。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
分布式的优点:和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
此外,分布式版本控制系统中通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已
很多人都知道,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了。
总的来说是linux作者给自己写的一个源代码管理器,后来开源了。
https://blog.csdn.net/weixin_43117449/article/details/84573917