之前写了一篇《如何选择版本控制系统 ---为什么选择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,也可以在代码托管平台华为软件开发云配置管理服务使用页面操作。下篇文章会详细讲解代码托管平台可视化操作方法。

转载于:https://www.cnblogs.com/xieyulin/p/7056175.html

如何选择版本控制系统之二相关推荐

  1. 版本控制系统客户端VisualSVN的安装与使用(for Visual Studio)

    SVN是Subversion的简称,是一套流行的Windows环境代码版本控制系统.SVN在服务端采用VisualSVN Server对项目代码进行版本控制,在客户端采用TortioseSVN管理项目 ...

  2. 分布式版本控制系统Mercurial(一):Mercurial基本功能介绍

    版本控制系统(Version Control System / Revision Control System,或者叫做源码控制系统Source Control System,以下简称VCS),是软件 ...

  3. GIT (分布式版本控制系统)

    Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. [1] Git的读音为/gɪt/. Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版 ...

  4. Git分布式版本控制系统简介和使用

    Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.[1] Git的读音为/gɪt/. Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本 ...

  5. 【分布式版本控制系统】GIT 托管网站 客户端

    上传到远程库 第一次上传 git add . git commit -m"备注信息" 之后上传 git add . git commit -m"备注信息" gi ...

  6. 22-07-14 西安 Git 分布式版本控制系统 、代码管理

    Git是目前世界上最先进的分布式版本控制系统,Git可以做源代码管理 Git的诞生 Linus (Linus Torvalds 林纳斯.托瓦斯)是在BitKeeper停止向开源社区提供免费版本后开发了 ...

  7. 【山外笔记-工具框架】SVN版本控制系统

    [山外笔记-框架工具]SVN版本控制系统 学习资料: 1.本文打印版下载地址:[山外笔记-框架工具笔记]SVN版本控制工具-打印版.pdf 2.SVN和TortoiseSVN在线中文文档:http:/ ...

  8. 版本控制系统GIT文档

    版本控制系统GIT文档 李达 20180629 引用博客教程+实践总结 目录 1.     版本控制系统... 2 1.1.      简介... 2 1.2.      常见的版本控制器... 3 ...

  9. Gti版本控制系统Github与Gitlab的使用

    目录 一.Git.Github.Gitlab 的区别 二:Git介绍 1.Git 与 SVN 区别 2.Git工作流程 三.git安装 1.yum安装 2.Windows 平台上安装 3.Mac 平台 ...

最新文章

  1. 梯度下降法的三种形式BGD、SGD以及MBGD
  2. 210213阶段三回顾
  3. 安卓学习笔记12:安卓按键事件
  4. WebStorm学习笔记004---Webstorm的一些常用快捷键
  5. 《算法:C语言实现》阅读笔记
  6. 拓端tecdat|R语言基于线性回归的资本资产定价模型(CAPM)
  7. 极光IM即时通讯初探
  8. 阳线双响炮K线形态,上升势不可挡,送指标源码
  9. 联合国会员国国家名称中英文对照
  10. 解决windows 10在联网时依旧无法安装3DMAX2014
  11. 基于微信小程序+JavaWeb+SSM开发的图书借阅小程序
  12. 算法分析与实践-作业2-2使用Dijkstra算法求由顶点a到顶点h的最短路径
  13. Automated defect inspection system for metal surfaces based on deep learning and data augmentation
  14. Hive Load装载数据与HDFS的关系
  15. 一个Java初学者的体验
  16. Chrome浏览器源代码编译安装Dark Reader插件
  17. java塑形是什么意思_所谓“塑形”是个什么概念?塑形和减脂的区别
  18. 用Python和Google AppEngine开发基于Google架构的应用软件
  19. 截屏的各种实现(全屏or长截屏)
  20. python之矩阵相加:提示用户输入矩阵的行数n,再提示用户输入矩阵的列数m,接下来,提示用户输入 2*n*m 个数字(每次输入 一个数字)。输出 C=A+B。

热门文章

  1. 【FCS NOI2018】福建省冬摸鱼笔记 day4
  2. Java数据持久层框架 MyBatis之API学习八(Java API详解)
  3. centos出现磁盘坏掉,怎么修复和检测。
  4. ApplicationEventPublisherAware--待完善
  5. com+ 三层布署[未成功验证]
  6. 用CSS控制表格的框格线
  7. [转]程序员生涯总结
  8. PyCharm的隐藏技巧(Tips)-快捷键等积累
  9. php在线考试自动批卷_php网络在线考试组卷系统
  10. Golang 日志框架 Zap 入坑指南