# Git 使用细则(团队开发版) > 本文档用于 Notes Agent 团队日常开发。目标是让三名成员可以并行开发、稳定联调,并确保 `main` 始终处于可运行状态。 > 更新日期:2026-08-30。当前远程只使用 `gitea`,功能分支不添加个人或工具名称前缀;合并门槛为相关测试、前端生产构建、文档同步和 `git diff --check` 全部通过。 ## 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 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 与文档。