近期困惑于Git代码版本控制,集中两天时间研究,其中基础知识来源于《Git权威指南》,分支思想则来源于一篇博文《A successful Git branching model》(作者:Vincent Driessen,原文链接:http://nvie.com/posts/a-successful-git-branching-model/),细读之下,受益匪浅,仅于此文记录心得,详细内容请参考原文。

Main Branch

master

主分支,代表着部署(生产)环境最新版本的代码状态,即代码始终与部署环境最新版本代码保持一致;

develop

开发分支,代表着即将发布的下一个版本的代码状态;也可以理解为“整合”分支,开发新特性或修复Bug过程中产生的新代码需要定期合并至开发分支,用于“每日”构建。

当开发分支(develop)中的代码稳定到一个可发布的状态时,需要被合并至主分支(master),由主分支创建相应版本(Tag)。

Supporting Branch

Feature

特性分支,用于开发新的功能特性,生命周期如下:

(1)需要开发新的功能特性时,从开发分支创建一个或多个特性分支;

git checkout -b myfeature develop

(2)新的功能特性开发完成时,特性分支需要合并至开发分支;

git checkout develop
git merge --no-ff myfeature

(3)删除特性分支;

git branch -d myfeature

(4)推送开发分支至远程版本库;

git push origin develop

注:特性分支仅存在于开发者的本地环境中,一般不将其推送至远程版本库。

Release

发布分支,特定版本发布之前的“准备”分支,用于测试或Bug修复,生命周期如下:

(1)某一个版本的功能特性全部开发完成(即该版本的所有功能特性分支已全部合并至开发分支)之后、正式发布之前需要创建相应的发布分支;

git checkout -b release-1.2 develop

注:之所以需要创建发布分支,是因为发布分支一旦创建完成,发布分支测试或修复Bug的过程中,开发分支可同时用于下一个版本的代码开发。

(2)更新、提交版本信息;

./bump-version.sh 1.2
git commit -m "Bumped version number to 1.2"

bump-version.sh只是一个示例脚本,用于更新版本文件中的版本号,也可以根据实际情况手动更新版本号。

(3)测试或Bug修复,均在此发布分支中进行;

(4)测试或Bug修复完成之后,合并至主分支、创建版本、推送至远程版本库;

git checkout master
git merge --no-ff release-1.2
git push origin master git tag -m "Version 1.2" 1.2
git push origin 1.2

(5)也需要合并至开发分支、推送至远程版本库;

git checkout develop
git merge --no-ff release-1.2
git push origin develop

(6)删除发布分支;

git branch -d release-1.2

注1:为什么不是发布分支合并至开发分支,再由开发分支合并至主分支?这是因为发布分支在测试或Bug修复过程中,开发分支可能会参与下一个版本的代码开发,这样做当前版本的代码中可以混合有下一个版本尚为完成的代码。

注2 :发布分支合并至主分支及开发分支时,由于涉及到版本号更新,因具体方式不同,可能会出现冲突;合并至主分支时,以发布分支为主;合并至开发分支时,以开发分支为主。

Hotfix

修复分支,用于修复已发布版本中存在的Bug,生命周期如下:

(1)某一个已发布版本存在Bug时,需要从相应版本创建修复分支,修复Bug及测试;

git checkout -b hotfix-1.2.1 1.2

(2)更新、提交版本信息;

./bump-version.sh 1.2.1
git commit -m “Bumped version number to 1.2.1”

(3)修复Bug及测试完成之后,创建新版本,并推送至远程版本库;

git tag -m "Version 1.2.1” 1.2.1
git push origin 1.2.1

(4)也需要合并至开发分支,并推送至远程版本库;

git checkout develop
git merge --no-ff hotfix-1.2.1
git push origin develop

(5)删除修复分支;

git branch -d hotfix-1.2.1

注1:修复分支(1)与(3)原文描述不相符,主要出于以下几个方面的考虑:

(1)主分支(master)仅维护最新版本代码;

(2)部署环境可能同时使用多个版本代码,且版本之间存在代码不兼容的情况;

(3)Bug可能出现在比较“旧”的版本中;

如果任何一个版本的Bug修复都从主分支创建修复分支,然后再合并至主分支,可能会导致代码混乱。

注2:合并至开发分支可以使得后续新发布的版本中不再包含已修复的Bug。

注3:修复特定版本的Bug时,需要在“大”版本号(1.2)的基础之上创建“小”版本号。

Code Deploy

代码部署,并不在原文讨论范围之内,但也是非常重要的一点,这里仅描述一下自己的方式:

git clone

git pull

git checkout

注:可以通过版本文件中的版本号确认具体版本信息。

Git Flow具体方式方法差异化较大,争议较多,欢迎指正讨论。

Git Flow Note的更多相关文章

  1. GIT FLOW 时序图

    git flow sequence md link: git branching model master->master branch: use default branch Note rig ...

  2. Git Flow 分支管理简述

    概述 Git 是什么 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的 ...

  3. Git flow 工作流与规范

    概述 简版图: PS. 可能用到的命令: 1.从指定 commit拉出新分支   git checkout commitId -b 本地新branchName git checkout 9fbc3d0 ...

  4. Git 在团队中的最佳实践--如何正确使用Git Flow

    我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...

  5. Git 在团队中的最佳实践--如何正确使用Git Flow[转]

    原文地址:http://www.cnblogs.com/cnblogsfans/p/5075073.html Git的优点 Git的优点很多,但是这里只列出我认为非常突出的几点. 由于是分布式,所有本 ...

  6. 基于git的源代码管理模型——git flow

    基于git的源代码管理模型--git flow A successful Git branching model

  7. git flow的使用

    简介 Gitflow工作流程围绕项目发布定义了严格的分支模型.尽管它比Feature Branch Workflow更复杂一些,但它也为管理更大规模的项目提供了坚实的框架. 与Feature Bran ...

  8. 引入git flow分支管理

    git flow是Vincent Driessen提出了一个分支管理的策略,非常值得借鉴.它可以使得版本库的演进保持简洁,主干清晰,各个分支各司其职.井井有条. 先看下Vincent Driessen ...

  9. git flow的安装和使用

    确保安装了git 1.windows系统下安装 进入cmd clone github上的gitflow到一个文件夹下 我这里clone到 c:\gitflow git clone git://gith ...

随机推荐

  1. 大数据测试之hadoop集群配置和测试

    大数据测试之hadoop集群配置和测试   一.准备(所有节点都需要做):系统:Ubuntu12.04java版本:JDK1.7SSH(ubuntu自带)三台在同一ip段的机器,设置为静态IP机器分配 ...

  2. 性能测试培训:WebSocket协议的接口性能之Jmeter

    性能测试培训:WebSocket协议的接口性能之Jmeter poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试开 ...

  3. sqoop 操作从hdfs 导入到mysql中语句

    将hdfs下/dw/dms/usr_trgt下的文件导入到mysql中test数据库下usr_trgt表中 sqoop-export   --connect jdbc:mysql://mysqlDB: ...

  4. vuejs学习笔记(1)--属性,事件绑定,ajax

    属性 v-for 类似于angular中的 ng-repeat ,用于重复生成html片段: <ul id="box"> <li v-for="(v, ...

  5. Vuex随笔

    最近在项目中使用到了vuex,但是在配合vue使用时,也还是遇到了不少的问题,最终还是解决了问题,因此写一篇随笔来记录期间遇到的问题吧 项目概要: Vuex中所储存的的状态如下: Vue中:有一个ta ...

  6. 基于MVC和Bootstrap的权限框架解决方案 二.添加增删改查按钮

    上一期我们已经搭建了框架并且加入了列表的显示, 本期我们来加入增删改查按钮 整体效果如下 HTML部分,在HTML中找到中意的按钮按查看元素,复制HTML代码放入工程中 <a class=&qu ...

  7. Spark名词解释及关系

    随着对spark的业务更深入,对spark的了解也越多,然而目前还处于知道的越多,不知道的更多阶段,当然这也是成长最快的阶段.这篇文章用作总结最近收集及理解的spark相关概念及其关系. 名词 dri ...

  8. 【局域网聊天客户端篇】基于socket与Qt

    前言 暑假把linux下的高级编程和网络编程学习了一遍,学习很重要,但是也得有个练手的地方,所以必须做做项目来认识下自己所学习的知识. 能够找到小伙伴一起做项目也是一件很快乐的事情的,很幸运的有两个小 ...

  9. struts2 之 struts2数据校验

    1. 数据校验一般分为2类:前端的校验(js校验),后端的校验(java代码):实际开发中大部分情况下都是采用js校验.在对数据安全要求较高的情况下可能会采用后端验证. 2.  Struts2提供了后 ...

  10. python os模块常用方法

    OS模块是Python标准库中的一个操作模块,主要用于处理Linux操作系统中的文件和目录 1.要使用OS必须先导入OS import os 2.os.getcwd()获取当前路径. print os ...