徐磊老师在 IDCF FDCC 认证公益训练营中提出,需求管理、配置管理、版本管理是研发管理的三大基石。而 Git 是当前最棒的版本控制系统,是事实的业界标准。可见熟悉 Git 操作, 设计合适的分支策略对于研发人员非常重要。

目前,已有很多文章介绍 Git 操作,也有很多文章介绍分支策略的选择。本文以华为云软件开发平台DevCloud(https://devcloud.huaweicloud.com/)为例,基于常见的研发场景,介绍分支策略和对应的操作方法,方便开发团队设计和实施适合自己的分支策略。

其中一些示例参考徐磊老师的课程《IDCF 训练营 - DevOps 持续交付》,徐磊老师在课程中详细介绍了分布式配置管理系统 Git 的特点和优势,以及如何为团队设计简单高效的配置管理策略(分支策略),推荐大家学习。

开发库、受控库和产品库

开发库、受控库和产品库的提法可能来源于 CMMI V1.0 (或更早的版本)的一个配置管理系统的例子,然后就成了一些组织的过程资产,沿用至今。

  • 开发库是开发人员修改代码的地方,开发人员可以随意修改;
  • 受控库是测试版本代码存放的地方,需要开发组长提交测试申请修改;
  • 产品库是测试通过版本存放的地方,需要测试报告来驱动修改。

Examples of configuration management systems include the following:

Dynamic (or developer's) systems contain components currently being created or revised. They are in the developer's workspace and are controlled by the developer. Configuration items in a dynamic system are under version control.

Master (or controlled) systems contain current baselines and changes to them. Configuration items in a master system are under full configuration management as described int ths process area.

Static systems contain archives of various baselines released for use. Static systems are under full configuration management as described in this process area.

使用 Git 可以建立 dev, test 和 prod 三个分支分别对应开发库、测试库和产品库,而不需要建 3 个库 (repo),这样通过简单的合并操作就可以实现从开发库到测试库、从测试库到开发库的代码复制,而且可以从合并记录中看出 3 个分支之间的关系。当然,作为分布式配置管理系统,每克隆一个新库,就相当于新建了一个或一组分支,如果建 3 个库,可以实现更严格的权限控制。

如果通过分支进行权限控制,打开 DevCloud, 进入要管理的代码仓库,在分支页签下建好所需的分支,然后在设置页签的仓库管理 » 保护分支管理菜单下,点击新建保护分支,按照提示进行操作,可以实现只允许管理员向这些分支提交/合并,也就实现了测试库和产品库受控。

注意:DevCloud 保护分支管理界面中的合并指的是合并请求的批准权限,与 git-merge 并不是一回事。

保护分制管理

开发库、受控库和产品库看起来可以满足瀑布式开发的需要,在这种场景下,开发完成再测试,测试完成再进行生产发布,没有合并时的冲突。实际上,冲突会体现在 dev 分支上。即使是远端的中心仓库只有一个 dev 分支,但其实中心仓库的 dev 分支和开发人员本地仓库的 dev 分支并不是一回事,即使用的是同一个名字,并且有跟踪关系。

$ git checkout devSwitched to a new branch 'dev'Branch 'dev' set up to track remote branch 'dev' from 'origin'.

所以只要有团队中有多位开发人员,就可能出现合并时的冲突,也就需要开发团队对分支策略达成共识。在开发开始前,以及向中心仓库推送修改前,及时拉取 dev 分支的最新改动,可以有效减少合并时的冲突。

当然,减少冲突的根本还是应从管理粒度和工程解耦两方面考虑,这是徐磊老师在《IDCF 训练营 - DevOps 持续交付》中提出的研发效能提升的核心秘籍。

至于 test 和 prod 两个受控分支,因为只有被授权的配置管理员才能进行提交/合并操作,不太可能出现冲突,反而管理相对简单。

如果 test 和 prod 两个受控分支不允许存在无关的提交记录,在从 dev 或 test 分支进行合并操作时,可使用 --squash 选项,然后再进行提交操作。当然如果使用 --squash, 从分支图谱上将看不出两个分支之间的关系,最好使用标签功能在这几个分支上进行标记。而且在下一次使用这种方式进行合并时,虽然当前的 HEAD 指向的文件内容与被合并分支的某个父节点指向的的文件内容完全相同,但两者却是不同的提交,所以很可能会出现合并冲突,此时指定合并策略可以避免处理合并冲突的麻烦。

$ git checkout testSwitched to branch 'test'Your branch is up to date with 'origin/test'.$ git merge dev --squash --strategy-option=theirsAuto-merging README.mdAutomatic merge went well; stopped before committing as requestedSquash commit -- not updating HEAD$ git commit -m "test-v2"[test 8d9b6a4] test-v2 1 file changed, 5 insertions(+)$ git log --oneline --graph* 8d9b6a4 (HEAD -> test) test-v2* 0e9357a test-v1* d226468 init$ git push...Writing objects: 100% (3/3), 285 bytes | 285.00 KiB/s, done.Total 3 (delta 2), reused 0 (delta 0)remote:remote: To create a merge request for test, visit:remote:   https://codehub.devcloud.huaweicloud.com/codehub/nnnnnn/newmerge...

如果对 git 命令行不熟悉,又没有熟悉的客户端工具支持较为复杂的合并选项,这些操作看起来有些复杂。所以如果不是执着于清除一些敏感(silly)的提交记录,使用 DevCloud 的合并请求可能更为有效。具体操作在后面的章节中会有介绍。

合并请求及评审

曾经有位同事说他们团队中的新人向代码仓库中提交的代码太乱,问能不能从服务器中撤销这些提交。虽然不是不可以,但撤销总是比较麻烦。对于有新人加入团队的情况,结对编程可能可以让新人快速融入团队,进行高质量的开发和提交。

如果条件不具备,可以参考 Martin Fowler 写的 Reviewed Commits (https://martinfowler.com/articles/branching-patterns.html#reviewed-commits)这种分支模式,团队非核心人员提交的代码经过评审后,才能被合并到受控分支。

这种分支模式可与特性分支结合使用,比如开发人员小王在开始一项工作任务时,首先基于现有的开发分支 dev 建立一个特性分支 feature-w2, 在开发完成后,拉取 dev 的最新提交合并入 feature-w2, 解决完可能出现的合并冲突,将 feature-w2 推送到中心仓库,然后发起从 feature-w2 向 dev 分支的合并请求。评审人收到合并请求后,进行代码审查和意见反馈。在评审通过后,具有权限的人员执行合并操作,并删除不再使用的分支 feature-w2。DevCloud 可以对这种模式提供很好的支持。

小王在将 feature-w2 推送到中心仓库时,会收到一个提示信息,内含为 feature-w2 新建合并请求的 URL 链接,详见上节 git push 的返回信息。打开此链接就可以在 DevCloud 中新建合并请求。在 DevCloud 代码仓库的合并请求页签下,可以查看现有的合并请求,也可以从此页面新建合并请求。

合并请求页签

新建合并请求

在新建合并请求的过程中, DevCloud 会检查准入条件,比如分支之间是否有差异,是否有冲突等。

新建合并请求详细信息

在新建合并请求页面,点击标题编辑框, DevCloud 会基于历史提交信息生成一个默认的标题,修改标题(可选),然后添加合并人和评审人(可选)后,单击确定按钮完成合并请求的创建。

评审人在合并请求页签下可以查看所有的合并请求,对选定的合并请求进行评论,包括其他评论信息和反馈信息、文件变更和提交记录,从而决定关闭或拒绝合并请求。合并人单击页面右上角的“普通合并” 或 “删除源分支合并” 完成合并操作。其中 “删除源分支合并” 很好地支持了短特性分支实践,可以避免留存过多不再使用的分支,减少混乱。

评审合并请求

Reviewed Commits 分支模式要求反馈要足够迅速,如果反馈时间过长,小王就可能需要重新回想原先进行的工作,而且可能会因为 dev 分支上有了新的提交,出现合并冲突,造成不必要的浪费。

+“CH050791”后 回“冬哥”,可入qun交流~

如何新建分支上传_Git分支策略及操作演示1|IDCF FDCC认证学员作品相关推荐

  1. 使用Python新建、上传和修改.xlsx文件

    导包: import xlsxwriter import openpyxl 新建.上传和修改.xlsx文件 # 新建标1.xlsx文件file_name = r"C:\Users\ityw\ ...

  2. 将本地项目上传到github,git操作详细指导,不看后悔深度好文!

    github入门到上传本地项目 GitHub是基于git实现的代码托管.git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好. GitHub可以免费使用,并且快速稳定.即使是付费帐户,每个月 ...

  3. 如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作...

    Phpstorm除了能直接打开localhost文件之外,还可以连接FTP,除了完成正常的数据传递任务之外,还可以进行本地文件与服务端文件 的异同比较,同一文件自动匹配目录上传,下载,这些功能是平常I ...

  4. el-upload点击打开文件上传弹窗之前进行其他操作,等待操作完成后再打开文件上传弹窗

    el-upload点击打开文件上传弹窗之前进行其他操作,等待操作完成后再打开文件上传弹窗 下面这一行代码是控制打开文件上传弹窗 <el-button class="btnUpload& ...

  5. SpringBoot+Vue+mybatis生成pdf文件(表头跟页码,适应上传linux服务器后的操作)

    SpringBoot+Vue+mybatis生成pdf文件(表头跟页码,适应上传linux服务器后的操作) 为什么使用后端去生成 说明 依赖 后端目录 控制器代码 模板代码 前端代碼 最終效果 为什么 ...

  6. git上传分支的原理_GIT分支,创建分支与合并分支的工作原理与教程

    开发一个版本,采用的发布流程: (1).从master的最新代码拉取一个开发分支,在上面进行开发 (2).在开发分支上不断地进行提交版本,期间,master也会有因为其他版本上线而不停有版本合并 (3 ...

  7. git 本地新建分支上传报错The current branch dev has no upstream branch.To push the current branch and setremote

    项目本地初始化后,commit执行完毕,然后执行git push,报如下错误: $ git push fatal: The current branch dev has no upstream bra ...

  8. gitlab创建分支上传文件_Gitlab管理和使用基本教程

    一.注册并设置Gitlab个人信息 (一)注册Gitlab 登录Gitlab站点,注册账户,设置基本个人信息.按提示操作即可. (二)配置ssh连接信息 1.创建SSH密钥 通过下面的命令生成密钥,请 ...

  9. gitlab创建分支上传文件_代码管理-gitlab使用方法建议

    对gitlab的使用主要从两个角度去分析,一个是管理员,一个是开发提交者. 1. 管理员使用 1.1 初始配置 浏览器访问 http://服务器IP:11000 第一次访问会默认以root管理员用户登 ...

最新文章

  1. 0X8009310B (ASN:276) win7安装证书时出现错误消息:找不到与此证书文件相关联的证书申请微软官方文档
  2. centos 7.x 实现免密登录
  3. java设计模式之设计原则④接口隔离原则
  4. 游戏AI –行为树简介
  5. PAT L3-007 天梯地图
  6. ab st语言编程手册_从零开始学习ST/SCL编程语言:一赋值及条件执行指令的讲解...
  7. WebLogic中如何设置Spring Boot项目的属性
  8. Java 进阶基础知识
  9. 基于Python实现仿Windows标准计算器
  10. Android官方文档中文版
  11. DCMTK读取dcm文件信息环境搭建及经验总结
  12. wps如何删除空白页?wps删除空白页的方法
  13. 【zigbee无线通信模块步步详解】ZigBee3.0模块建立远程网络控制方法
  14. 【毕业设计】stm32智能车牌识别系统 - 单片机 嵌入式
  15. 软件测试与软件调试的区别
  16. 2022年全球及中国FIP-EMI垫片行业销售前景与运行规模研究报告
  17. 每日一题-75(向公司CEO汇报工作的所有人)
  18. Android Settings 应用二 获取应用消耗的流量
  19. 事情往往不是想的那么糟
  20. usb接上计算机没反应怎么办,u盘插上去电脑没反应怎么办 u盘插上后无任何反应的解决教程...

热门文章

  1. 《赤壁》:吴宇森恶搞三国的经过
  2. 台湾一校长震动所有中国人的演讲
  3. 《央视-走遍中国》,没机会亲自去看,了解一下也好
  4. linux如何锁定文件夹,如何在没有加密的情况下保护Linux / Unix上的文件夹? | MOS86...
  5. java 取得日期_java-如何从某个日期获取日期列表?
  6. 增强——BTE流程简介
  7. 带你走进SAP项目实施过程——立项
  8. 【重复制造精讲】4、计划初识
  9. SAP Batch表MCH1和MCHA的差别?
  10. 纪念9.11十周年 奥巴马诵读圣经原文