git:分支管理策略

2023-11-13

主分支Master

  • 首先,代码库应该有一个,而且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。
  • Git主分支的名字,默认叫做Master。它是自动建立的,版本库初始化以后,默认就是在主分支在进行开发。
  • 主分支,也是用于部署生产环境的分支,应确保master分支稳定性
  • master 分支一般由develop以及hotfix分支合并,任何时间都不能直接修改代码

开发分支Develop

  • 主分支只用来分布重大版本,日常开发应该在另一条分支上完成。我们把开发用的分支,叫做Develop。
  • 一般开发的新功能时,feature分支都是基于develop分支下创建的
  • 这个分支可以用来生成代码的最新隔夜版本(nightly)。如果想正式对外发布,就在Master分支上,对Develop分支进行"合并"(merge)。

Git创建Develop分支的命令:

  git checkout -b develop master

Develop本地分支推送到远程分支Develop

记得推到远端之前先拉取最新代码(会将远程仓库中这个分支上的更新和本地分支上的更新合并,如果两者之间有冲突,就需要手动解决冲突)
git branch --set-upstream-to=origin/develop  develop
git pull
本地分支推送到远程分支
git push origin develop

将Develop分支发布到Master分支的命令:

  # 切换到Master分支
  git checkout master

  # 对Develop分支进行合并
  git merge --no-ff develop

使用--no-ff参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本演进的清晰,我们希望采用这种做法。

 临时性分支

前面讲到版本库的两条主要分支:Master和Develop。前者用于正式发布,后者用于日常开发。其实,常设分支只需要这两条就够了,不需要其他了。

但是,除了常设分支以外,还有一些临时性分支,用于应对一些特定目的的版本开发。临时性分支主要有三种:

  * 功能(feature)分支

  * 预发布(release)分支

  * 修补bug(fixbug)分支

这三种分支都属于临时性需要,使用完以后,应该删除,使得代码库的常设分支始终只有Master和Develop。

接下来,一个个来看这三种"临时性分支"。

功能分支

  • 功能分支是为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop。
  • 功能分支的名字,可以采用feature-*的形式命名。比如: feature-user_module、 feature-cart_module

创建一个功能分支:

 git checkout -b feature-x_a develop

开发完成后,将功能分支合并到develop分支:

git checkout develop

git merge --no-ff feature-x_a 

删除feature分支:

git branch -d feature-x_a 

预发布分支

  • 预发布分支:发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。
  • 预发布分支是从Develop分支上面分出来的,预发布结束以后,必须合并进Develop和Master分支。它的命名,可以采用release-*的形式。

创建一个预发布分支:

  git checkout -b release-1.2 develop

确认没有问题后,合并到master分支:

 git checkout master

  git merge --no-ff release-1.2

  # 对合并生成的新节点,做一个标签
  git tag -a 1.2

再合并到develop分支:

 git checkout develop

  git merge --no-ff release-1.2

最后,删除预发布分支:

git branch -d release-1.2

修补bug分支

最后一种是修补bug分支。软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。

修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。它的命名,可以采用fixbug-*的形式。

创建一个修补bug分支:

git checkout -b fixbug-0.1 master

修补结束后,合并到master分支:

 git checkout master

  git merge --no-ff fixbug-0.1

  git tag -a 0.1.1

再合并到develop分支:

  git checkout develop

  git merge --no-ff fixbug-0.1

最后,删除"修补bug分支":

 git branch -d fixbug-0.1

Git

开发流程

GitHub 开发流程的关键在于两点:

  • 有一个稳定的分支,例如 master;
  • 每次创建新功能或者修复 Bug,必须创建一个分支。最后通过代码审查和自动化测试后,才能合并回稳定分支。

通过这样的开发流程,就相当于把自动化测试和代码审查作为一种强制性要求了,所有的修改必须要通过代码审查和自动化测试通过才能合并,从而保证有一个可以随时部署发布的稳定分支。
 

我们具体看看基于 Github flow 是如何开发的。

第一步:创建一个分支

分支是 Git 中的核心概念,整个 GitHub 流程都是基于分支展开的,master 分支是要一直 保持稳定的,不能直接在 master 上开发。

无论你是要开发一个新功能还是修复一个 Bug,第一件事永远是从 master 创建一个分支 出来。

第二步:提交更新

当创建好分支后,就可以基于分支开始工作了,这时候就可以按照如下原则,频繁的提交更新。

  • 原则一:要频繁的提交;
  • 原则二:每次提交后要跑自动化测试;
  • 原则三:提交的代码要有人审查。

注意每次提交的时候,要加上说明性的信息,让其他人明确知道你这次提交的内 容是什么,如果开发过程中,发现错误了,还可以随时回滚之前的更改。

 第三步:创建一个 Pull Request

在开发完成后,创建一个 Pull Request(合并请求,简称 PR,Gitlab 中叫 Merge Request),创建 PR 时,通常要附上描述性的信息,关联上相应的 Ticket 连接,让其他 人知道你这个 PR 要完成什么任务。创建好 PR 后,其他人就可以直观的看到你所有的修 改。

 第四步:讨论和代码审查

当你的 PR 提交后,团队的其他人就可以对 PR 中的代码修改进行评论。比如说代码风格不 符合规范、缺少单元测试、或者很好没有问题。PR 的主要目的就是为了方便大家做代码审 查。

根据代码审查的结果,你可能要做一些修改,那么只要继续提交更新到这个分支就可以了, 提交更新后,PR 就会自动更新,其他人可以基于你的更新进一步的讨论和审查,直到通过 代码审查。

第五步:部署测试

在合并前,还需要把分支的修改进行测试。理论上来说,需要将修改的内容部署到测试环境 测试,但这样效率太低了,所以通常的做法是借助持续集成工具,在每次提交代码后,就运 行自动化测试代码,自动化测试代码全部通过后,就可以认为质量是可靠的。

这也意味着你需要让项目中的自动化测试代码保持一定的测试覆盖率,否则质量还是难以保 障的。

第六步:合并

当你的代码通过了代码审查和自动化测试,就可以将代码合并到 master 分支了。合并后, 之前的分支就可以删除,但你之前所有的提交记录在 master 都可以看到,所以完全不用担 心丢失历史版本记录。

 以上就是 GitHub 开发流程的主要步骤,通过分支开发新功能或者修复 Bug,强制通过代 码审查和自动化测试才能合并 master,从而保证 master 的稳定。

GitHub 开发流程的几个常见问题

怎么发布版本?

要发布版本的话,从 master 上创建一个 Tag,例如 v1.0,然后将 Tag v1.0 上的内容部署 到生产环境。

怎么给线上版本打补丁?

如果线上发布的版本(例如 v1.0)发现 Bug,需要修复,那么基于之前的 Tag 创建一个分 支(例如 hotfix-v1.0-xxx)出去,在分支上修复,然后提交 PR,代码审查和自动化测试通 过后,从分支上创建一个新的 Tag (例如 v1.0.1),将新的 Tag 发布部署到生产环境,最 后再把修改合并回 master。

如果我经常需要打补丁,有没有比 Tag 更好的办法?

每次发布后,可以创建一个发布版本的分支,例如 release-v1.0,每次打补丁,都直接从 发布分支 release-v1.0 而不是 master 创建新的分支(例如 hotfix-release-v1.0-xxx), 修复后提交 PR,代码审查和自动化测试通过后,合并回分支 release-v1.0,然后基于 release-v1.0 分支发布补丁。

最后将合并的 PR,借助 git 的 cherry-pick 命令再同步合并回 master

总结

无论你基于哪一种开发流程,最好能做到这两点:

1. 有一个稳定的代码分支;

2. 在合并分支之前,对代码有审查,自动化测试要能通过。

这样你才能做到可以随时发布,质量稳定,高效协作。

其他:推荐一个简单好用的代码管理平台 gogs 非常轻量好用 比 gitlab 简洁很多

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git:分支管理策略 的相关文章

  • GIT - 推送到 (GitHub) origin master 没有任何作用

    我已经分叉了某人的 GIT 存储库 https github com nippysaurus toodledo objc 将其克隆到我的本地计算机 显示带有以下信息的来源 remote origin Fetch URL https emai
  • 如何签出仅在“git ls-remote”中列出的分支?

    我遇到了无法切换到仅列出的分支的情况git ls remote 这是详细信息 我分叉了一个 github repoA 作为 repoB 创建了自己的分支并将其推送到 ComputerA 中的 repoB 在 ComputerB 中 我将分叉
  • git 如何查找分支源自的提交哈希

    假设我从主分支分支到主题分支 然后在主题分支上进行了一些提交 是否有命令告诉我主题分支源自的主分支上的提交哈希 理想情况下 我不必知道我做了多少次提交 试图避免 HEAD 5 我已经用谷歌搜索过 但似乎无法找到答案 谢谢 use git m
  • 如何生成类似github的影响图?

    是否有一些程序 或者我错过的一些神奇的 git 插件 可以从 git 存储库获取影响图或类似的东西 而无需通过 github 就数据收集而言 我可以生成图表 我不确定从哪里开始编写自己的代码 我假设有一些标志我可以传递给 git log 来
  • 自动同步两个 git 存储库

    是否可以保持同步两个 Github 存储库 远程 的特定文件夹 有两个 github 存储库 repoA 和 repoB 这两个存储库都有名为 ABC 的文件夹以及其他独特的文件夹 如果repoA的文件夹ABC中的任何文件有更新 我想自动更
  • 将 Visual Studio 在线 Git 存储库集成到 Android Studio 1.0.2

    我正在使用 Visual Studio Online 进行开发过程 我想将我的 Android Studio 1 0 2 代码集成到其中 但是 据我所知 Android Studio 没有 TFS 插件 这就是为什么我想使用 Git 进行源
  • 如何使用 git --word-diff 显示空格差异?

    为了说明问题 参见diff https github com nim lang Nim commit 47c7fd037ed28b7de3d120b003d059d30e18f128 diff split diff 8af935b2312d
  • 如何恢复已删除的远程分支

    我们的远程主分支被删除 我有主存储库的本地副本 但它已经过时了 我可以通过将最后一个已知的提交哈希值插入 URL 来查看 github 中的分支 但未能成功恢复它 我尝试了几个步骤来恢复它 git reset hard 16deddc05c
  • Git 中的数据完整性?

    我现在已经多次听到提到 Git 提供数据完整性 但是 这是什么意思 据我所知 git 中的所有对象都是使用 SHA 1 校验和来访问的 并且该校验和是根据文件的内容计算的 这意味着如果文件发生更改 您将得到不同的校验和 但这如何提供数据完整
  • 检查 Git 中是否需要 pull

    如何检查远程存储库是否已更改并且需要拉取 现在我使用这个简单的脚本 git pull dry run grep q v Already up to date changed 1 但它比较重 有没有更好的办法 理想的解决方案是检查所有远程分支
  • 删除 Xcode 项目的源代码控制

    我在 Xcode 项目上使用源代码控制已经有一段时间了 但现在我不想使用源代码控制 如何从 Xcode 中的项目中删除源代码控制 有三种方法 方法 1 将禁用所有项目的源代码管理 方法 2 将删除所有项目的单个存储库的链接 方法 3 将删除
  • 如果您使用 CocoaPods,您的 .gitignore 中会包含什么内容?

    我从事 iOS 开发已经几个月了 刚刚了解到有前途的可可豆荚 http cocoapods org 用于依赖管理的库 我在个人项目上尝试过 添加了依赖项Kiwi https github com allending Kiwi到我的 Podf
  • 结帐时出现 Git 错误:“致命:引用不是树”

    当我决定弄清楚为什么我正在从事的项目如此重要时 这一切就开始了 我运行了以下脚本 git rev list objects all git cat file batch check objecttype objectname objects
  • Git 删除其他人从远程所做的最后提交

    所以 我的情况是 错误地 我已经授予某人对我的分支的承诺 现在 在我的本地 我已经进行了提交 当我尝试将其推送到远程时 它显示远程在前面 因为对方已经将他的代码推送到了这个分支并进行了多次提交 现在 我可以从远程删除这些提交而不将拉取到本地
  • Git撤销本地分支删除

    我刚刚删除了错误的分支 并进行了一些我需要的实验性更改git branch D branchName 如何恢复分支 您可以使用git reflog http git scm com docs git reflog查找分支最后一次提交的 SH
  • GitHub API 获取用户/组织总数

    Using GitHub API https developer github com v3 如何计算请求时的用户 组织总数 Users https developer github com v3 users and 组织机构 https
  • git 清除远程仓库

    如果我将错误的初始提交 或多个 推送到远程存储库 并且只想清除 销毁它 我可以通过命令来完成吗 将其从服务器中完全删除非常重要 这样它就不会占用磁盘空间 例如 今天我推送了一个完整的 Visual Studio 项目 其中包含 dll sd
  • gerrit - git(pull、checkout、cherrypick)的用途是什么?

    在 Android 的 gerrit ex 中 link https android review googlesource com c 109934 要下载补丁 我看到4个选项 回购下载 checkout pull 择优挑选 它们之间有什
  • Git 忽略本地文件更改

    我都尝试过 git update index assume unchanged config myconfig and editing git info exclude并添加config myconfig 然而 当我执行 git pull
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • js 搜索模糊匹配

    searchvalue list keyWord if keyWord var reg new RegExp keyWord var arr for var i 0 i lt list length i if reg test list i
  • Java8-对List转换Map、分组、求和、过滤

    前言 在java8之后我们list转map再也不用循环put到map了 我们用lambda表达式 使用stream可以一行代码解决 下面我来简单介绍list转map的几种方式 和转为map后对map进行分组 求和 过滤等操作 正文 数据准备
  • C#实现百度地图附近搜索&调用JavaScript函数

    前一篇文章 C 调用百度地图API入门 解决BMap未定义问题 讲述了如何通过C 调用百度API显示地图 并且如何解决BMap未定义的问题 这篇文章主要更加详细的介绍百度地图的一些功能 包括附近搜索 城市搜索 路线规划 添加覆盖物等等 希望
  • ipv6的链路本地地址

    目录 简介 先决条件 要求 使用的组件 规则 配置 网络图 配置 验证 检验 OSPF 的配置 正在验证的链路本地地址可接通性 ping从远程网络的链路本地地址 直接ping从连接的网络的链路本地地址 相关信息 简介 本文目的将提供对在网络
  • Qt漂亮界面

    Qt漂亮界面 功能规划 一 去掉菜单栏和工具栏 二 顶部导航栏的设计 appinit h头文件 appinit cpp的文件 使用方式 三 阵列按钮的点击事件写法 四 重写缩写界面 放大界面和关闭程序事件 五 鼠标事件的处理 Qt大量同类控
  • mysql数据库内容导出,MySql数据库导出

    Navicat Premium Data Transfer Source Server 刘文鹏 Source Server Type MySQL Source Server Version 50540 Source Host 127 0 0
  • 关于X79主板至强E5 CPU安装ArchLinux的记录

    最近想在家里搭网站 打算弄两台服务器 一个是旧机器x79主板的 作为AI绘图和Chatglm部署用 一个新买的是带有N5095的小板子 装了CentOS7来当web服务器 当作前置服务器 主要为外网提供服务 装CentOS7比较简单容易 所
  • TransFusion:利用 Transformer 进行鲁棒性融合来进行 3D 目标检测

    Query 初始化 Input dependent 以往 Query 位置是随机生成或学习作为网络参数的 而与输入数据无关 因此需要额外的阶段 解码器层 来学习模型向真实对象中心移动的过程 论文提出了一种基于center heatmap 的
  • VC6.0使用教程

    使用之前我们先准备一段代码 include
  • C#将依赖的DLL文件集成到EXE内部

    使用场景 C 写的一些小程序 为了方便传播 减少传播文件数量 将依赖的DLL文件集成到EXE内部是必要的 解决方案 打开 管理NuGet程序包 在浏览中搜索 Costura Fody 点击 安装 按钮 等待下载依赖及安装完成 重新编译软件
  • 操作系统7-信号量与管程

    回顾一下 并发问题 多线程并发导致资源竞争 同步概念 1 协调多线程对共享数据的访问 2 任何时刻只能由一个线程执行临界区代码 确保同步正确的方法 底层硬件支持 高层次的编程抽象 锁 信号量是锁机制在同一层上的高层抽象编程方法 一 信号量s
  • html如何设置网页的背景图片

    div div
  • Web安全面试题之-信息搜集(1)

    1 信息收集如何处理子域名爆破的泛解析问题 根据一个不存在的子域名的解析IP 来记录获取黑名单 IP 在爆破字典时 如果解析的IP在这个黑名单中 则默认跳过 如果不存在 我们则入库处理 还有一种泛解析的爆破处理方式是根据TTL来做判断 我们
  • 【Linux基础及shell脚本】Shell脚本中变量的使用

    文章目录 1 Shell变量基础 1 1 什么是变量 1 2 如何在Shell中定义和使用变量 2 Shell环境变量 2 1 什么是环境变量 2 2 环境变量与普通变量的区别 2 3 如何查看 设置和删除环境变量 3 Shell位置参数
  • 串口通信及中断

    异步通信 发送和接收数据的双方用各自的时钟控制数据的发送和接收 为降低数据传输的错误率要求双方时钟尽可能一致 异步通信以帧为单位传送数据 由于每帧数据都具有起始位和停止位所以两帧数据之间的间隔时间不影响数据传送和接收的准确率 但是每帧数据内
  • Git 笔记 - git commit

    文章目录 01 git commit 02 git commit m 03 git commit a 04 git commit p 05 git commit C 06 git commit c 07 git commit n 08 gi
  • 关于Map、WeakMap、Set 、WeakSet

    在计算机程序中 弱引用与强引用相对 是指不能确保其引用的对象不会被垃圾回收器回收的引用 一个对象若只被弱引用所引用 则被认为是不可访问的 或弱访问的 并因此可能在任何时刻被回收 Map Map 它类似于对象 也是键值对的集合 并且能够记住键
  • 基于长短期记忆神经网络LSTM的预测模型(matlab实现)

    希望是附丽于存在的 有存在 便有希望 有希望 便是光明 鲁迅 1 普通循环神经网络 循环神经网络 Recurrent Neural Networks 简称RNN 是一种能够处理时间序列数据的神经网络模型 可以自然的拟合时间和数据之间的关系
  • go 接口作为方法参数传递 

    接口作为方法参数传递 在方法内部修改结构体 示例 type IUserService interface GenId type UserService struct id string func u UserService GenId ge
  • git:分支管理策略

    主分支Master 首先 代码库应该有一个 而且仅有一个主分支 所有提供给用户使用的正式版本 都在这个主分支上发布 Git主分支的名字 默认叫做Master 它是自动建立的 版本库初始化以后 默认就是在主分支在进行开发 主分支 也是用于部署