From 41286fca6c3210fc672bc57af0faff148f95a615 Mon Sep 17 00:00:00 2001 From: KiriAky 107 Date: Thu, 27 Aug 2026 14:30:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Git=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=BB=86=E5=88=99=E6=96=87=E6=A1=A3=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在README.md中添加了Git使用细则文档的链接 - 新增docs/Git使用细则-团队开发版.md文档,包含: - 仓库与远程管理规范 - 分支约定和命名规则 - 模块分工与改动边界 - 开发流程和提交原则 - Pull Request和Review要求 - 冲突处理和版本发布规范 ``` --- README.md | 1 + docs/Git使用细则-团队开发版.md | 622 +++++++++++++++++++++++++++++++++ 2 files changed, 623 insertions(+) create mode 100644 docs/Git使用细则-团队开发版.md diff --git a/README.md b/README.md index a5c8bb5..794865e 100644 --- a/README.md +++ b/README.md @@ -112,3 +112,4 @@ pnpm build - 跨模块接口发生变化时,需要同步更新前后端类型和 `docs` 中的接口说明。 - 当前前后端接口清单见 `docs/后端接口契约-开发版.md`,OpenAPI 以 `/openapi.json` 为准。 - 前端页面、交互、状态管理和第一阶段验收要求见 `docs/前端页面需求说明-开发版.md`。 +- 分支、提交、Pull Request、Review 和冲突处理规范见 `docs/Git使用细则-团队开发版.md`。 diff --git a/docs/Git使用细则-团队开发版.md b/docs/Git使用细则-团队开发版.md new file mode 100644 index 0000000..07e82e8 --- /dev/null +++ b/docs/Git使用细则-团队开发版.md @@ -0,0 +1,622 @@ +# Git 使用细则(团队开发版) + +> 本文档用于 Notes Agent 团队日常开发。目标是让三名成员可以并行开发、稳定联调,并确保 `main` 始终处于可运行状态。 + +## 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` 等无法识别用途的名称; +- 功能合入后删除远程分支,避免长期堆积。 + +## 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 +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 与文档。