之前写了一篇《如何选择版本控制系统 ---为什么选择Git版本控制系统》,地址是:http://www.cnblogs.com/goldenfish/p/6876864.html,有兴趣的可以去看看,本篇文章算是这个系列的第二篇文章。

Git诞生于2002年,由Linux之父Linus Torvalds和他的团队开发并不断完善,它秉承了Linux的开源精神,为广大研发团队带来了非常棒的版本控制体验。本文立足Git的工作原理,深入探讨各种研发场景中工作流等问题。

Git工作模式

代码提交过程

一次修改被成功提交到远端仓库会历经四个阶段,1本地工作区->2缓存区->3版本库->4远端版本库,通过执行相应的Git命令,文件在这四个区域跳转,并呈现不同的状态:

1.已修改(modified):包括三种文件,新增文件,被修改的文件,被删除的文件

2.已暂存(staged):对已修改的文件执行git add或git rm操作,文件就变成已暂存状态,进入暂存区。暂存区实际上就是一个文件索引目录树,记录了所有文件名、文件状态信息,它已索引的方式建立了文件名和文件内容(在对象库.git/objects中保存)的对应关系。

3.已提交(committed):对已暂存的文件执行git commit操作,文件就变成已提交状态,进入本地版本仓库。

4.已上传:对已提交的文件执行git push操作,文件就变成已上传状态,进入远端版本仓库。

Git如何记录每次提交

我们思考一下,版本控制系统应该如何记录每次提交呢?正常的思维肯定是记录“差异”(delta),也就是前后两个版本中文件内容的不同,确实大多数版本控制系统是这么做的,比如我们所熟悉的CVS,SVN。但是,Git却不这样!每次提交更新时,Git会对全部文件作一个快照(snapshot),并保存指向这次快照的索引。

这种保存方式带来很多好处,切换版本时,直接引用指向目标版本的索引即可,不需要像差异存储那样,需要版本之间的merge,速度会快很多,更重要的是,为后文所讲到的轻量级分支切换提供了前提条件。

Git分支

Git新建分支的本质就是创建一个指向最后一次提交的可变指针,所以,Git分支的创建不是复制版本库的内容,仅仅是新建了一个指针,它以40个字符长度SHA-1字串形式保存在文件中,这难以想象的轻量级就是源于“快照”保存的版本设计理念。

Git工作流

什么是Git工作流?你可以理解为代码管理的分支策略。这里从典型的GitFlow工作流出发,配合我正在使用的代码托管平台(华为软件开发云),给大家详细讲解工作流是如何服务于项目流程管理和团队协同开发。

Ømaster:主线分支,版本有较强稳定性,供生产环境部署使用,这个分支只能从其它分支合并,不能在这个分支上直接提交修改。

新建分支:

在开发云界面输入新分支名,并选择从哪个分支检出即可。

Ødevelop:主开发分支,用来集成测试最新合入的开发成果,包含要发布到下一个Release的代码。

Øfeature:特性分支,每个特性一个分支,用于开发人员提交代码并进行自测。一旦开发完成,我们合并回Develop分支进入下一个Release。

Øhotfix:补丁分支,生产环境发现新Bug时创建的临时分支,问题验证后,合并到Master和Develop分支,所以Hotfix的改动会进入下一个Release

Ørelease:发布分支,发布新版本时,基于Develop分支创建,发布完成后,合并到master和develop分支。

各个分支之间的关系可以从开发云的“仓库网络”中查看:

优点:项目管理流程明确

缺点:相对复杂,需要同时维护两个长期分支,不适合网站项目。

分支合并

无论哪种工作流都会涉及到分支合并(把一个分支中的修改整合到当前分支),主要有两种方法:三方合并(merge)和衍合(rebase)。我们通过对同一种场景进行不同操作体会两种合并方法的区别。

场景:master分支新增了C4节点,hotfix分支新增了C3节点,现将hotfix分支合并到master分支:

1.三方包括hotfix新增节点C3,master新增节点C4,以及两者的共同祖先节点C2。这种合并操作简单,但新增合并节点C5,形成了环形,版本记录可读性差。

a)PC端命令操作方式:

#git checkout master

#git merge hotfix

b)开发云平台页面操作:

第一步:

第二步:

2.衍合先将master分支新增节点C4以补丁形式保存在.git/rebase目录中,然后同步hotfix分支最新代码,再应用补丁C4’。

#git checkout master

#git rebase hotfix

冲突解决

类型一:两个合并分支修改了同一行代码

解决方法:

1.分析哪种修改方法正确,手动合并;

2.提交修改。

类型二:文件被重命名为不同的名字

解决方法:

1.确认哪个名字是正确的,删除错误的;

2.提交修改。

结语

根据实际研发场景制定合理的工作流,能有效提高项目管理水平和团队协同开发能力,而这些分支操作,对于不习惯使用命令的人来说,可以在PC端下载使用图形化工具tortoisegit,也可以在代码托管平台华为软件开发云配置管理服务使用页面操作。下篇文章会详细讲解代码托管平台可视化操作方法。

如何选择版本控制系统之二---Git的研发应用场的更多相关文章

  1. 如何选择版本控制系统 ---为什么选择Git版本控制系统

    版本控制系统 "代码"作为软件研发的核心产物,在整个开发周期都在递增,不断合入新需求以及解决bug的新patch,这就需要有一款系统,能够存储.追踪文件的修改历史,记录多个版本的开 ...

  2. Git-分布式版本控制系统(二)

    工作区(Woring directory ) 版本区(repository,即隐藏的.git文件) Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git ...

  3. GIT版本控制系统(二)

    貌似第二条有点用,还木有都验证过,贴过来再说~ 转自: http://www.cnblogs.com/lhb25/p/10-useful-advanced-git-commands.html 1. 导 ...

  4. Google Code项目代码托管网站上Git版本控制系统使用简明教程

    作为一个著名的在线项目代码托管网站,Google Code目前主要支持三种版本控制系统,分别为Git, Mercurial和 Subversion.Subversion即SVN相信大家都已经熟知了,这 ...

  5. Git 分支(分布式版本控制系统)

    前言 几乎所有的版本控制系统都以某种形式支持分支.使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线.在很多版本控制系统中,这是一个略微低效的过程--常常需要完全创建一个源代码目录的 ...

  6. 开发效率优化之Git分布式版本控制系统(一)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从Git分布式版本控制系统来阐述开发效率优化 一,企业 ...

  7. Git分布式版本控制系统(上)

    Git分布式版本控制系统(上) 链接:https://pan.baidu.com/s/1CgaEv12cwfbs5RxcNpxdAg 提取码:fytm 复制这段内容后打开百度网盘手机App,操作更方便 ...

  8. Git是目前世界上最先进的分布式版本控制系统

    一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...

  9. g4e基础篇#2 Git分布式版本控制系统的优势

    g4e 是 Git for Enterprise Developer的简写,这个系列文章会统一使用g4e作为标识,便于大家查看和搜索. 章节目录 前言 1. 基础篇: 为什么要使用版本控制系统 Git ...

随机推荐

  1. LoadRunner性能测试专项班隆重开班

    LoadRunner性能测试专项班隆重开班 POPTEST首届高级性能测试提升强化班开课. 也许你只是看到成功者的光鲜,却没看到他们的努力和汗水.不要否定现在,要看到未来.提高自己.怎么自己.成就自己 ...

  2. idea2015的使用心得

    今天打开myeclipse感觉里面全是project,也懒着换地方了,因为这些代码还要时常看,索性安装了idea试试水,感觉还不错,用起来并不比myeclipse差,跟webstorm差不多,他俩就是 ...

  3. 程序员带你一步步分析AI如何玩Flappy Bird

    以下内容来源于一次部门内部的分享,主要针对AI初学者,介绍包括CNN.Deep Q Network以及TensorFlow平台等内容.由于笔者并非深度学习算法研究者,因此以下更多从应用的角度对整个系统 ...

  4. php基础知识--2017-04-14

    1.Php的两种打开方式: 第一种方式:http://localhost/0414/qq.php 第二种:新建站点,选到www目录.点击服务器----+添加-------选择本地网络   ------ ...

  5. 回到顶端的jquery

    现在的淘宝啊,京东啊,各种网站都有一个功能,有一个按钮,在页面最顶端的时候不会显示,当往下拉到一定的时候会出现.点击他会直接跳到页面的顶端.代码如下: html代码: <div id=" ...

  6. hyper-v使用wifi链接网络

    公司了给本屌一个thinkpad笔记本,10G内存.想不出拿来干什么...装了一个win8.1_64位,cf,qq,hyper-v. 昨天第一次玩hyper-v新建了的时候选择“第二代”坑爹就开始了, ...

  7. Vim常用操作-快速删除括号中内容。

    如果你和我一样,希望拥有众多工具,发挥工具最大执行效率,让工作事半功倍的话,我推荐你来使用下 Vim. 刚接触Vim 会觉得它的学习曲线非常陡峭,要记住很多命令,操作太复杂.所以这个系列的分享,不会教 ...

  8. google ip地址

    http://203.208.46.146 http://203.208.46.177 http://203.208.46.178 http://209.116.186.251 http://203. ...

  9. ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist

    Oracle 设置默认数据库 如果我们的服务器上或者电脑上安装了多个数据库,当我们使用sqlplus时如果为指定数据库时登录到的是哪一个数据库呢?今天遇到了一个老问题: ORA-01034: ORAC ...

  10. JavaScript 中有关Array操作的一些函数

    JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素. 要取得Array的长度,直接访问length属性: var arr = [1, 0.222, 'Hi', null, ...