
目录
- 前置知识
- Gitflow 简介
-
- 什么是 Gitflow?
- Gitflow 的作用
- Gitflow 核心分支结构
- Gitflow 流程实践
-
- 流程概述
- Gitflow 架构图
- Gitflow 工作流程图
前置知识
本文将假设你已经掌握了 Git 的基本使用方式。如果你还没有掌握 Git 的基本使用方式,本文或许不适合你,你应该先掌握学习 Git,这对后续的学习很重要。你可以在这里学习它。
Gitflow 简介
什么是 Gitflow?
Gitflow 是一种非常经典的 分支管理和发布模型,它最初由 Vincent Driessen 在 nvie 发布并广受欢迎。它特别适合管理有固定发布周期,以及需要并行开发多个功能,及需要长期维护多个版本的项目。
Gitflow 的作用
Gitflow 的核心思想是利用严格的分支模型,为不同的开发任务分配独立的分支,使得开发过程更加结构化、井井有条。它定义了主要分支和辅助分支并规定了它们之间的交互协作方式。它是一个非常强大和系统的流程,特别适合有固定发布周期,以及版本维护需求明确的中大型项目,在选择提交工作流时,应根据团队规模和项目特点来决定是否采用。
Gitflow 核心分支结构
-
长期分支
- main 主分支:作用:存放稳定,可随时部署到生产环境可运行的代码
- 分支的每一个提交,都对应一个正式的发布版本
- 不允许在此分支上直接开发
- 每一个发布版本会打上 tag 标签,如:v0.0.1
- develop 开发分支:作用:用来集成最新开发成果的集成分支,日常开发的功能最终都会集成到这个分支上,是功能开发的集线器。
- 当 develop 分支的功能达到稳定并准备发布时,会合并到 release 分支进行预发布测试
- 所有功能分支 (feature )和发布分支(release )都基于 develop 分支拉取出来
- main 主分支:作用:存放稳定,可随时部署到生产环境可运行的代码
-
临时分支
- 功能分支 feature/*:用于开发单个新功能。从 develop 分支拉出,完成后合并回 develop 分支。合并后该功能分支通常将会被被删除掉,以结束这个功能点的开发。
- 发布分支 release/*: 为发布新版本做准备,不再添加新功能。可用作部署内部预发测试服。基于 develop 分支最新提交拉出,当预发布分支也足够稳定后,会将此分支合并到 main 主分支。合并结束后,如果没有被用作测试服持续运行,可选择删除。最后 develop 会再次拉取上游 main 主分支进行同步到最新
- 热修复分支 hotfix/*:用于紧急修复生产环境中发现的Bug。从 main 主分支拉出,修复完成后合并回 main 分支 ,并需要重新打上tag标签发布修复。最后 develop 开发总分支会再次拉取上游 main 主分支进行同步修复内容。
Gitflow 流程实践
流程概述
初始新项目通常至少会具备一个远程 main 主分支,以及一个 develop 开发总集成分支。这两个分支一般由团队负责人建好。业务开发人员无需关心,就算没有 develop 开发总集成分支,那么至少也会有一个 main 主分支。后续的功能开发,都是围绕着这两个分支操作。main 主分支存储官方版本历史记录,develop 开发分支充当功能的集成分支。
- 第一步:是创建 develop 开发分支来补充默认的 main 主分支。一个简单的方法是让一个开发人员在本地创建一个空的 develop 分支并将其推送到服务器,此时两个分支内容是完全保持同步的。(如果远程默认团队负责人配置好了 develop 开发总集成分支,此步骤可以跳过):
git branch develop # 创建 develop 分支
git switch develop || git switch -c develop #切换到 develop 分支
git push -u origin develop #将 develop 分支同步推送到远程
- 第二步:feature 分支。feature 分支不是从 main 分支中分支,而是使用 develop 作为其父分支。一个 feature 完成后,就会合并回 develop 中。feature 不应直接与 main 交互。feature 分支通常是在最新的 develop 分支基础上创建的。
git switch develop //确保在最新的 develop 分支上,作为基线
git switch –c feature/login //创建并切换 feature/login 功能分支
在功能分支上进行开发
# 编写代码,多次提交
git add .
git commit -m "feat(auth): 添加用户登录接口"
git commit -m "feat(auth): 实现 JWT 令牌生成"
git commit -m "test(auth): 添加认证模块单元测试"
定期同步上游 develop 分支的更新
# 避免合并时产生大量冲突
git fetch origin #下载远程仓库所有最新的提交,但不合并。它只会更新本地的远程跟踪分支
git rebase origin/develop #变基,将当前工作区更改应用到最新版的 develop 分支基线
Gitflow 架构图
#mermaid-svg-jS2r6Csj9cjpJL2b{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jS2r6Csj9cjpJL2b .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jS2r6Csj9cjpJL2b .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jS2r6Csj9cjpJL2b .error-icon{fill:hsl(220.5882352941, 100%, 98.3333333333%);}#mermaid-svg-jS2r6Csj9cjpJL2b .error-text{fill:rgb(8.5000000002, 5.7500000001, 0);stroke:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-jS2r6Csj9cjpJL2b .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jS2r6Csj9cjpJL2b .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jS2r6Csj9cjpJL2b .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jS2r6Csj9cjpJL2b .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jS2r6Csj9cjpJL2b .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jS2r6Csj9cjpJL2b .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jS2r6Csj9cjpJL2b .marker{fill:#0b0b0b;stroke:#0b0b0b;}#mermaid-svg-jS2r6Csj9cjpJL2b .marker.cross{stroke:#0b0b0b;}#mermaid-svg-jS2r6Csj9cjpJL2b svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jS2r6Csj9cjpJL2b p{margin:0;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-id,#mermaid-svg-jS2r6Csj9cjpJL2b .commit-msg,#mermaid-svg-jS2r6Csj9cjpJL2b .branch-label{fill:lightgrey;color:lightgrey;font-family:\’trebuchet ms\’,verdana,arial,sans-serif;font-family:var(–mermaid-font-family);}#mermaid-svg-jS2r6Csj9cjpJL2b .branch-label0{fill:#111827;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit0{stroke:#17eb27;fill:#17eb27;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-highlight0{stroke:rgb(244.6428571429, 134.8571428572, 236.3571428572);fill:rgb(244.6428571429, 134.8571428572, 236.3571428572);}#mermaid-svg-jS2r6Csj9cjpJL2b .label0{fill:#17eb27;}#mermaid-svg-jS2r6Csj9cjpJL2b .arrow0{stroke:#17eb27;}#mermaid-svg-jS2r6Csj9cjpJL2b .branch-label1{fill:#111827;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit1{stroke:#aaa916;fill:#aaa916;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-highlight1{stroke:rgb(197.8906250001, 198.2265625001, 247.609375);fill:rgb(197.8906250001, 198.2265625001, 247.609375);}#mermaid-svg-jS2r6Csj9cjpJL2b .label1{fill:#aaa916;}#mermaid-svg-jS2r6Csj9cjpJL2b .arrow1{stroke:#aaa916;}#mermaid-svg-jS2r6Csj9cjpJL2b .branch-label2{fill:#111827;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit2{stroke:#e5afe3;fill:#e5afe3;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-highlight2{stroke:rgb(57.2735849057, 176.2264150944, 61.679245283);fill:rgb(57.2735849057, 176.2264150944, 61.679245283);}#mermaid-svg-jS2r6Csj9cjpJL2b .label2{fill:#e5afe3;}#mermaid-svg-jS2r6Csj9cjpJL2b .arrow2{stroke:#e5afe3;}#mermaid-svg-jS2r6Csj9cjpJL2b .branch-label3{fill:#111827;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit3{stroke:#82b7fe;fill:#82b7fe;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-highlight3{stroke:rgb(251.4880952379, 144.8571428571, 2.0119047619);fill:rgb(251.4880952379, 144.8571428571, 2.0119047619);}#mermaid-svg-jS2r6Csj9cjpJL2b .label3{fill:#82b7fe;}#mermaid-svg-jS2r6Csj9cjpJL2b .arrow3{stroke:#82b7fe;}#mermaid-svg-jS2r6Csj9cjpJL2b .branch-label4{fill:#111827;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit4{stroke:#fc1a59;fill:#fc1a59;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-highlight4{stroke:rgb(106.4461206895, 253.0538793103, 212.1853448276);fill:rgb(106.4461206895, 253.0538793103, 212.1853448276);}#mermaid-svg-jS2r6Csj9cjpJL2b .label4{fill:#fc1a59;}#mermaid-svg-jS2r6Csj9cjpJL2b .arrow4{stroke:#fc1a59;}#mermaid-svg-jS2r6Csj9cjpJL2b .branch-label5{fill:#111827;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit5{stroke:#0891B2;fill:#0891B2;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-highlight5{stroke:rgb(252.4838709678, 209.3951612903, 199.0161290322);fill:rgb(252.4838709678, 209.3951612903, 199.0161290322);}#mermaid-svg-jS2r6Csj9cjpJL2b .label5{fill:#0891B2;}#mermaid-svg-jS2r6Csj9cjpJL2b .arrow5{stroke:#0891B2;}#mermaid-svg-jS2r6Csj9cjpJL2b .branch-label6{fill:#333;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit6{stroke:hsl(100.5882352941, 100%, 68.3333333333%);fill:hsl(100.5882352941, 100%, 68.3333333333%);}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-highlight6{stroke:rgb(109.2500000001, 0, 161.5000000002);fill:rgb(109.2500000001, 0, 161.5000000002);}#mermaid-svg-jS2r6Csj9cjpJL2b .label6{fill:hsl(100.5882352941, 100%, 68.3333333333%);}#mermaid-svg-jS2r6Csj9cjpJL2b .arrow6{stroke:hsl(100.5882352941, 100%, 68.3333333333%);}#mermaid-svg-jS2r6Csj9cjpJL2b .branch-label7{fill:#333;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit7{stroke:hsl(160.5882352941, 100%, 68.3333333333%);fill:hsl(160.5882352941, 100%, 68.3333333333%);}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-highlight7{stroke:rgb(161.5000000002, 0, 52.2500000001);fill:rgb(161.5000000002, 0, 52.2500000001);}#mermaid-svg-jS2r6Csj9cjpJL2b .label7{fill:hsl(160.5882352941, 100%, 68.3333333333%);}#mermaid-svg-jS2r6Csj9cjpJL2b .arrow7{stroke:hsl(160.5882352941, 100%, 68.3333333333%);}#mermaid-svg-jS2r6Csj9cjpJL2b .branch{stroke-width:1;stroke:#0b0b0b;stroke-dasharray:2;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-label{font-size:10px;fill:rgb(11.0000000001, 34.0000000002, 0);}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-label-bkg{font-size:10px;fill:hsl(-79.4117647059, 100%, 93.3333333333%);opacity:0.5;}#mermaid-svg-jS2r6Csj9cjpJL2b .tag-label{font-size:10px;fill:#333;}#mermaid-svg-jS2r6Csj9cjpJL2b .tag-label-bkg{fill:#fff4dd;stroke:hsl(40.5882352941, 60%, 83.3333333333%);}#mermaid-svg-jS2r6Csj9cjpJL2b .tag-hole{fill:#333;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-merge{stroke:#fff4dd;fill:#fff4dd;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-reverse{stroke:#fff4dd;fill:#fff4dd;stroke-width:3;}#mermaid-svg-jS2r6Csj9cjpJL2b .commit-highlight-inner{stroke:#fff4dd;fill:#fff4dd;}#mermaid-svg-jS2r6Csj9cjpJL2b .arrow{stroke-width:8;stroke-linecap:round;fill:none;}#mermaid-svg-jS2r6Csj9cjpJL2b .gitTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jS2r6Csj9cjpJL2b :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
main
develop
feature
release
hotfix
项目初始化
创建功能分支
开始功能开发
完成新功能
新功能合并
新功能持续开发
进入发布准备
完成版本测试
正式发布 v1.0.0
同步发布代码
进入下一轮开发
线上运行
线上出现BUG
完成紧急修复
紧急修复上线v1.0.1
同步修复代码
开始下一轮开发
Gitflow 工作流程图
#mermaid-svg-3oQfGm2FLonL5PJC{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3oQfGm2FLonL5PJC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3oQfGm2FLonL5PJC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3oQfGm2FLonL5PJC .error-icon{fill:#552222;}#mermaid-svg-3oQfGm2FLonL5PJC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3oQfGm2FLonL5PJC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3oQfGm2FLonL5PJC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3oQfGm2FLonL5PJC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3oQfGm2FLonL5PJC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3oQfGm2FLonL5PJC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3oQfGm2FLonL5PJC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3oQfGm2FLonL5PJC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3oQfGm2FLonL5PJC .marker.cross{stroke:#333333;}#mermaid-svg-3oQfGm2FLonL5PJC svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3oQfGm2FLonL5PJC p{margin:0;}#mermaid-svg-3oQfGm2FLonL5PJC .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-3oQfGm2FLonL5PJC .cluster-label text{fill:#333;}#mermaid-svg-3oQfGm2FLonL5PJC .cluster-label span{color:#333;}#mermaid-svg-3oQfGm2FLonL5PJC .cluster-label span p{background-color:transparent;}#mermaid-svg-3oQfGm2FLonL5PJC .label text,#mermaid-svg-3oQfGm2FLonL5PJC span{fill:#333;color:#333;}#mermaid-svg-3oQfGm2FLonL5PJC .node rect,#mermaid-svg-3oQfGm2FLonL5PJC .node circle,#mermaid-svg-3oQfGm2FLonL5PJC .node ellipse,#mermaid-svg-3oQfGm2FLonL5PJC .node polygon,#mermaid-svg-3oQfGm2FLonL5PJC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3oQfGm2FLonL5PJC .rough-node .label text,#mermaid-svg-3oQfGm2FLonL5PJC .node .label text,#mermaid-svg-3oQfGm2FLonL5PJC .image-shape .label,#mermaid-svg-3oQfGm2FLonL5PJC .icon-shape .label{text-anchor:middle;}#mermaid-svg-3oQfGm2FLonL5PJC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3oQfGm2FLonL5PJC .rough-node .label,#mermaid-svg-3oQfGm2FLonL5PJC .node .label,#mermaid-svg-3oQfGm2FLonL5PJC .image-shape .label,#mermaid-svg-3oQfGm2FLonL5PJC .icon-shape .label{text-align:center;}#mermaid-svg-3oQfGm2FLonL5PJC .node.clickable{cursor:pointer;}#mermaid-svg-3oQfGm2FLonL5PJC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3oQfGm2FLonL5PJC .arrowheadPath{fill:#333333;}#mermaid-svg-3oQfGm2FLonL5PJC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3oQfGm2FLonL5PJC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3oQfGm2FLonL5PJC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3oQfGm2FLonL5PJC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3oQfGm2FLonL5PJC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3oQfGm2FLonL5PJC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3oQfGm2FLonL5PJC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3oQfGm2FLonL5PJC .cluster text{fill:#333;}#mermaid-svg-3oQfGm2FLonL5PJC .cluster span{color:#333;}#mermaid-svg-3oQfGm2FLonL5PJC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3oQfGm2FLonL5PJC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3oQfGm2FLonL5PJC rect.text{fill:none;stroke-width:0;}#mermaid-svg-3oQfGm2FLonL5PJC .icon-shape,#mermaid-svg-3oQfGm2FLonL5PJC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3oQfGm2FLonL5PJC .icon-shape p,#mermaid-svg-3oQfGm2FLonL5PJC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3oQfGm2FLonL5PJC .icon-shape .label rect,#mermaid-svg-3oQfGm2FLonL5PJC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3oQfGm2FLonL5PJC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3oQfGm2FLonL5PJC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3oQfGm2FLonL5PJC :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-3oQfGm2FLonL5PJC .mainStyle>*{fill:#2563eb!important;color:#fff!important;stroke:#1e3a8a!important;stroke-width:2px!important;rx:8px!important;}#mermaid-svg-3oQfGm2FLonL5PJC .mainStyle span{fill:#2563eb!important;color:#fff!important;stroke:#1e3a8a!important;stroke-width:2px!important;rx:8px!important;}#mermaid-svg-3oQfGm2FLonL5PJC .mainStyle tspan{fill:#fff!important;}#mermaid-svg-3oQfGm2FLonL5PJC .developStyle>*{fill:#0d9488!important;color:#fff!important;stroke:#115e59!important;stroke-width:2px!important;rx:8px!important;}#mermaid-svg-3oQfGm2FLonL5PJC .developStyle span{fill:#0d9488!important;color:#fff!important;stroke:#115e59!important;stroke-width:2px!important;rx:8px!important;}#mermaid-svg-3oQfGm2FLonL5PJC .developStyle tspan{fill:#fff!important;}#mermaid-svg-3oQfGm2FLonL5PJC .featureStyle>*{fill:#16a34a!important;color:#fff!important;stroke:#14532d!important;stroke-width:2px!important;rx:8px!important;}#mermaid-svg-3oQfGm2FLonL5PJC .featureStyle span{fill:#16a34a!important;color:#fff!important;stroke:#14532d!important;stroke-width:2px!important;rx:8px!important;}#mermaid-svg-3oQfGm2FLonL5PJC .featureStyle tspan{fill:#fff!important;}#mermaid-svg-3oQfGm2FLonL5PJC .releaseStyle>*{fill:#ea580c!important;color:#fff!important;stroke:#7c2d12!important;stroke-width:2px!important;rx:8px!important;}#mermaid-svg-3oQfGm2FLonL5PJC .releaseStyle span{fill:#ea580c!important;color:#fff!important;stroke:#7c2d12!important;stroke-width:2px!important;rx:8px!important;}#mermaid-svg-3oQfGm2FLonL5PJC .releaseStyle tspan{fill:#fff!important;}#mermaid-svg-3oQfGm2FLonL5PJC .hotfixStyle>*{fill:#dc2626!important;color:#fff!important;stroke:#991b1b!important;stroke-width:2px!important;rx:8px!important;}#mermaid-svg-3oQfGm2FLonL5PJC .hotfixStyle span{fill:#dc2626!important;color:#fff!important;stroke:#991b1b!important;stroke-width:2px!important;rx:8px!important;}#mermaid-svg-3oQfGm2FLonL5PJC .hotfixStyle tspan{fill:#fff!important;}
⚡ 临时特性分支
📌 长期常驻分支
🔴 线上故障拉出修复
✅ 合并修复 + 新增Tag
⬇️ 拉取 / 更新上游 main
🌱 拉取功能分支
📦 开发完成合并
🚀 拉取预发布分支
✔️ 预发稳定后合并
main生产环境 | 稳定可上线 | 打版本Tag
develop开发集成总分支 | 最新功能合集
hotfix/vX.Y.Z线上紧急故障修复
feature/*单个新功能点开发
release/vX.Y.Z版本预发布

🚵♂️ 博主座右铭:向阳而生,我还在路上! —————————————————————————————— 🚴博主想说:将持续性为社区输出自己的资源,同时也见证自己的进步! —————————————————————————————— 🤼♂️ 如果都看到这了,博主希望留下你的足迹!【📂收藏!👍点赞!✍️评论!】 ——————————————————————————————
网硕互联帮助中心


评论前必须登录!
注册