用手画了11张图终于搞明白了Git工作流,我怀疑你用的是假 Git

2023-10-27

号外号外!《死磕 Java 并发编程》系列连载中,大家可以关注一波:

「死磕 Java 并发编程05」阿里面试失败后,一气之下我图解了Java中18把锁

「死磕 Java 并发编程04」说说Java Atomic 原子类的实现原理

「死磕 Java 并发编程03」阿里二面,面试官:说说 Java CAS 原理?

「死磕 Java 并发编程02」面试官:说说什么是 Java 内存模型(JMM)?

「死磕 Java 并发编程01」10张图告诉你Java并发多线程那些破事

目录

集中式工作流

功能分支工作流

Gitflow 工作流

Forking 工作流

总结

作为一个开发人员每天必不可少要提交代码,但是你真的懂代码提交吗?这篇文章带领大家熟悉一下常用的代码提交方式,大家可以根据自己所在公司团队的开发模式对号入座。

代码提交方式可以用一个专业术语描述:代码工作流,在 SVN 时代大家会使用集中式工作流,所有人都往一个主库分支合入代码;随着技术的演进,以 Git 为代表的分布式代码管理工具横空出世,在 Git 的基础上又逐渐出现了多种代码管理工作流:功能分支工作流Gitflow 工作流Forking 工作流。搬好小板凳,下面一一位大家讲解。

集中式工作流

集中式工作流这种工作方式对于使用过SVN的同学想必会非常的熟悉,让我们思考下在 SVN下的协作体验,不同的开发同学需要依次将本地的修改提交到服务器,如果有冲突就先解决本地的冲突再提交,这个过程中远端的服务器就像是一个集中管理者,管理着所有人的代码提交,所以 SVN的开发协作流程就是典型的集中式工作流。

如果切换到 Git 来维护代码仓,但是开发人员又对 Git 的分支模式不熟悉,能不能用 Git 实现类似的集中式工作流呢?答案是当然可以。

每个开发人员将远程仓库的代码 clone 下来变成了属于自己的本地仓库,提交代码时先提交至本地仓库,然后再推送到远程仓库。

这种模式相比 SVN 只是多了一个本地仓库而已,有了 SVN 的经验开发人员也很快能熟悉这种模式,在前些年有很多公司都是将 Git 作为 SVN 来用的。

从提交记录来看,集中式工作流通常是一条直线往前走,如下图:

集中式代码提交流程

集中式代码提交流程

小结:这种模式不推荐大家使用,因为完全没有发挥出 Git 的作用,类似于用倚天剑屠龙刀来切菜,太浪费了。

功能分支工作流

集中式工作流有一个很大的问题,随着团队内人员不断增多,大家每一次提交代码都可能会遇到冲突,提交代码一分钟解决冲突一小时。

为了便于大家并发开展工作,通常会基于 master 主干分支拉取几个特性分支,每个开发人员关注于自己的分支,需要提交代码时直接提交到本地库的特性分支,在合入到主干分支前通常会拉取最新的代码,如果有冲突先在本地解决好冲突,解决完提交 MR 申请将特性分支合入主干分支。

功能分支工作流下,不会直接将代码合入到主干分支(master),通常是通过其他分支提交 MR(Merge Request),这使得集成一些自动化操作变得简单可行了。

提交 MR 之后团队成员开始围观你写的代码,可以提交检视意见(code review),还可以进行投票(vote),团队 committer 据此合入或者驳回你的 MR。

新功能大量合并到 master 分支后容易造成 master 分支质量不稳定,不稳定会有什么问题?比如线上突然有个 bug 要解决,可能只需要修改一行代码就能解决,但是 master 分支已经合入了大量新特性,测试人员还没来得及测试,那最稳妥的办法就是将代码回退到上一次发版本的时间节点,基于这个节点再修改一行代码,是不是太麻烦了?

为了解决这些问题,Vincent Driessen大佬基于开发实践总结了一套 Git 分支管理的流程和规范,下面详细介绍一下。

Gitflow 工作流

Gitflow 工作流是目前非常成熟的一个方案,它定义了一个围绕项目发布的严格分支模型,通过为代码研发、项目发布以及维护分配独立的分支来让项目的迭代过程更加地顺畅,不同于之前的集中式工作流以及功能分支工作流,Gitflow 工作流常驻的分支有两个:主干分支 master开发分支 develop

功能分支工作流相比,Gitflow工作流没有增加任何新的概念或命令,它给不同的分支指定了特定的角色,定义它们应该如何、什么时候交互。除了功能分支之外,还为准备发布、维护发布、记录发布分别使用了单独的分支。

Gitflow 常见分支

  • 开发主分支:master 分支

    master 分支的代码是可以直接部署到生成环境的,为了保持稳定性一般不会直接在这个分支上修改代码,都是通过其他分支合并过来的。

  • 开发主分支:develop分支

    develop 分支是主开发分支,包含所有要发布到下一个release的代码,主要是由feature分支合并过来的。

  • 临时分支:feature 分支

    feature 分支主要是用来开发一个新特性,一旦开发完成会合入 develop 分支,feature 分支也随即删除掉。

  • 临时分支:release 分支

    当需要一个发布一个新release版本时,会基于develop分支创建一个release分支,经过测试人员充分测试后再合入 master 分支和 develop 分支。

  • 临时分支:hotfix 分支

    当在生成环境发现新的Bug时候,如果需要紧急修复,会创建一个hotfix分支, 充分测试后合入master和develop分支,随后删除该分支。

各分支如何配合工作

(1)master/develop分支

原则上master分支上所有的commit 都应该打上Tag,因为一般情况下master不存在 直接commit;

devlop分支 是基于 master分支创建的,与 master 分支一样都是主分支,不会被删除。

develop 从 master 拉出来之后会独立发展,不会与 master 直接产生联系。

(2)feature 分支

通常一个独立的特性都会基于 develop 拉出一个 feature 分支,feature 分支之间没有任何交互,互不影响。feature 分支一旦开发完成后会立马合入 develop 分支(采用 merge request 或者 pull request),feature 分支的生命周期也随之结束。

(3)release 分支

通常一个迭代上线会拉一个release 分支,开发人员开发完毕所有的代码都已合入 develop 分支,这时候会基于 develop 分支拉出一个 release 分支,测试人员基于该分支进行测试。

(4)hotfix 分支

hotfix分支基于master分支创建,开发完后需要同时回合到master和develop分支,同时在master上打一个tag。

分支命名规范

团队内部可以约定每个分支的命名样式,这里举个例子,大家可以参考:

  1. feature分支:以feature_开头,如 feature_order

  2. release分支:以release_开头,如 release_v1.0

  3. hotfix分支:以hotfix_开头,如hotfix_20210117

  4. tag标记:如果是release分支合并,则以release_开头,如果是hotfix分支合并,则以hotfix_开头。

Forking 工作流

Forking 工作流是以 Github 为代表的一种代码协作方式,开发者通过克隆(fork)源仓库进行编写代码,一旦完成会发起 pull request,源仓库作者可以选择是否接受该 PR。

下面通过 Github 详细讲解 Forking 工作流模式。

随便找一个Github 开源项目,https://github.com/CoderLeixiaoshuai/java-eight-part

右上角有三个按钮:Watch,Star,Fork

Watch 是关注的意思,一旦你点击了之后该项目有任何改动都会第一时间通知到你;

Star 类似于点赞的意思,多给开源项目点个赞,鼓励一下作者;

Fork 本意是分叉,实际上是克隆的意思,点了之后会将该项目拷贝一份到自己的 github 远程仓库中。

fork 示例

fork 示例

在本地执行 git clone 命令将代码克隆到本地,一顿修改操作后提交代码并 push到个人远程仓库中,然后在界面上发起 pull request,项目的原作者会看到你提交的 PR,根据提交的质量作者可以选择接受或拒绝。

Forking 工作流非常适合于类似 Github 这种开源项目,任何一个开发者都可以通过fork + pull request 向项目中贡献代码。

总结

文章介绍了四种工作流,分别是集中式工作流功能分支工作流Gitflow 工作流Forking 工作流

集中式工作流在 SVN 时代比较常见,切到 Git 后不建议再使用这种方式了。

功能分支工作流通常是一个主干 master 分支 + 多个 feature 分支,一般适用于小团队开发。

Gitflow 工作流是在功能分支工作流的基础上进一步演进而来,采用 master + develop 双主分支再加上多个临时功能分支,这是一个非常成熟的代码协作管理的方式,推荐大家使用。

Forking 工作流主要采取 fork + pull request 的模式进行协作,主要用于开源项目。

另外我把大学和工作中用的经典电子书库(包含数据结构、操作系统、C++/C、网络经典、前端编程经典、Java相关、程序员认知、职场发展)、面试找工作的资料汇总都打包放在这了,这套资源可不是一般那种网上找的资源,是伴随我从学生一路到职场,非常宝贵!

已经打包好了,点击链接获取

最后:

这四种工作流方式各有特色,开发团队可根据自身的特点去选择,不必严格拘泥于某一种方式,适合自己的才是最优的。

大家学会了吗?收藏等于白嫖,点赞才是真爱,雷小帅感谢大家~~~

作者:雷小帅

推荐一个Github 开源项目,『Java八股文』Java面试套路,领取 10G 免费学习资料,Java进阶学习,打破内卷拿大厂Offer,升职加薪!

作者简介:

☕读过几年书:华中科技大学硕士毕业;

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

用手画了11张图终于搞明白了Git工作流,我怀疑你用的是假 Git 的相关文章

  • 将主分支的提交合并到另一个分支,但不合并两个分支

    我有 git 存储库和一个主分支 我决定开发新功能 并且创建了新分支 new branch 我已经在 new branch 中创建了一些提交 但我还没有完成新功能 我决定修复 master 分支中的一些错误 因此我切换到 master 分支
  • 如何从父克隆中过去的提交中获取 git 子模块的关联提交 ID?

    有没有一种方法 除了实际检查父提交之外 还可以根据父克隆中的提交 ID 确定子模块的 SHA 1 提交 ID 我知道我能找到现在与 SHA 1 关联git submodule 这是一个例子 我有一个带有单个子模块的克隆foo上个月情况发生了
  • 如何使用 LibGit2Sharp 从 Git 获取更改?

    下面的代码将 Git url 克隆到测试目录 var url http abc 555 com team project 555 git var path E temp 555 var credential new Credentials
  • 设置单独的遥控器以仅推送和拉动子文件夹

    假设我有两个存储库 repo A and repo B 其中包含一个文件夹 其中的代码与存储库 A 中的代码类似 这实际上如何发生并不重要 但是好吧 让我们假设我刚刚从 A 复制了内容 现在我想要以下内容 就像我在 repo A 中习惯的那
  • 如何更改全局 git 设置以在拉取期间进行 git 合并

    目前 我的全局设置设置为在 git pull 期间执行变基操作 我希望它默认将其更改为 git merge 如何更改此设置 TL DR git config global pull rebase false 有点细节 Git 使用配置pul
  • Git-svn:批量删除孤立的远程分支

    我正在处理的 SVN 项目 通过 git svn 有经常创建的分支 然后与主干重新集成 然后删除 现在项目大约有10个分支没有被删除 但是在git中 gitbranch r显示大约有50个 我可以一次删除这些 检查它们是否仍然存在于 svn
  • 将代码从没有权限的存储库推送到私有存储库?

    我有一个来自外部存储库 我们称之为 ExRepo 的文件夹 我没有任何推送权限 我有一个名为 MyOwnRepo 的个人存储库 如何获取 ExRepo 并将其合并到 MyOwnRepo 中 我已经尝试过这个 C Users
  • git reword 在变基期间显示合并冲突,但是 pick 工作正常

    我正在尝试用很少提交的另一个分支来重新建立一个分支 虽然提交包括合并提交 但我可以使用以下命令成功地对其进行变基git rebase i r m
  • 无法在 git 上获取 Http 工作

    我在拇指驱动器上使用 gitbash 作为 git 我的防火墙阻止了我 并且想设置我的 git 以进行 http 访问 我使用 github 并且已经看到了有关如何执行此操作的各种信息 但我还不够了解 无法让它为我自己工作 我在 php i
  • 以编程方式将工作项关联到拉取请求

    我可以得到 https www visualstudio com en us docs integrate api git pull requests get a pull request https www visualstudio co
  • 无论我做什么,我都无法推送我的代码并不断收到相同的错误

    我正在尝试将代码推送到远程分支 但不断收到此错误 rejected non fast forward error failed to push some refs to email protected cdn cgi l email pro
  • git 标签也会被推送吗?

    自从我创建了我的存储库以来 我所使用的标签似乎 创建不会被推送到存储库 当我做git tag于 本地目录所有标签都存在 但是当我登录到 远程存储库并执行git tag 仅出现前几个 可能是什么问题 你可以这样做 git push tags
  • 将存储库从 Github 移至 Gitlab

    有没有办法将整个存储库从 Github 移动到 GitLab 对于代码本身来说 只需在 GitLab 上创建一个新的存储库并推送到它即可 Wiki 页面位于 Github 上的单独分支中 并通过 Git 机制进行管理 据我所知 GitLab
  • 詹金斯钩子不工作 - 詹金斯位桶

    您好 我正在使用 jenkins 和 bitbucket 当我向 bitbucket 存储库提交任何内容时 我想触发 jenkins 中的构建 在詹金斯 我创建了一个名为test 1 在配置部分Build Triggers我勾选的部分Tri
  • 自给定提交以来 git 中的作者列表

    我想要一种列出所有 git 作者的方法 仅自给定提交以来 是独特的 这两个很简单 我在网上看到过一些解决方案 大多数使用git log format 但我看到的都不符合附加要求 按提交日期排序 因此 如果约翰 史密斯 John Smith
  • 切换到工作区并在 Xcode 中添加 CocoaPods 后提交 git 吗?

    我刚刚在 Xcode 5 中将 CocoaPods 添加到我当前的项目中 当然 CocoaPods 创建了一个工作区 并且我已在 Xcode 中启动了该工作区 我在工作区中看到了我的项目和 Pods 项目 我的项目从第一天起就处于源代码控制
  • 是否可以使用“最小”算法进行交互式添加?

    当从快照计算变更集时 Git 并不总是正确选择块边界 git diff has a diff algorithm允许在这方面进行一些调整的选项 git diff minimal有时会给出比git diff alone 有没有办法获得相同的优
  • 如何修复 Centos 上的 Git Segmentation 错误

    我收到分段错误错误 无法在服务器上提取代码 Centos 7 这就是我遇到错误的方法 通过使用以下命令来验证我的服务器是否使用 bitbucket 进行身份验证 ssh T email protected cdn cgi l email p
  • 防止在 Git 中签出

    我目前正在研究使用 Git 管理 OpenInsight 应用程序的源代码 由于 OI 代码存储在数据库表中 因此需要进行一定量的手动工作才能将源代码导出为文本 反之亦然 到目前为止 我已经成功地使用 Git 挂钩自动化了很多这项工作 但是
  • Git 查找第一个非本地提交

    有关的 列出尚未推送到源的 Git 提交 https stackoverflow com questions 3080509 list git commits not pushed to the origin yet git rev par

随机推荐

  • How to Install one Plug-in into Eclipse

    How to Install One New Plug in Old Way before Eclipse 3 4 Installed new plug ins by dumping them in the eclipse plugins
  • 笔试

    文章目录 前言 36 异步FIFO的设计 1 先从同步FIFO说起 2 异步FIFO介绍 3 空满判断 4 跨时钟域问题 5 关于格雷码的转换 6 代码实现异步FIFO 7 几点思考 8 写在后面 往期精彩 前言 嗨 来啦 今天学习一个 比
  • 对象数组去重——数组删除所有含有固定id的对象

    一 重要方法 filter 方法可以创建一个新的数组 新数组中的元素是通过检查指定数组中符合条件的所有元素 1 数组去重 86 77 77 86 gt 86 77 去除重复元素依靠的是indexOf总是返回第一个元素的位置 后续的重复元素位
  • The inferior stopped because it received a signal from the Operating System.

    前景提要 要理解这个错误的根源 根源 用户的指针指向了系统的内存区域 表象 程序异常结束 exe crashed 编译可以通过 dedug时出现 The inferior stopped because it received a sign
  • 阿里云 OSS介绍

    1 什么是阿里云 OSS OSS 为 Object Storage Service 即对象存储服务 是阿里云提供的海量 安全 低成本 高可靠的云存储服务 OSS 具有与平台无关的 RESTful API 接口 可以在任意应用 任意时间 任意
  • 代码重复率检查工具jsinspect 检查重复代码,去掉冗余代码。

    jscpd jsinspect npm install g jsinspect 检测复制粘贴和结构类似的JavaScript代码
  • Flutter 图片裁剪

    参考一 参考二 参考三
  • 「OceanBase 4.1 体验」|大厂开始接入的国产分布式数据库,不来了解了解?

    OceanBase 4 1 体验 前言 OCP Express在线升级功能 租户级物理备库 TP 事务处理 和AP 分析处理 优化 TP 性能优化 AP 性能优化 结尾 前言 上次我们讲了本人自己亲自上手OceanBase 4 1的初体验
  • 自动化测试实现多线程

    自动化测试实现多线程 进程 进程就是一个程序在一个数据集上的一次动态执行过程 我们编写的程序用来描述进程要完成哪些功能以及如何完成 线程 线程页脚轻量级进程 他是一个基本的CPU执行单元 是进程中的实现 线程的出现是为了降低上下文切换的小号
  • vue调试工具vue-devtools安装及使用(支持vue3版本)

    github下载地址 https gitee com h5web devtools 6 0 0 beta 15 1 下载Github源文件 devtools 6 0 0 beta 15 git clone https gitee com h
  • Blender雕刻基础:使用方法与技巧

    如何正确进入雕刻模式 1 在启动对话框界面中或是文件菜单新建项 选择Sculpting直接进入雕刻模式 选择雕刻模式默认只有Sculpting 雕刻 和Shading 着色 两个选项卡 2 如果选择的是常规 界面中的物体并不是真正用以雕刻的
  • activiti源码解析系列8 - 任务完成命令类

    我们在完成任务的时候都执行了哪些操作呢 主要涉及删除表 默认非级联 ACT RU TASK ACT RU IDENTITYLINK ACT RU VARIABLE 主要看一个CompleteTaskCmd protected Void ex
  • react,tsx中使用微信jssdk分享总结

    React tsx的H5项目使用企业微信JS SDK 步骤 1 配置域名 点击企业微信PC版左下角登录管理后台 应用管理 应用 设置应用主页 网页授权及JS SDK 2 引入JS SDK 在React项目内终端下载 npm install
  • go 并发的非阻塞缓存

    本节中我们会做一个无阻塞的缓存 这种工具可以帮助我们来解决现实世界中并发程序出现但没有现成的库可以解决的问题 这个问题叫作缓存 memoizing 函数 译注 Memoization的定义 memoization 一词是Donald Mic
  • ApiPost测试

    1 api接口地址 1 错误地址 2 正确地址 3 原因
  • STM32学习之温湿度检测——DHT11

    一准备材料 1 参考资料 STM32不完全手册 库函数版本 STM32F103xCDE DS CH V5 pdf STM32中文参考手册 V10 pdf DHT11 DHT11 下载链接 https pdf1 alldatasheetcn
  • 10 款超级实用的Chrome 黑科技插件

    总所周知 IE浏览器市场份额曾经占据了PC端半壁江山 如今谷歌推出的Chrome浏览器已经遥遥领先的登上了杠把子的位置 IE的市场份额在全球仅排行第三 毋庸置疑 Chrome浏览器已经成为了全球最受欢迎 用户量最多的浏览器 深受程序员的喜爱
  • amis百度前端框架,在js中使用amis写json转页面

    amis百度前端框架 在js中使用用amis写的json页面 1 在项目中使用百度 amis 的sdk做开发库 2 加载sdk中的库 amis amisRequire amis embed amisLib amisRequire amis
  • 第六届蓝桥杯java试题-九数组分数

    1 2 3 9 这九个数字组成一个分数 其值恰好为1 3 如何组法 代码如下 author Administrator 类名 Main 创建时间 2015 5 1 vesion1 0 public class Main public sta
  • 用手画了11张图终于搞明白了Git工作流,我怀疑你用的是假 Git

    号外号外 死磕 Java 并发编程 系列连载中 大家可以关注一波 死磕 Java 并发编程05 阿里面试失败后 一气之下我图解了Java中18把锁 死磕 Java 并发编程04 说说Java Atomic 原子类的实现原理 死磕 Java