linux-git-01 git基础学习
概念引入
在一个游戏公司里面有若干个部门,游戏中增加了一个新英雄,正常的开发流程是:
当前版本1.0的游戏–>设计人物模型–>设计技能模型–>代码开发–>测试–>运维部署–>版本升级为2.0
但是,不用部门开发效率不同,例如游戏人物模型设计好了但是技能模型没写完,二技能三技能都有了但是大招还没设计好,这时后面的所有部门就需要等待,等技能模型全部设计完成之后才能发布到第二版开发环境,测试时发现bug,等的时间就浪费了。
于是这里就有了持续集成:
不同部门开发出某一技能或某一皮肤模型就提交到第一版集成环境测试,看看会不会出错,不用等到第二版再测试;代码开发好之后,交付测试人员,持续交付;测试人员测试好之后给部署人员,持续部署。
这样做的好处就是,例如开发出一个二技能,就先测试这个二技能,在测试部门测试这个二技能的同时,技能设计部门还可以继续设计三技能,这样测试部门无需等到设计部门把新英雄的所有技能都设计出来就可以开始测试,所以称之为持续交付测试。同样的道理,测试人员测试某一技能没有问题的话,先把这个技能给运维部门先部署好,不用等到所有的技能都测好才进行部署,这样运维部门也能同时运作起来而不是傻傻地等。
总之,一个串行的开发流程,变成了半串行半并行的开发流程。无论从时间还是效率上来看,都是持续交付的模式更优。那么,如何做到高效的版本管理呢?答案呼之欲出:git
概念解析
GIT (分布式版本控制系统)
Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 是用于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什么样的服务端,使用http协议或者git协议等不太一样。并且在push和pull的时候和服务器端还是有交互的。),使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。
gitHub
gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub。
gitHub于2008年4月10日正式上线,除了git代码仓库托管及基本的 Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前,其注册用户已经超过350万,托管版本数量也是非常之多,其中不乏知名开源项目 Ruby on Rails、jQuery、python 等。
GitHub可以托管各种git库,并提供一个web界面,但它与外国的SourceForge、Google Code或中国的coding的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单:首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pull request”机制向项目负责人申请代码合并。已经有人将GitHub称为代码玩家的MySpace。
GitLab
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务,安装方法可以参考GitLab在GitHub上的Wiki页面。
举例分析
例如,我在github上放了一个公开项目abc,初始版本是abc1.0,那么其他所有人都可以看到我的这个abc项目,并且可以对它进行下载或者克隆等。现在有甲乙丙丁四个人,甲看到我的项目还不错,但是有些地方需要修改完善一下,于是他下载了一份abc1.0到他们自己的电脑上对之进行修改。甲修改了abc1.0里面一张叫做a.jpg的图片,然后提交给我,请求采用他修改后的项目,我看到甲的确把a.jpg修改得更漂亮了,那么我就采用了甲修改后的项目,并将版本更新为abc2.0。
过了几天,乙和丙下载了我的项目abc2.0, 乙修改了abc2.0里面的b.jpg和c.jpg,丙修改了abc2.0里面的c.jpg和d.jpg,然后,两人都请求我采用他修改后的项目。这样一来,乙丙二人的修改之间就产生了冲突,这就是两个不同的项目分支。这时候我就需要做分支合并了,我会对两人的项目进行对比,发现二人之间冲突的是图片c.jpg,那么我会选择其中一个人修改后的c.jpg到新版项目里。另外,乙改好的b.jpg和丙改好的d.jpg也会被加到新版项目里。最终,分支合并完成,项目升级到了abc3.0。
后来又过了几天,丁下载了abc3.0,觉得其实可以省略所有图片,于是删除了a.jpg、b.jpg、c.jpg、d.jpg,然后请求我采用他修改后的项目。我觉得他的想法不错,就采用了其项目,于是就有了abc4.0。
这样的话,如果公司要赶项目,可以在最基础的1.0版本的项目上,多人同时开发,每做出一步改动就可以先同步到仓库中,不断地分之与合并,可以高效快速地吸取所有人的优秀改动到项目中。即使后面发现有些改动并不合适,也可以进行版本回滚,相当于对于每一次改动都做了备份,不会出现辛辛苦苦几十年,一夜回到解放前的尴尬状况。