一、git和svn的差异
1、GIT是分布式的,SVN不是,这 是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。
好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交;同时,GIT并 不是目前第一个或唯一的分布式版本控制系统。还有一些系统,例如Bitkeeper, Mercurial等,也是运行在分布式模式上的。
GIT跟SVN一样有自己的 集中式版本库或服务器。但,GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。可以这样说,如果你被困在一个不能连接网络的地方时,你仍然能够提交文件,查看历史版本记录,创建项 目分支等。
2、GIT把内容按元数据方式存储,而SVN是按文件:
所有的资源控 制系统都是把文件的元信息隐藏在一个类似.svn或者.cvs等的文件夹里。如果你把.git目录的体积大小跟.svn比较,你会发现它们差距很大。因 为.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。
3、GIT分支和SVN的分支不同:
分支在SVN中一点不特别,就是版本库中的另外的一个目录。如果你想知道是否合并了一个分支,你需要手工运行像这样的命令svn propget svn:mergeinfo,来确认代码是否被合并。
然而,处理GIT的分支却是相当的简单和有趣。你可以从同一个工作目录下快速的在几个分支间切换。你很容易发现未被合并的分支,你能简单而快捷的合并这些文件。
4、GIT没有一个全局的版本号,而SVN有。
5、GIT的内容完整性要优于SVN:
GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
6、Git下载下来后,在本地不必联网就可以看到所有的log,很方便学习,SVN却需要联网;
7、SVN在Commit前,我们都建议是先Update一下,跟本地的代码编译没问题,并确保开发的功能正常后再提交,这样其实挺麻烦的,有好几次同事没有先Updata,就Commit了,发生了一些错误,耽误了大家时间,Git可能这种情况会少些。
8、克隆速度不同:
克 隆一份全新的目录,以同样拥有五个(才五个)分支来说,SVN是同时复製5个版本的文件,也就是说重复五次同样的动作。而Git只是获取文件的每个版本的 元素,然后只载入主要的分支(master)。
9、版本库(repository):
据我所知,SVN只能有一个指定中央版本库。当这个中央版本库有问题时,所有工作成员都一起瘫痪直到版本库维修完毕或者新的版本库设立完成。
而 Git可以有无限个版本库。或者,更正确的说法,每一个Git都是一个版本库,区别是它们是否拥有活跃目录(Git Working Tree)。如果主要版本库(例如:置於GitHub的版本库)发生了什麼事,工作成员仍然可以在自己的本地版本库(local repository)提交,等待主要版本库恢复即可。工作成员也可以提交到其他的版本库!
10、提交(Commit):
在SVN,当你提交你的完成品时,它将直接记录到中央版本库。当你发现你的完成品存在严重问题时,你已经无法阻止事情的发生了。如果网路中断,你根本没办法提交!
而Git的提交完全属於本地版本库的活动。而你只需“推”(git push)到主要版本库即可。Git的“推”其实是在执行“同步”(Sync)。
二、如何规划版本号和分支
1、master :
主分支,即线上版本,每发布一次会产生版本号,版本格式如:V1.0.1.RC1。
2、develop:
开发分支,用新需求或新功能开发分支,可以理解为一个项目分支,从master开一个分支出来,以项目名称+版本号(projectName+”.1.1.x”)的形式命名,如planbook.1.1.x。对应主分支存在多个develop并行分支,开发完成后会合并test分支进行功能测试。
3、test:
测试分支,用于发布开发和测试环境,由于存在并行develop,所以该分支会合并多个develop代码,在合并时须格外仔细小心,尽量避免由于该分支问题而影响到整个开发测试环境,如出现问题,需进行版本回退。
4、release:
即UAT分支,该分支只和master分支打交道,当develop分支在test分支测试通过后,由develop分支合并到release分支,UAT和业务测试通过合再合master分支发布。如之前提到多项目并行的情况,在管理上我们要控制每次合到release分支的所有代码在一个master版本上发布,尽量避免多个develop分支合到release上时却发其中部分到master上。
5、hotfix:
线上bug修复分支,属于临时分支,用于线上问题紧急修复,测试通过合并到master分支,及所有进行中的develop分支,然后该分支结束。
三、jenkins和git的关系
1、GIT是一个开源的分布式管理控制系统,可以敏捷高效的处理任何项目。
GIT工作流程图
Workspace:工作区
Index/Stage:暂存区
Repository:仓库区(本地仓库)
Remote:远程仓库
远程仓库包括Github、Gitee、GitLab等。在你编译器上的代码叫工作区,你需要将代码先commit(提交)到本地,然后去push到你的远程仓库。
每个分支就是你的子版本,每个程序中有一个master分支是主分支。你可以通过去切换分支去访问不同的版本,但是切换分支之前需要先commit到本地仓库,否则会丢失本地仓库数据。
2、jenkins是一个持续集成和持续部署的一个工具
Jenkins是一个开源的持续集成工具,使用jenkins搭建持续集成环境,可以进行自动构建、自动编译、自动部署。
四、rebase和merge的区别
1、 rebase 会把你当前分支的 commit 放到公共分支的最后面,所以叫变基。就好像你从公共分支又重新拉出来这个分支一样。
2、 merge 会把公共分支和你当前的commit 合并在一起,形成一个新的 commit 提交。