# 05 — Git 协作规则

> **适用**：所有 AI 和人工开发任务。分支怎么拉、什么时候合、冲突怎么处理。

---

## 分支模型

```
master ──────────────────────────────────────────→ 生产
  │
  └── test ──────────────────────────────────────→ 测试主线
  └── dev ──────────────────────────────────────→ 开发主线
        │
        ├── feature/任务编号-简短描述              → 新功能
        ├── bugfix/任务编号-简短描述               → Bug修复
        └── hotfix/任务编号-简短描述  (从 master 拉) → 紧急修复
```

### 什么时候从哪拉

| 场景 | 从哪拉 | 合回哪 |
|------|--------|--------|
| 新功能 | `dev` | `dev` |
| Bug 修复 | `dev` | `dev` |
| 紧急线上修复 | `master` | `master` + `dev`（两边都要合） |

### 分支命名

```
feature/2688-用户批量导入        ← 禅道任务号 + 功能描述
bugfix/2690-任务列表分页错误
hotfix/2691-登录验证码绕过

禁止：
feature/xxx                     ← 没任务号
zhangsan-test                   ← 没意义
dev-backup-20260603             ← 备份不是分支
```

---

## 日常操作

### 开始一个新任务

```bash
# 1. 切到 dev，拉最新
git checkout dev
git pull origin dev

# 2. 从 dev 拉分支
git checkout -b feature/任务号-功能描述

# 3. 开发...

# 4. 定期提交（不要攒到最后一次性交）
git add .
git commit -m "feat: xxx"

# 5. 推送到远程（每天至少推一次，防止本地丢失）
git push origin feature/任务号-功能描述
```

### 合并回 dev

```bash
# 1. 确保本地 dev 最新
git checkout dev
git pull origin dev

# 2. 切回自己的分支，rebase dev（让历史干净）
git checkout feature/任务号-功能描述
git rebase dev

# 如果有冲突：
#   - 逐个文件解决冲突
#   - git add <解决的文件>
#   - git rebase --continue
#   - 直到完成

# 3. 推 rebase 后的分支（需要 --force-with-lease，不是 --force）
git push --force-with-lease origin feature/任务号-功能描述

# 4. 到 Git 平台提 PR/MR 到 dev
# PR 标题：feat: 用户管理增加批量导入
# PR 描述：改了什么、怎么测试
```

### 冲突处理

```
1. git status 看哪些文件冲突
2. 打开冲突文件，找到 <<<<<<< ======= >>>>>>> 标记
3. 逐行确认保留哪边的代码
4. 删掉标记符号
5. git add <文件>
6. git rebase --continue 或 git merge --continue
7. 编译验证
```

**常见错误**：看到冲突整块接受一边，把别人的代码覆盖了。必须逐行看。

---

## AI 开发特殊规则

### AI 提交必须标注

```
feat: 用户管理增加批量导入 [AI: Claude Code]

- 新增 UserBatchImportController
- 新增 UserImportService
- 新增 import_batch 表
- 前端增加导入按钮和上传弹窗
```

**为什么**：review 时知道这是 AI 写的，检查更仔细（尤其是边界条件和安全性）。

### AI 解决冲突

AI 遇到冲突时，不能自己决定保留哪边。必须：
1. 列出冲突内容和两边来源
2. 让人类决定
3. 人类确认后再继续

### AI 禁止操作

```bash
# ❌ AI 绝对禁止
git push --force origin dev          # 强制推共享分支
git push --force origin master       # 同上
git reset --hard HEAD~10 && git push -f   # 回退远程历史
git commit --amend && git push -f    # 修改已推送的 commit
```

---

## Commit 格式

```
<type>: <简短描述> [来源标注]

类型：
  feat:     新功能
  fix:      Bug 修复
  refactor: 重构（不改功能）
  style:    格式调整
  docs:     文档
  test:     测试
  chore:    构建/依赖/工具

来源标注（AI 写的必须加）：
  [AI: Claude Code]
  [AI: Kimi]
  [AI: Codex]

正确示例：
  feat: 用户管理增加批量导入 [AI: Claude Code]
  fix: 任务列表分页总数计算错误
  refactor: 提取公共校验逻辑到 BaseService
  chore: 升级 Spring Boot 到 3.5.6

禁止示例：
  update                    ← 无意义
  fix bug                   ← 不知道修的哪个 bug
  修改                      ← 中文且无具体内容
  WIP / temp / test         ← 临时提交应该 squash 掉
```

---

## PR / MR 规范

### PR 必须包含

```markdown
## 改了什么
简要描述改动内容

## 关联任务
禅道 #2688 / 需求文档链接

## 测试方式
- [ ] 本地编译通过
- [ ] 接口测试通过
- [ ] 前端页面正常

## 契约变更
- [ ] 无接口变更
- [ ] 有接口变更 → 已更新 contract/ 目录 → 已通知前端
```

### Review 规则

- 至少一人 approve 才能合
- AI 生成的代码必须至少一人 review
- 改动超过 500 行 → 拆分 PR

---

## .gitignore 必备

```
# Java
target/
*.class
*.jar
*.war

# IDE
.idea/
*.iml
.vscode/
.settings/
.project
.classpath

# 前端
node_modules/
dist/
.env.local

# 系统
.DS_Store
Thumbs.db

# 敏感信息
*.pem
*.key
application-prod.yml  （如果有密码）
```

---

## 检查表

- [ ] 分支从正确的源头拉（功能/Bug → dev，紧急 → master）
- [ ] 分支名包含任务号
- [ ] commit message 有意义
- [ ] AI 提交标注了来源
- [ ] push 前 rebase 了 dev
- [ ] 没用 `--force` 推共享分支
- [ ] 冲突逐行解决，没整块覆盖
- [ ] PR 有描述和测试说明
