概述

Git 是什么

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

Git 有哪些特性

  • 直接记录快照,而非差异比较
  • 多数操作仅添加操作
  • 近乎所有操作都是本地执行
  • 时刻保持数据完整性

有关以上特性的详细解释,请查看Pro Git的Git基础章节。

为什么要使用 Git

  • 能够对文件版本控制多人协作开发。
  • 拥有强大的分支特性,所以能够灵活地以不同的工作流协同开发。
  • 分布式版本控制系统,即使协作服务器宕机,也能继续提交代码或文件到本地仓库,当协作服务器恢复正常工作时,再将本地仓库同步到远程仓库。
  • 当团队中某个成员完成某个功能时,通过pull request操作来通知其他团队成员,其他团队成员能够review code后再合并代码。

Git Flow 简介

  Git Flow是构建在Git之上的一个组织软件开发活动的模型,是在Git之上构建的一项软件开发最佳实践。

分支约定

  Git Flow有主分支和辅助分支两类分支。其中主分支用于组织与软件开发、部署相关的活动;辅助分支组织为了解决特定的问题而进行的各种开发活动。

主分支

  主分支是所有开发活动的核心分支。所有的开发活动产生的输出物最终都会反映到主分支的代码中。主分支分为master分支和develop分支。

master 分支

  • master分支存放的是随时可供在生产环境中部署的稳定版本代码
  • master分支保存官方发布版本历史,release tag标识不同的发布版本
  • 一个项目只能有一个master分支
  • 仅在发布新的可供部署的代码时才更新master分支上的代码
  • 每次更新master,都需对master添加指定格式的tag,用于发布或回滚
  • master分支是保护分支,不可直接push到远程仓master分支
  • master分支代码只能被release分支或hotfix分支合并

develop 分支

  • develop分支是保存当前最新开发成果的分支
  • 一个项目只能有一个develop分支
  • develop分支衍生出各个feature分支
  • develop分支是保护分支,不可直接push到远程仓库develop分支
  • develop分支不能与master分支直接交互

辅助分支

  辅助分支是用于组织解决特定问题的各种软件开发活动的分支。辅助分支主要用于组织软件新功能的并行开发、简化新功能开发代码的跟踪、辅助完成版本发布工作以及对生产代码的缺陷进行紧急修复工作。这些分支与主分支不同,通常只会在有限的时间范围内存在。

辅助分支包括:

  • 用于开发新功能时所使用的feature分支
  • 用于辅助版本发布的release分支
  • 用于修正生产代码中的缺陷的hotfix分支

  以上这些分支都有固定的使用目的和分支操作限制。从单纯技术的角度说,这些分支与Git其他分支并没有什么区别,但通过命名,我们定义了使用这些分支的方法。

feature 分支

使用规范:

  • 命名规则:feature/*
  • develop分支的功能分支
  • feature分支使用develop分支作为它们的父类分支
  • 以功能为单位从develop拉一个feature分支
  • 每个feature分支颗粒要尽量小,以利于快速迭代和避免冲突
  • 当其中一个feature分支完成后,它会合并回develop分支
  • 当一个功能因为各种原因不开发了或者放弃了,这个分支直接废弃,不影响develop分支
  • feature分支代码可以保存在开发者自己的代码库中而不强制提交到主代码库里
  • feature分支只与develop分支交互,不能与master分支直接交互

  如有几个同事同时开发,需要分割成几个小功能,每个人都需要从develop中拉出一个feature分支,但是每个feature颗粒要尽量小,因为它需要我们能尽早merge回develop分支,否则冲突解决起来就没完没了。同时,当一个功能因为各种原因不开发了或者放弃了,这个分支直接废弃,不影响develop分支。

release 分支

使用规范:

  • 命名规则:release/*,“*”以本次发布的版本号为标识
  • release分支主要用来为发布新版的测试、修复做准备
  • 当需要为发布新版做准备时,从develop衍生出一个release分支
  • release分支可以从develop分支上指定commit派生出
  • release分支测试通过后,合并到master分支并且给master标记一个版本号
  • release分支一旦建立就将独立,不可再从其他分支pull代码
  • 必须合并回develop分支和master分支

  release分支是为发布新的产品版本而设计的。在这个分支上的代码允许做小的缺陷修正、准备发布版本所需的各项说明信息(版本号、发布时间、编译时间等)。通过在release分支上进行这些工作可以让develop分支空闲出来以接受新的feature分支上的代码提交,进入新的软件开发迭代周期。

  当develop分支上的代码已经包含了所有即将发布的版本中所计划包含的软件功能,并且已通过所有测试时,我们就可以考虑准备创建release分支了。而所有在当前即将发布的版本之外的业务需求一定要确保不能混到release分支之内(避免由此引入一些不可控的系统缺陷)。

  成功的派生了release分支,并被赋予版本号之后,develop分支就可以为“下一个版本”服务了。所谓的“下一个版本”是在当前即将发布的版本之后发布的版本。版本号的命名可以依据项目定义的版本号命名规则进行。

hotfix 分支

使用规范:

  • 命名规则:hotfix/*
  • hotfix分支用来快速给已发布产品修复bug或微调功能
  • 只能从master分支指定tag版本衍生出来
  • 一旦完成修复bug,必须合并回master分支和develop分支
  • master被合并后,应该被标记一个新的版本号
  • hotfix分支一旦建立就将独立,不可再从其他分支pull代码

  除了是计划外创建的以外,hotfix分支与release分支十分相似:都可以产生一个新的可供在生产环境部署的软件版本。

  当生产环境中的软件遇到了异常情况或者发现了严重到必须立即修复的软件缺陷的时候,就需要从master分支上指定的TAG版本派生hotfix分支来组织代码的紧急修复工作。

  这样做的显而易见的好处是不会打断正在进行的develop分支的开发工作,能够让团队中负责新功能开发的人与负责代码紧急修复的人并行的开展工作。

使用规范

所有使用了本规范的项目,必须严格规范操作,否则不予以合并代码、提测、打包上线等后续操作。

基本要求

  • 所有commit必须有注释,内容必须简洁明了的描述本次commit涵盖了哪些内容。严禁注释内容过于简单或不能明确表达提交内容的!
  • 合理控制提交内容的颗粒度,一次commit含一个独立功能点。严禁一次提交涵盖多个功能项。
  • 正确为每个项目设置Git提交用到的user.name和user.email信息,以公司邮箱为准,不可随意设置以影响无法正确识别。 查看当前项目配置信息的命令:git config -l

版本号(tag)

  • 版本号(tag)命名规则:主版本号.次版本号.修订号,如2.1.13。(遵循GitHub语义化版本命名规范)
  • 版本号仅标记于master分支,用于标识某个可发布/回滚的版本代码
  • 对master标记tag意味着该tag能发布到生产环境
  • 对master分支代码的每一次更新(合并)必须标记版本号
  • 仅项目管理员有权限对master进行合并和标记版本号

项目权限

  • Git权限分管理员、开发者、浏览者三种类型
  • 浏览者只能浏览代码,无push、pull request等所有写权限
  • 开发者拥有浏览、push非主分支、提交pull request工单权限
  • 管理员拥有建立和管理Git项目、合并分支和代码、给master打tag版本号等权限

分支使用

  • 每个Git项目固定含有上述所有分支类型。主分支master和develop是保护分支,只能进行合并请求,均不可直接提交代码。
  • 功能需求或常规Bug修复,请从develop拉取feature分支;线上紧急问题修复,请从master拉去hotfix分支。

代码提交

  • 一个提交就代表解决一个问题
  • 大问题适当地分解为多个小问题,以便每次小型提交都更易于理解

常用命令

WorkSpace:  工作区

Index/Stage: 暂存区       "git add ." 命令解释:    把新创建文件(Untracked files 变成 Changes to be commited) 在暂存区域生成了快照,等待被提交

Repository:   本地仓库   git commit -m "提交到本地仓库"  (只有暂存区域的文件(即:文件状态为“Changes to be committed”)才会被提交 )

Remote:        远程仓库   git pull origin / git push origin  master:master   (推送本地仓库分支代码到远程分支)

注释格式

  • 第1行,标题行,对提交的简要总结,长度不超过50个字符,用语采用命令式而非过去式
  • 第2行,空行
  • 第3行开始,正文内容,对改动的详细介绍),可以是多行内容,建议每行长度不超过72个字符
  • 正文用于解释是什么为什么,而不是如何做
  • 如果有对应的issue,则将issue的id或链接放在注释正文中
  • 并非强制所有提交都要求3行+格式的注释,但除非标题行内容就能清晰的描述提交内容,否则必须采用3行+的注释格式

为什么要约定注释格式? 1. 加快 Reviewing Code 的过程 2. 帮助我们写好 release note 3. 5年后帮你快速想起来某个分支,tag 或者 commit 增加了什么功能,改变了哪些代码 4. 让其他的开发者在运行 git blame 的时候想跪谢 5. 其他小伙伴不会出现想抽你的冲动 6. 总之,一个好的提交信息,会帮助你提高项目的整体质量

看看 Linus Torvalds 在Linux项目上写的提交注释:https://github.com/torvalds/linux/commits/master以及 Linus Torvalds 关于提交注释的讨论:https://github.com/torvalds/linux/pull/17#issuecomment-5659933

推荐工具

  • SourceTree SourceTree集成了Git Flow功能,能简单方便的操作和实现常规的工作流程。支持OSX和Windows平台。
  • Git Flow 扩展 Git Flow模型提出者nvie写的Git命令集扩展,提供了极出色的命令帮助以及输出提示。支持OSX,Linux和Windows平台。参考:git-flow 备忘清单

参考资料

  • 企业级开发:Gitflow Workflow工作流
  • 在阿里 我们如何管理代码分支

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

  • 基于git的源代码管理模型——git flow
  • Git版本控制与工作流
  • Git分支管理策略
  • 常用 Git 命令清单
  • git-flow 备忘清单
  • 语义化版本 - GitHub起草的版本号命名规范
  • 写好Git Commit信息的7个建议
  • 写出好的 commit message
  • 如何设置Git提交注释模板
  • GIT版本团队内部操作规范

Git Flow 分支管理简述相关推荐

  1. Git Flow分支管理

    1.Sourcetree简介及安装 一个用于Windows和Mac的免费Git客户端.Sourcetree简化了如何与Git存储库进行交互,这样您就可以集中精力编写代码.通过Sourcetree的简单 ...

  2. GIT FLOW 分支管理

    1. 分支管理环境分类: 生产环境(主分支) 预生产环境(发布分支) 测试环境(开发分支) 2. 开发分支分类: feature(功能分支): 用于开发一个新功能 完成新功能开发后合并 develop ...

  3. linux下git分支管理,git远程分支管理

    git远程分支管理 使用分支的原则 master分支是非常重要的,线上发布代码用这个分支,平时我们开发代码不要在这个分支上 创建一个dev分支,专门用作开发,只有当发布到线上之前,才会把dev分支合并 ...

  4. Git Flow分支策略与Azure DevOps相关功能简介

    想了很久,还是写这么一篇文章来总结一下有关分支策略和DevOps的一些内容吧.其实,DevOps相关的内容并不是我的工作范围,不过对于敏捷开发.DevOps.项目管理等等这一系列的与开发过程相关的内容 ...

  5. Git 代码分支管理 / 版本管理

    Git 代码分支管理 / 版本管理 在使用 Git 时,基本不可能只有一个分支. 即使只有一个人发开,也会考虑代码的安全而分多个分支.多人协同开发时,可能每个人在不同的分支开发,也可能不同团队在不同的 ...

  6. Git远程分支管理(四)

    本系列为个人学习Git参照廖雪峰老师的笔记 本文内容:Git远程分支管理 参考笔记: https://www.liaoxuefeng.com/wiki/896043488029600 文章目录 3 G ...

  7. Git实战(五)| 让工作更高效,Git的分支管理

    上一篇讲到Git的分支管理实操,在线合并和本地合并都进行了实操.毕竟:光说不练是假把式.而只练不整理,只能是傻把式了.分支管理到底如何进行管理呢? 先以GitLab上的一张经典的图打头,作为一个总体概 ...

  8. git的分支管理(详细版)

    git的分支管理 git所有分支之间彼此互不干扰,各自完成各自的工作和内容.可以在分支使用完后合并到总分支(原分支) 上,安全.便捷.不影响其他分支工作 查看当前工作在那个分支 git branch ...

  9. 139.00.005 Git学习-分支管理

    @(139 - Environment Settings | 环境配置) 一.Why? 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交, ...

最新文章

  1. 238. Product of Array Except Self
  2. [网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站防护
  3. 鸿蒙处理器的手机有什么,华为重拳出击!首款鸿蒙手机已确认,网友:还买什么iPhone11?...
  4. base64是哪个jar包的_涨知识 | 用maven轻松管理jar包
  5. 第2章[2.1] 开发模式及快速测试方式
  6. iptables数据包、连接标记模块MARK/CONNMARK的使用(打标签)
  7. 什么是脏数据,缓存中是否可能产生脏数据,如果出现脏数据该怎么处理?
  8. 电脑出现您的计算机配置似乎正确的,Win10提示你的计算机配置似乎是正确的怎么解决?...
  9. 能否被2整除引发的思考
  10. 幻灯片制作 新手制作幻灯片-来自于三人行慕课
  11. 去除取消WPS的广告推送、WPS热点以及推荐软件等骚扰功能
  12. 芯片如何储存信息_手机上的你以为信息删了就彻底删除了?事情没那么简单
  13. 用自己电脑搭建外网可访问的服务器
  14. 企业网站怎么制作?企业网站制作,只需记住这8个步骤
  15. 谁说江西没有区块链;BM:去中心化搜索引擎的时代到来了 | 一分钟链圈
  16. 数据库,数据库管理系统
  17. Unity与Processing的画面传输(Spout 接收与发送)
  18. 用Visio绘制深度模型结构图的基本单元_斜立方体
  19. 使用gpio_direction_output()无法设置GPIO原因分析
  20. 歌曲合成:MardSiningSy结果

热门文章

  1. Itext7在PDF指定位置添加电子公章
  2. LOG 解析方法(代码来自网络)
  3. 1号店于刚:价格留不住客户 服务是王道
  4. 解读爱奇艺路演PPT:AI与大数据让爱奇艺更懂你!
  5. 为炒股而编程的 Python 程序员
  6. 求一组数据的最小值(C语言)
  7. python数据分析-分组把DataFrame列转行
  8. pandas读取Excel表头乱序但是数据未按表头读取解决方案
  9. 一个小公司老板的日常管理,希望能让创业的朋友学到东西【收藏】
  10. linux重置win10开机密码,win10 1903怎么取消(设置)开机密码