在上篇文章中,我提到了Git的基本概念和一些本人实际项目中的总结。然而,最近读了Vincent Driessen写的一篇文章,觉得他总结的太好了,站在他肩膀上忍不住将自己的理解分享出来。Vincent Driessen的文章连接放在本文最下方,有需要的童鞋可去参考一二。

话不多上,干货顶上。

分支模型

上述这张图便是一张完整的分支模型。乍看上去,似乎有点复杂,其实理解后非常简单,并且十分经典。如果你所在项目代码管理较为混乱,我相信,该模型会对你有所帮助。

主要分支

对于完整的项目来讲,有两个主要分支,它们的生命周期与项目等同,即一直会存在:

  • master分支
  • develop分支

master:我相信,每个git用户都非常熟悉该分支,没错,这是创建项目时的默认分支。对于该模型,我们认为master分支上任何一个点,都是一个稳定的版本,可以直接部署至产线环境。

develop:这是master的平行分支,也是项目中持续开发的分支。该分支的HEAD始终反应着下一个版本的最新修改。所有的feature分支代码都往这里合入。通常,自动化测试环境都由该分支构建。

当develop分支合入了所有需求分支的代码(下个发布版本所需的功能)并且稳定时,将develop代码合入到master分支,并打上版本tag(方便以后版本回溯)。

实际项目中,我们一般不直接从develop分支将代码合入至master分支,而是从develop拉出release分支,从release分支合入master分支。详情往下观看。

次要分支

除了master和develop分支,开发模型中还需要其他分支来协同开发,其生命周期各不相同,但最终都会被删除。

  • feature分支
  • release分支
  • hotfix分支

feature分支

当开发团队接到一个新的需求,从develop分支拉出一个feature分支,该功能相关代码均在该分支开发。

当该分支开发完毕,将分支代码合入develop分支;

远端删除该feature分支,当然开发本地可保留该分支一段时间,防止出现乌龙事件。

本地创建一个feature分支:

#从本地develop分支拉出feature1分支
git checkout -b feature1 develop
#从远端develop分支拉出feature1分支
git checkout -b feature1 origin/develop

将本地分支上传到远端:

#将本地新建feature1分支上传到远端,并在远端命名为feature1
git push origin feature1:feature1
#将本地新建feature1分支上传到远端,并在远端命名为feature2
git push origin feature1:feature2  

查询分支

#查询本地分支
git branch
#查询远端分支
git branch -r
#查询所有分支
git branch -a

本地切换分支

#切换到develop分支
git checkout develop

本地删除分支

#删除本地分支feature1
git branch -d feature1
#强制删除本地分支feature1
git branch -D feature1
#删除远程分支feature1
git push origin :feature1 

release分支 

当develop分支达到一个稳定点,从develop分支从拉出release分支,将其打包并部署到环境中,进行系统测试。

如果测试过程中,出现bug,在release分支进行bug修复,然后出包再次测试;

该bug确认修复后,将代码合入develop分支;

所有测试通过后,将代码合入master分支,并在master分支打tag(一般对应版本号)。

本地分支打tag

#切换master分支
git checkout master
#本地分支打tag
git tag -a 2.0. -m 'comments'
#本地tag上传至远端
git push --tags

本地删除tag

#本地删除tag 2.0.
git tag -d 2.0.
#删除远端tag 2.0.
git push origin :refs/tags/2.0.

当发布完成后,我们可以将远端的release分支删除,当然可以保留本地release分支一段时间,防止乌龙事件。

hotfix分支

当已发布的版本,在运行一段时间后,由于偶然等因素造成bug,需紧急修复,此时从master分支拉出hotfix分支进行bug修复。

当bug修复完成后,将代码分别合入develop分支和master分支。

合入master分支后,在master打上新的tag(一般是小版本号)。

新版本上线后,远端hotfix分支可以删除,本地hotfix分支可以保留一段时间,防止乌龙事件。

上述内容看完,再回过头来看最初的分支模型,是否觉得so easy呢~

再次感谢vincent Driessen,本文多处图片均是参考该篇blog而绘制:A successful Git branching model


作者:吴家二少

博客地址:https://www.cnblogs.com/cloudman-open/

本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接

我与Git的那些破事系列(下)--分支模型的更多相关文章

  1. 我与Git的那些破事(下)--分支模型

    在上篇文章中,我提到了Git的基本概念和一些本人实际项目中的总结.然而,最近读了Vincent Driessen写的一篇文章,觉得他总结的太好了,站在他肩膀上忍不住将自己的理解分享出来.Vincent ...

  2. IDEA环境下GIT操作浅析之二-idea下分支操作相关命令

    上次写到<idea下仓库初始化与文件提交涉及到的基本命令>,今天我们继续写IDEA环境下GIT操作之二--idea下分支操作相关命令以及分支创建与合并. 1.idea 下分支操作相关命令 ...

  3. 我与Git的那些破事--代码管理实践

    1. Git是什么? 作为一名程序猿,我相信大家都或多或少接触过git--分布式版本控制软件. 有人说,它是目前世界上最先进的分布式版本控制系统,我想说,是否最先进不知道,但确实好用,实用. 作为一款 ...

  4. 我与Git的那些破事(上)--代码管理

    1. Git是什么? 作为一名程序猿,我相信大家都或多或少接触过git--分布式版本控制软件. 有人说,它是目前世界上最先进的分布式版本控制系统,我想说,是否最先进不知道,但确实好用,实用. 作为一款 ...

  5. git命令使用(必备系列)

    git是一个分布式版本控制系统,得益于高效.协作和快速的项目代码管理特性几乎每一个软件开发团队都在深度使用.本篇是对git命令的介绍,涵盖了不低于95%的日常操作命令,对你有用话可以收藏一下哦. 一. ...

  6. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  7. 一个成功的 Git 分支模型(适用于商业应用开发)

    在这篇文章中,我将推广一下大约一年前我介绍过的一些项目(公私皆有)中使用的开发模型,它们的结果都非常成功.有段时间我非常想写出来分享一下,但是我至今才抽出时间来.我不会言及任何项目细节,仅讨论分支策略 ...

  8. git 使用详解(8)—— 分支HEAD、branch/checkout

    有人把 Git 的分支模型称为"必杀技特性",而正是因为它,将 Git 从版本控制系统家族里区分出来.Git 有何特别之处呢?Git 的分支可谓是难以置信的轻量级,它的新建操作几乎 ...

  9. git之remote branch controller(远程分支控制)

    1.创建本地分支 git branch  //查看远程分支 git checkout -b branch_name //创建远程分支 在查看分支git branch 2.将分支提交到远程仓库 此时远程 ...

随机推荐

  1. hadoop的6个进程启动不全,请试 比如datanode没有启动

      赋给hadoop用户hadoop-1.2.1读写权限 [root@master usr]# chown -R hadoop121:hadoop121 hadoop-1.2.1/   折腾了两个小时 ...

  2. SVN常用命令之checkout

    官方解释,请参考:http://www.subversion.org.cn/svnbook/nightly/svn.ref.svn.c.checkout.html 常用检出命令: svn co htt ...

  3. [转]C#操作Memcached帮助类

    在VS中安装Memcached,直接在NuGet下搜索Memcached,选择第一个进行安装: 服务端资源下载地址:https://pan.baidu.com/s/1gf3tupl 接下来开始写程序, ...

  4. TOJ5705动态序列操作(STL or treap)

    传送门:动态序列操作 在一个动态变化的序列中,完成以下基本操作: (1)插入一个整数 (2)删除一个整数 (3)查找序列中最大的数 (4)查找序列中最小的数 (5)求x的前驱(前驱定义为不大于x的序列 ...

  5. 学习Java第八周

    1.流的分类 1.字节流:Stream 2.字符流: Writer,Reader 输入流 :InputStream ,Reader 输出流 :OuputStream,Writer 字节流重要还是字符流 ...

  6. IDE介绍之——CLion

    CLion是JetBrains公司旗下发布的一款跨平台C/C++IDE开发工具. 使用CLion上最好要会手写CMake.要先安装编译器套件(一般安装MinGW就行). 对C++标准的支持:基本上Cl ...

  7. 【抖音测试开发日常实习】一二三四面面经,攒人品求Offer

    总结: 一.流程 (估计)一面二面技术leader面,三面部门领导面,四面肯定是HR面 二.系统 用的牛客网面试系统,长相大概是这样:   打字聊天框我在听不清对面声音的时候用过,感觉没啥卵用,手撕代 ...

  8. springMvc web项目中restful风格的api路径中有小数点会被过滤后台拿不到最后一个小数点的问题

    有两种解决方案: 1:在api路径中加入:.+ @RequestMapping("/findByIp/{ip:.+}") public Object test(@PathVaria ...

  9. flask修改数据库字段的类型和长度

    flask修改数据库字段的类型和长度 ​ 在将models中的字段的db.String(256)修改为db.String(1024)后,执行migrate和upgrade操作后,发现数据库并没有更新, ...

  10. Ssh_key免秘钥登录

    一,环境准备 1.1 操作系统 [root@manager ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [root@manager ~ ...