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