在虫虫管理的一个2000人QQ群中很多人也时常问这个问题,总之Git和SVN是两个完全不同思维方式的版本管理,理解Git要完全抛弃SVN的思维和操作,如果还想以老的方式思维来用Git话,虫虫不建议他来用Git。
Git相比叫传统的基于文件SVN优势明显,主要体现在天然分布式不怕丢失;不以文件为为基础,基于Git的数据库(commit哈希健值文件)的版本管理,分支、标签等操作飞速,而不是缓慢地文件和目录操作;Git下每个人都有一个独特的工作区和分支,不必实时和中心服务器同步就可以;带有社交性质的基于Fork——PR(MR)流程的,协作版本管理;最后就是基于gitlab running/github webhook的CI/CD开发一栈自动化流水线或者DevOPS。以上各个点都是Git的巨大独特的优势,下面虫虫给大家一一论述下。
天然分布式版本库存储
和SVN中心集中式文件管理的仓储管理不同,Git从设计到诞生就以融入了分布式基因。虽然Git也有服务器端的Github、Gitlab、Gogs等多种服务器端,但是Git所有操作都可以无服务器存在,你可以只在本地都能完成所有git操作,可以在目录之间实现clone、push和pull等需要服务器端的操作。设置权限和通讯方法后,Git客户端直接也完全可以实现这些操作。所以我们说Git是天然分布式,无需中心服务器 介入。Git服务器的引入一个好处就是把一些操作(比如添加证书,建立账号、仓库元信息)和通讯传输方法(http、ssh),及大量更多扩展功能在服务器端Web界面实现了,方便了用户的使用。
分布式的一个好处是代码变化push好的仓库数据,最少保留两份:本地一份和服务器一份,不怕丢。
Git是数据库,不是目录文件
Git中仓库信息都是以hash健值方式保存文件相当于一个数据库,当用户子工作区做了add操作后,此后变化信息就成了Git对象数据库了(blob、commit、three对象)。通过git命令(git clone checkout rest)可以实现把git数据库(commit历史库和暂存区),变化成用户实际接触到文件和目录的工作区。
这是Git,独特之处和优势之处,也是很多初学者迷惑指出,尤其拿之前使用SVN的人无法理解的。Git的四个区(工作区、暂存区、本地仓库区和远程仓库区),五个状态转化流程如下:
知道了这些Git就很多问题就都很好理解了。比如分支,比如标签tag,比如Head这些都是对特定commit的指针,所以对拉分支,分支间转化都很容易,不过把指针(分支,Head)指向某个commit,然后利用该commit ID再生成工作区而已,看上去就和在不同分支的文件目录下切换,而且非常迅速,因为Git的是按照差异对比来生成差异的目录和文件的。
Git的社交性和协作(Fork——PR/MR)
Git能够有现在这么流行,当然还是归根于其社交协作性质。基于Fork和PR/MR的协作流程鼓励了任何人都可以参与到项目中来而无需做其他特殊操作,无需特殊权限设置和申请。通过Fork操作把任何仓库都变成自己Owner的仓库,然后想怎么改就怎么改,想怎么操作就怎么操作,完全有自己做主。改完了可以通过PR(github:Pull Request)MR(Gitlab Merge Request)在提交给远仓库,该过程可以自动做对比,原项目管理者可以review变化,如果没问题就可以Merge 合并到仓库,完成一个完美的协作闭环操作。
由于这种社交性质的协作流,使得git广泛地流行起来,也带动了相关网站Github和Gitlab也流行起来。Githhub号称”全球最大的同性别交友平台“(码农大多数是单身男)就是这么来的。
基于Git的CI/CD和DevOps
这是也git才特有的功能,借助于Gitlab runner和webhook实现代码发布后,自动编译、自动测试、自动安扫、自动发布的一栈式自动化流程,大大释放开发过程繁杂的人力投入和流程,实现敏捷开发,快速迭代。这是目前的软件开发的大势和未来发展的方向。特别是云和容器的技术的发展和不对实践完善,这种一栈式解决方案越来越成熟,实现的功能越来越多,也被越来越多的企业开发团队所采纳。
而且这一切实现在git来说就是一个yml配置而已,push后,后面一切都自动化完成,并反馈信息。很神奇很憧憬把。那就关注虫虫,来跟虫虫来学git和 DevOps。