在游戏中,版本控制将按照以下规则进行格式化:
对游戏影响较大的主要版本发布。示例如下:
更新无法通过热修复完成,必须经过 Google Play Store / App Store 审核流程 的内容。
更新涉及不兼容的改动,需要进行补丁或数据迁移。
标准的小版本更新,仅包含较小的改动,例如:
需要尽快发布的紧急更新,例如:
游戏版本号将根据游戏中的改动进行更新。 版本号格式如下:
xx.yy.zz
不同类型更新对版本号的影响如下:
示例:
2.5.2 → 3.0.0
示例:
2.5.2 → 2.6.0
示例:
2.5.2 → 2.5.3
版本号升级规则:
flowchart LR
A["当前版本 xx.yy.zz"]
A -->|"UAT:xx + 1
yy=0, zz=0"| B["新版本 (xx+1).0.0"]
A -->|"Hotfix:yy + 1
zz=0"| C["新版本 xx.(yy+1).0"]
A -->|"Urgent:zz + 1"| D["新版本 xx.yy.(zz+1)"]
Git 访问需要严格规则,以确保项目稳定性。
在版本规划确认后,由负责人(Project Manager)创建一些标准分支。
仓库中最重要的分支。
该分支必须完全对应当前对外发布的版本。
规则:
用于存储等待审核的最新主要版本。
目的:
防止在应用仍处于审核状态时出现紧急问题。 (如果审核期间合并到 master,将无法获取干净的公开版本)
规则:
如果审核失败:
用于存储即将发布的主要版本。
命名格式:
UAT/版本号
例如:UAT/2.0.0
规则:
用于存储即将发布的小版本更新。
命名格式:
Hotfix/版本号
例如:Hotfix/1.2.0
规则:
用于存储紧急版本更新。
命名格式:
Urgent/版本号
例如:Urgent/1.1.2
规则:
用于在功能本地开发完成后进行集成测试。
规则:
说明:
由于该分支不是由负责人严格维护,如果仓库出现问题:
负责人可以:
用于开发的短生命周期分支。
命名方式:
团队可自行决定,只要清晰易懂。
规则:
开发流程:
每次发布新版本后,需要进行分支合并以避免改动被覆盖。
一般规则:
将改动合并到所有更高版本的分支
例如:
1.1.2 < 1.2.0 < 2.0.0 < 3.0.0
Master / Review / Develop 的规则略有不同。
当 Google Play Store 和 App Store 审核通过并正式发布后:
Review → Master
测试通过后:
如果不需要审核:
UAT → Master
如果需要审核:
UAT → Review
同时需要合并到更高版本的 UAT 分支
示例:
UAT/2.0.0 → UAT/3.0.0
测试通过后:
Hotfix → Master
同时需要合并到:
示例:
Hotfix/1.1.0 → Hotfix/1.2.0
测试通过后:
Urgent → Master
同时需要合并到:
示例:
Urgent/1.1.1 → Urgent/1.1.2
短生命周期开发分支。
流程:
Local → UAT / Hotfix / Urgent
取决于该功能要进入哪个版本。
维护建议:
版本发布后的合并顺序
flowchart LR
A[Urgent/1.1.2] --> B[更高版本 Urgent 分支]
A --> C[所有 Hotfix 分支]
A --> D[所有 UAT 分支]
A --> E[Master]
F[Hotfix/1.2.0] --> G[更高版本 Hotfix 分支]
F --> H[所有 UAT 分支]
F --> I[Master]
J[UAT/2.0.0] --> K[更高版本 UAT 分支]
J --> L[Review(若需要审核)]
J --> M[Master(若无需审核)]
分支体系概览
flowchart TB
Master["Main / Master
线上公开版本"]
Review["Review
审核中的主要版本(可选)"]
subgraph ReleaseBranches["发布分支(按类型)"]
direction TB
UAT["UAT/x.y.z
主要版本候选"]
Hotfix["Hotfix/x.y.z
小版本候选"]
Urgent["Urgent/x.y.z
紧急版本候选"]
end
Develop["Develop
集成测试(可选)"]
Local["Local/*
短生命周期开发分支"]
UAT -->|"拉出开发分支"| Local
Hotfix -->|"拉出开发分支"| Local
Urgent -->|"拉出开发分支"| Local
Local -->|"PR/MR 合并"| UAT
Local -->|"PR/MR 合并"| Hotfix
Local -->|"PR/MR 合并"| Urgent
Urgent -->|"同步版本"| Hotfix
Urgent -->|"同步版本"| UAT
Hotfix -->|"同步版本"| UAT
UAT -->|"可选:同步/合并到"| Develop
Hotfix -->|"可选:同步/合并到"| Develop
Urgent -->|"可选:同步/合并到"| Develop
UAT -->|"无需审核:测试通过后合并"| Master
UAT -->|"需要审核:测试通过后合并"| Review
Review -->|"审核通过并发布后合并"| Master
Hotfix -->|"测试通过后合并"| Master
Urgent -->|"测试通过后合并"| Master
当在合并过程中遇到冲突时:
由 负责人最终决定处理方式
冲突处理流程
flowchart TD
A[发生合并冲突] --> B[通知相关人员<br/>冲突另一侧作者 + 负责人]
B --> C{冲突是否简单<br/>且你有把握?}
C -->|是| D[自行解决冲突]
D --> E[通知相关人员:已解决方案与原因]
C -->|否| F[与另一侧作者协作解决]
F --> G{能否达成可行方案?}
G -->|是| E
G -->|否| H[由负责人最终决策解决方案]
在使用 Local 分支进行开发时,开发者需要确保从各个仓库拉取的版本是同步的。
例如:
如果 config 仓库是在 server 仓库之后一周才拉取,则数据可能无法保持一致,从而导致一些不可预期的错误。
为了确保本地测试不会出现问题:
在进行测试之前,请确保所有相关仓库都已经合并到最新版本。
对于 Git 无法自动解决的冲突,需要由负责人来处理冲突。
如果在开发过程中遇到问题,可以将情况提出来讨论,以寻找最合适的解决方案。
不同类型的仓库,遇到冲突的概率和类型可能不同。
发生冲突的可能性较低。
通常情况下不会遇到严重的合并问题。
问题 1 和问题 2 都比较容易出现。
需要注意:
问题 1:确保不同仓库之间的版本保持同步,以避免不必要的问题。
问题 2:可以将一些在不同功能开发中经常需要修改的公共配置文件单独提取出来,并存放在文件存储服务器中统一管理。
当发生冲突时,负责人可以:
从服务器拉取最新版本的文件
用该版本来解决冲突
这样可以确保所有必要的修改仍然会保留在游戏中,同时减少配置冲突带来的问题。
如果这种方法在实际操作中存在困难,也可以再寻找其他方式来解决配置文件的冲突问题。
问题 1 和问题 2 都可能发生。
需要注意:
问题 1:确保仓库版本同步,避免不必要的问题
问题 2:比较容易发生冲突的部分包括:
Scenes
Effects
这些问题可以通过提前规划修改内容来降低风险,避免多人同时修改相同内容。
通常情况下:
对于 问题 2:
大多数情况下冲突可以通过以下方式解决:
Git 自动合并
或者在稍微复杂的情况下,由负责人进行少量干预即可解决。
问题 1 和问题 2 都比较容易出现。
需要注意:
问题 1:确保仓库版本同步,避免不必要的问题
问题 2:大多数情况下冲突比较容易解决
但必须确保解决方式是正确的。
例如:
如果在 Resource enum 中:
Silver = 3
Gold = 3
那么相关开发人员需要协商决定哪一个需要修改为 4,以避免枚举值冲突。
各负责人之间进行讨论
规划项目时间线
项目经理创建新的 Milestone
项目经理将新的 Ticket 加入到该 Milestone 中
项目经理尽可能详细地填写 Ticket 的描述内容
策划开始进行功能设计
更改 Ticket 状态为:Designer WIP
策划与开发人员和美术一起讨论该功能,以确认具体细节
策划整理并最终确认设计文档,并发布设计文档
更改 Ticket 状态为:Designer Completed
美术根据设计文档开始制作相关资源
更改 Ticket 状态为:Artist WIP
美术完成该功能所需的所有美术资源
更改 Ticket 状态为:Artist Completed
开发人员根据设计文档和美术资源开始开发该功能
更改 Ticket 状态为:Dev WIP
开发人员完成该功能的全部开发,包括美术资源与配置
更改 Ticket 状态为:Dev Completed
策划确认该功能是否符合设计文档
更改 Ticket 状态为:Designer Verified
美术确认该功能是否符合提供的美术样例
更改 Ticket 状态为:Artist Verified
准备所有必要的 Merge Request,并等待所有相关仓库完成合并
更改 Ticket 状态为:Ready To Test
QA 开始对该功能进行测试
更改 Ticket 状态为:Test In Progress
QA 根据发现的问题创建新的 Bug Ticket
更改 Ticket 状态为:Test Failed
(如果没有问题则跳过此步骤)
QA 确认该功能已完全完成并符合要求
更改 Ticket 状态为:Test Completed
项目经理将改动部署到 **生产环境 更改 Ticket 状态为:Deployed
功能生命周期概览
flowchart LR
A[规划阶段] --> B[设计阶段]
B --> C[制作阶段]
C --> D[集成阶段]
D --> E[测试阶段]
E --> F[发布阶段]
E -->|发现问题| C
按角色划分的详细工作流程
flowchart LR
subgraph PM[项目经理]
A[负责人讨论]
B[规划时间线]
C[创建 Milestone]
D[创建 Ticket 并填写描述]
Z[部署到生产环境 - 状态:Deployed]
end
subgraph Designer[策划]
E[开始功能设计 - 状态:Designer WIP]
F[与开发人员和美术讨论细节]
G[完成设计文档 - 状态:Designer Completed]
H[根据设计文档验证功能 - 状态:Designer Verified]
end
subgraph Artist[美术]
I[开始制作美术资源 - 状态:Artist WIP]
J[完成所有美术资源 - 状态:Artist Completed]
K[验证美术实现是否正确 - 状态:Artist Verified]
end
subgraph Developer[开发者]
L[开始功能开发 - 状态:Dev WIP]
M[完成包含美术与配置的功能 - 状态:Dev Completed]
end
subgraph QA[测试]
N[准备 Merge Requests - 状态:Ready To Test]
O[开始测试功能 - 状态:Test In Progress]
P{是否发现问题?}
Q[创建 Bug Ticket - 状态:Test Failed]
R[确认功能完成 - 状态:Test Completed]
end
A --> B
B --> C
C --> D
D --> E
E --> F
F --> G
G --> I
I --> J
J --> L
L --> M
M --> H
H --> K
K --> N
N --> O
O --> P
P -->|是| Q
Q --> L
P -->|否| R
R --> Z
典型工作流:从 Local 到发布
sequenceDiagram
participant Dev as 开发者(Dev)
participant Local as Local/*
participant Rel as UAT/Hotfix/Urgent
participant Review as Review(可选)
participant Master as Master
alt 开发
Dev->>Local: 开发 & 提交 commits(只在 Local)
Local->>Rel: 发起 PR/MR(Local -> 目标版本分支)
Rel-->>Dev: Code Review / 修改建议
Dev->>Local: 提交修复 commits(只在 Local)
Local->>Rel: 更新 PR/MR(Local -> 目标版本分支)
end
alt 测试
Rel-->>Rel: 测试
Rel-->>Dev: 反馈问题(测试未通过)
Dev->>Local: 回到 Local 修复并继续提交
Local->>Rel: 推送更新(更新同一个 PR/MR)
Rel->>Rel: 重新测试
end
alt 发布
Rel->>Review: 合并(UAT -> Review)
Review->>Master: 审核通过并发布后合并(Review -> Master)
else 不需要审核(或 Hotfix/Urgent)
Rel->>Master: 测试通过后合并(目标分支 -> Master)
end