Files
NotesAgentic/docs/guides/Git使用细则-团队开发版.md

626 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Git 使用细则(团队开发版)
> 本文档用于 Notes Agent 团队日常开发。目标是让三名成员可以并行开发、稳定联调,并确保 `main` 始终处于可运行状态。
> 更新日期:2026-09-01。当前远程只使用 `gitea`,功能分支不添加个人或工具名称前缀;合并门槛为相关测试、前端生产构建、文档同步和 `git diff --check` 全部通过。自动化门禁、产物和发布规则见 [CI/CD 细则](CI-CD细则-团队开发版.md)。
## 1. 仓库与远程
团队代码统一使用 Gitea
```text
remote: gitea
url: https://gitea.kronecker.cc/Kronecker/NotesAgentic.git
```
检查远程:
```powershell
git remote -v
```
正常情况下只应存在 `gitea`。不要自行增加名称相同、地址不同的远程,也不要将团队代码推送到个人公开仓库。
## 2. 分支约定
### 2.1 长期分支
| 分支 | 用途 | 规则 |
| --- | --- | --- |
| `main` | 团队集成与演示版本 | 必须可安装、可构建、可运行;禁止直接开发 |
当前阶段不额外维护 `develop`。三人团队通过短生命周期功能分支和 Gitea Pull Request 合入 `main`,减少长期分支之间的同步成本。
### 2.2 功能分支
命名格式:
```text
<类型>/<模块>-<简短描述>
```
类型:
```text
feat 新功能
fix Bug 修复
refactor 不改变功能的重构
docs 文档
test 测试
chore 构建、依赖、工程配置
hotfix main 上紧急修复
```
示例:
```text
feat/frontend-workspace
feat/agent-tool-registry
feat/retrieval-hybrid-search
fix/frontend-sse-reconnect
fix/agent-permission-timeout
docs/api-contract
chore/backend-dependencies
```
要求:
- 使用英文小写、数字和连字符;
- 分支名应表达模块和目标;
- 一个分支只处理一个主要问题;
- 不使用 `test1``new``final``xxx-dev` 等无法识别用途的名称;
- 功能合入后删除远程分支,避免长期堆积。
- 不在分支名前添加 `codex/`、成员姓名或设备名;归属由提交作者、Issue 和 PR Reviewer 表达。
## 3. 模块分工与改动边界
| 成员 | 主要目录或模块 | Review 要求 |
| --- | --- | --- |
| 吉海燕 | `frontend`、UI、Store、Service、Design Token | 跨 API Contract 时邀请范涵宇 |
| 范涵宇 | `backend` 中的 Agent、Provider、Skill、Plugin、公共 API 和工程集成 | 核心接口与跨模块变更负责 Review |
| 杨星萱 | Knowledge、Retrieval、SQLite/FTS5、Vector、RAG、Citation | 涉及前端定位时邀请吉海燕,涉及 Agent Tool 时邀请范涵宇 |
边界不是文件所有权锁。确实需要修改其他成员负责的模块时:
1. 先在群里或 Issue 中说明原因;
2. 将跨模块修改拆成容易 Review 的提交;
3. Pull Request 必须邀请对应负责人;
4. 同步更新 Contract、测试和文档。
禁止为了临时联调直接绕过其他模块的接口访问数据库、文件或 Store 内部状态。
## 4. 开始开发前
每项工作从最新的 `main` 创建分支:
```powershell
git switch main
git fetch gitea
git pull --ff-only gitea main
git switch -c feat/agent-example
```
说明:
- `git fetch` 获取远程状态,但不修改工作区;
- `git pull --ff-only` 只允许快进,避免在 `main` 上产生意外 Merge Commit
- 创建分支前先确认 `git status` 干净;
- 不要在已有未提交修改时随意切换分支。
检查:
```powershell
git status
git branch --show-current
```
## 5. 开发中的提交
### 5.1 提交原则
- 小步提交,每个提交只表达一个完整意图;
- 功能代码、测试和必要文档一起提交;
- 不提交无法运行的临时状态到共享分支;
- 不用一次提交混合前端格式化、后端功能和无关文档修改;
- 提交前检查实际 diff,不使用不加检查的 `git add .` 作为固定习惯。
推荐流程:
```powershell
git status --short
git diff
git add backend/app/agent backend/tests/test_agent_core.py
git diff --cached
git commit -m "feat(agent): 增加 Tool Registry"
```
需要提交所有确认过的修改时可以使用:
```powershell
git add -A
git diff --cached
```
`git diff --cached` 无异常后再提交。
### 5.2 Commit Message
格式:
```text
<类型>(<模块>): <简短说明>
```
示例:
```text
feat(agent): 增加 Tool 参数校验
feat(provider): 接入 Ollama Adapter
feat(frontend): 完成 Citation 定位交互
fix(retrieval): 修复 RRF 排名重复项
test(agent): 补充 Step Limit 测试
docs(api): 更新 Provider 接口契约
chore(frontend): 更新 Vite 依赖
```
常用模块:
```text
frontend
workspace
editor
search
chat
agent
provider
skill
plugin
retrieval
knowledge
api
docs
build
```
要求:
- 第一行建议不超过 72 个字符;
- 使用动词说明这次提交完成了什么;
- 不使用“修改一下”“update”“最终版”“fix bug”等模糊描述;
- 一个提交包含多个需要解释的变化时,在空行后补充正文;
- 关联 Issue 时可在正文写 `Refs #编号`,确认修复后写 `Closes #编号`
示例:
```text
feat(agent): 增加高风险 Tool 权限确认
支持 allow_once、allow_session 和 deny,并在等待期间
将 Agent Run 状态更新为 waiting_permission。
Closes #18
```
## 6. 提交前检查
### 6.1 通用检查
```powershell
git status --short
git diff --check
```
确认:
- 没有 API Key、Token、密码、真实用户笔记或个人路径;
- 没有调试输出、临时代码和无关格式化;
- 没有误删其他成员的改动;
- 新增接口同时更新了 Contract 和文档;
- 错误信息中不包含 Secret 或完整笔记正文。
### 6.2 后端检查
```powershell
cd backend
uv sync
uv run pytest
```
后端依赖变化时必须同时提交:
```text
backend/pyproject.toml
backend/uv.lock
```
### 6.3 前端检查
```powershell
cd frontend
pnpm install
pnpm build
```
前端依赖变化时必须同时提交:
```text
frontend/package.json
frontend/pnpm-lock.yaml
```
禁止同时生成或提交 npm、yarn 的锁文件。
## 7. 禁止提交的内容
以下内容不得进入仓库:
```text
backend/.venv/
backend/.uv-cache/
backend/.pytest_cache/
backend/**/__pycache__/
backend/*.egg-info/
backend/.env
frontend/node_modules/
frontend/dist/
.pnpm-store/
*.tsbuildinfo
.idea/
.vscode/
```
另外禁止提交:
- API Key、同步 Token、Cookie、私钥和 Stronghold 导出数据;
- 个人 Vault、真实笔记、音频、课堂资料和聊天记录;
- `.ainote/app.db`、本地索引、Embedding 和模型文件;
- 未经团队确认的大文件、二进制安装包和模型权重;
- 只在个人电脑有效的绝对路径;
- 临时日志和包含正文的调试数据。
发现 Secret 已经提交时,不要只删除文件后再次提交。立即通知团队,撤销或轮换凭证,并根据是否已推送决定是否清理历史。
## 8. 推送功能分支
第一次推送:
```powershell
git push -u gitea feat/agent-example
```
之后:
```powershell
git push
```
推送前确认:
```powershell
git status
git log --oneline -5
```
不要将个人功能分支强制推送到 `main`
## 9. Gitea Pull Request
功能通过 Pull Request 合入 `main`。Pull Request 标题沿用 Commit Message 风格:
```text
feat(agent): 完成基础 Agent Loop
```
### 9.1 Pull Request 描述
建议使用以下结构:
```markdown
## 改动内容
-
## 影响模块
-
## 验证方式
- [ ] 后端 pytest 通过
- [ ] 前端 build 通过
- [ ] 手动联调通过
## 接口或数据变更
- 无 / 具体说明
## 风险与恢复
-
## 关联 Issue
- Closes #
```
### 9.2 Pull Request 大小
- 优先保持在 Reviewer 可以一次理解的范围;
- 大功能按 Contract、核心实现、页面接入等阶段拆分;
- 纯机械格式化与功能修改分开;
- 如果必须提交较大 PR,在描述中提供阅读顺序。
### 9.3 Review 要求
- 至少一名其他成员 Review 后再合入;
- 公共 API、Agent、Provider、Skill、Plugin 或工程结构变更由范涵宇 Review;
- 前端交互和 Design Token 变更由吉海燕 Review
- Knowledge、Retrieval、Citation 和索引变更由杨星萱 Review;
- 作者自己不能作为唯一批准人;
- Review 意见解决后,由提出者确认或作者说明处理方式。
Reviewer 检查:
```text
功能是否符合分工与需求
依赖方向是否正确
Contract 是否同步
是否包含测试
错误与恢复是否明确
是否泄露敏感信息
是否误改其他模块
是否影响现有 Demo 流程
```
## 10. 合并策略
功能 PR 默认使用 `Squash Merge` 合入 `main`
- 一个 PR 在 `main` 中保留一个清晰提交;
- Squash Commit 标题使用规范的提交格式;
- 合并前确认 CI 或本地验证通过;
- 合并后删除功能分支。
不要在 Gitea 上选择会产生大量无意义 Merge Commit 的方式。确实需要保留多提交历史的较大集成工作,由团队讨论后使用普通 Merge。
`main` 建议在 Gitea 开启:
```text
禁止 Force Push
禁止删除分支
要求 Pull Request
要求至少 1 人批准
要求检查通过后合并
```
## 11. 同步 main
功能分支开发期间应定期同步:
```powershell
git fetch gitea
git rebase gitea/main
```
只在自己的功能分支上执行 rebase。Rebase 后如果该分支已经推送,需要:
```powershell
git push --force-with-lease
```
只能使用 `--force-with-lease`,禁止使用普通 `--force`。禁止重写其他成员正在使用的分支或 `main` 历史。
如果团队成员对 rebase 不熟悉,可以使用合并方式同步:
```powershell
git fetch gitea
git merge gitea/main
```
同一个 Pull Request 中不要反复混用 rebase 和 merge。
## 12. 冲突处理
### 12.1 Rebase 冲突
```powershell
git fetch gitea
git rebase gitea/main
git status
```
逐个打开冲突文件,理解双方修改后手工合并。处理完成:
```powershell
git add <冲突文件>
git rebase --continue
```
无法确认时终止操作:
```powershell
git rebase --abort
```
### 12.2 冲突原则
- 不使用“全部接受当前”或“全部接受传入”处理不理解的冲突;
- 涉及他人模块时联系对应负责人;
- `pyproject.toml``package.json` 冲突解决后重新生成并验证锁文件;
- API Contract 冲突需要同时检查前端 TypeScript 类型和接口文档;
- 文档冲突不能简单保留较新的文件,需要合并双方有效内容;
- 冲突解决后重新运行相关测试。
## 13. 修正提交
### 13.1 尚未推送
只修正最近一次提交:
```powershell
git add <文件>
git commit --amend
```
### 13.2 已经推送或进入 Review
优先新增修正提交:
```powershell
git commit -m "fix(agent): 修正权限超时状态"
git push
```
Reviewer 确认后由 Squash Merge 整理历史。不要为了“历史好看”随意重写其他成员已经拉取的提交。
## 14. 撤销与恢复
### 14.1 撤销已合入 main 的提交
使用 `git revert` 创建反向提交:
```powershell
git switch main
git pull --ff-only gitea main
git switch -c fix/revert-problem
git revert <commit-id>
git push -u gitea fix/revert-problem
```
随后创建 Pull Request。不要对共享 `main` 使用 `git reset --hard` 或重写历史。
### 14.2 放弃尚未提交的修改
先检查:
```powershell
git status
git diff
```
放弃修改会丢失本地内容,必须确认目标文件和影响范围。拿不准时先创建临时分支或使用 stash:
```powershell
git stash push -u -m "wip: 临时保存说明"
```
恢复:
```powershell
git stash list
git stash pop
```
Stash 只用于短期切换,不作为长期备份。
## 15. Hotfix
影响 `main` 启动、数据安全或 Demo 的紧急问题使用:
```powershell
git switch main
git pull --ff-only gitea main
git switch -c hotfix/<模块>-<问题>
```
Hotfix 仍需:
- 最小化修改范围;
- 添加回归测试;
- 至少一人快速 Review
- 合入后通知全员同步 `main`
- 后续补充问题原因和预防措施。
## 16. Issue 与里程碑
建议每项跨一天或跨模块的任务先建立 Gitea Issue,至少包含:
```text
目标
负责人
涉及模块
验收条件
依赖项
优先级
```
标签建议:
```text
frontend
backend
agent
provider
knowledge
retrieval
extension
bug
documentation
P0 / P1 / P2
```
Pull Request 关联 Issue,避免功能完成后无法对应需求和验收条件。
## 17. Release 与 Tag
比赛开发阶段使用语义化版本:
```text
v0.1.0 第一个可运行壳子
v0.2.0 第一条完整知识问答链路
v0.3.0 第一阶段 Demo 候选版本
v1.0.0 稳定交付版本
```
Tag 只从验证通过的 `main` 创建:
```powershell
git switch main
git pull --ff-only gitea main
git tag -a v0.2.0 -m "Notes Agent v0.2.0"
git push gitea v0.2.0
```
创建 Tag 前记录:
- 功能范围;
- 已知问题;
- 数据库或配置迁移;
- 测试结果;
- Demo 操作步骤。
## 18. 每日推荐流程
```text
同步 main
→ 创建或切换自己的功能分支
→ 开发并小步提交
→ 同步 main 并解决冲突
→ 运行相关测试
→ 检查 staged diff
→ 推送功能分支
→ 创建 Pull Request
→ Review 与修正
→ Squash Merge
→ 删除功能分支
→ 全员同步 main
```
常用命令汇总:
```powershell
git status --short
git fetch gitea
git switch main
git pull --ff-only gitea main
git switch -c feat/<模块>-<功能>
git diff
git add <文件>
git diff --cached
git commit -m "feat(<模块>): <说明>"
git push -u gitea <分支名>
git log --oneline --decorate -10
```
本细则的核心要求是:`main` 可运行、改动可 Review、问题可追踪、敏感信息不入库、跨模块变化同步 Contract 与文档。流水线启用后,合并和发布还必须满足 [CI/CD 细则](CI-CD细则-团队开发版.md) 中的状态检查与产物要求。