# 仓库提交与合并规范(多用户与 AI 开发必读) 本规范适用于所有开发者及其使用的 AI 编程工具。目标是保留他人的提交和业务行为,让每次修改都可审核、可追溯、可回退。开始修改前必须阅读本文件与根目录 `AGENTS.md`;需要更新生产服务器时还必须阅读 `服务器部署规范.md`。 公开仓库允许所有人 Fork、修改并提交 Pull Request(PR);直接写入本仓库仍需要协作者权限。每名开发者使用自己的账号和凭据,禁止多人共用管理员账号或把账号、密码、令牌写入代码、文档、提交信息及 PR。 ## 1. 必须遵守的规则 1. **一个任务一个分支、一个独立工作目录。** 默认分支名为 `codex/<开发者>-<任务>-<唯一编号>`。不同 AI 会话不得同时修改同一工作目录,也不得共用任务分支。 2. **通过 PR 合并到 `main`。** 禁止直接向 `main` 推送;由有合并权限的维护者在审核及验证通过后合并。 3. **禁止强制推送。** 不得使用 `--force`、`-f`、`--force-with-lease`、带 `+` 的推送 refspec 或 `--mirror` 绕过拒绝。不得删除他人分支、重建仓库或替换历史来解决冲突。 4. **保留他人工作。** 未确认归属的修改、未跟踪文件、提交和业务逻辑都不能删除或覆盖。禁止为得到“干净目录”执行 `git reset --hard`、`git clean -fd/-fdx` 或全量恢复文件。 5. **先同步,再验证,再推送。** 推送成功、没有文本冲突、测试通过,都不能单独证明没有覆盖他人的业务行为;必须审核最终差异。 6. **不能把冲突处理交给一条批量命令。** 禁止对整批冲突使用 `ours` / `theirs`,或把旧版本目录复制到新版本上。意图不明时停止该部分合并,交由相关开发者或维护者确认。 7. **已推送的提交不得改写。** 共享分支和已发布的任务分支不要 rebase、amend 或 squash 后重新推送;用新的修正提交及 merge 保留历史。维护者在 PR 页面使用平台的 squash 合并功能不属于强推,但必须满足审核要求。 8. **不夹带任务之外的改动。** 不顺手重构、恢复已删除功能、修改权限或部署配置;确有依赖变更时,在 PR 中说明必要性。 普通 Git 推送会拒绝非快进更新,但无法防止“基于最新提交,却把文件内容改回旧实现”的正常提交。因此,防止覆盖既需要保留历史,也需要检查代码含义和回归行为。 ## 2. 开工前:确认仓库、基线与隔离目录 先检查当前位置、远端、分支及现有修改,不要直接执行复制来的修改命令: ```bash pwd git remote -v git branch --show-current git status --short git fetch origin git log -5 --oneline origin/main git rev-parse origin/main ``` 记录 `origin/main` 的完整 SHA,作为本任务起始基线。确认远端确实是本项目;Fork 开发者还需核对上游仓库。浏览已有 PR,确认有没有人正在改同一模块。 如果当前目录有他人的修改,不要暂存、提交、stash、清理或覆盖它们。新建独立克隆,或在仓库内创建独立 worktree。下面的分支名和目录名仅是示例,执行前必须换成自己的唯一名称;若已经存在,换名而不是删除: ```bash git worktree add -b codex/alice-login-001 ../cangku-alice-login-001 origin/main cd ../cangku-alice-login-001 git status --short ``` 只有已经确认由自己独占且干净的工作目录,才可直接使用 `git switch -c <任务分支> origin/main`。开始编辑前再次确认实际所在目录和分支。多个独立克隆通常更便于隔离;worktree 仍共享 Git 对象和部分仓库配置,不得随意修改全局或共享配置。 ## 3. 修改与提交:仅纳入自己的任务 - 修改前阅读最新代码、调用方及相关测试,不凭历史对话或旧文件恢复整个模块。 - 共享接口、权限、数据库迁移、依赖锁文件、路由和配置是容易互相影响的区域;涉及它们时,在 PR 中标明影响范围,必要时先协调接口约定。 - 保留锁文件中其他开发者的依赖,用项目规定的包管理器生成自己的变更;不要以“重新生成”为由丢弃他人的依赖。 - 数据库迁移使用不重复的名称,兼容已有数据,不能修改已经执行的历史迁移来代替新增迁移。 - 不提交 `.env`、私钥、令牌、真实业务数据、数据库备份、`node_modules` 或无关构建产物。示例配置只使用占位值。 ### 3.1 数据表、索引与映射负载要求 开发者及 AI 新建或修改数据表、第三方数据映射、查询接口、报表或同步任务时,必须把数据库负载作为功能验收条件,不得等到上线后再补索引或限流。 1. **按真实访问路径设计索引。** 根据 `WHERE`、`JOIN`、`ORDER BY`、分页、去重和幂等键设计单列或联合索引,明确联合索引列顺序和最左匹配规则。索引列的类型、长度、字符集和排序规则必须与关联列一致。不要添加没有查询依据的重复索引,也不能以索引过多换取“可能更快”。 2. **映射关系必须稳定且可幂等。** 第三方主键、业务编码与系统主键应使用明确的标准化字段和唯一约束,需要多字段定位时建立与匹配顺序一致的联合唯一索引。禁止每次请求通过模糊匹配、字符串函数或全表扫描重建映射。 3. **提交前验证执行计划。** 在隔离的测试环境使用 `EXPLAIN`;数据库支持且确认语句安全时可使用 `EXPLAIN ANALYZE`。检查实际命中索引、预估/实际扫描行数、回表、排序和临时表情况。不得在生产库上执行高负载的 `EXPLAIN ANALYZE` 或压测。 4. **查询必须有界。** 使用限制列的字段选择和有上限的分页,大数据量优先使用基于稳定索引键的游标分页。避免 `SELECT *`、N+1 查询、无上限 `IN`、前置通配符模糊查询、对索引列包裹函数,以及没有范围条件的更新或删除。 5. **同步任务必须分批、增量和可恢复。** 通过时间水位、版本号或稳定主键做增量读取,用唯一约束与 upsert 保证幂等;设置可控的批量、并发数、查询超时、重试退避和单实例锁。禁止每次启动全量扫描、无限并发、紧循环轮询或重复后台任务。 6. **保护第三方云数据库。** 业务云库查询必须只取必要列和必要范围,并在系统库持久化必要的结果或增量水位,避免页面请求反复扫描远程大表。未获明确授权不得在第三方库执行 DDL、建索引或写入。 7. **迁移必须考虑锁表和回退。** 针对大表新增索引、变更列类型或回填数据前,评估表规模、锁等待、磁盘增长和业务窗口;采用可分步的兼容迁移,并说明回退时是否会丢数据。 8. **PR 必须附上数据库证据。** 说明表规模假设、索引定义及对应查询、执行计划摘要、扫描行数或耗时对比、同步批量/并发/超时参数、迁移与回退方式。无法获得有代表性数据时要标明限制,不得虚构性能结论。 只有功能结果正确且负载证据可接受,数据表和查询变更才算完成。无法证明索引有效、可能对中央系统库或业务云库造成高负载时,保持 PR 待审核,不得部署。 提交前逐项检查,并显式暂存文件;文件中混有不同任务时使用 `git add -p` 选择自己的改动。不要盲目使用 `git add .` 或 `git add -A`: ```bash git status --short git diff --stat git diff git add <本任务文件路径> git diff --cached --check git diff --cached git commit -m "docs: 说明本次变更目的" ``` 尖括号内容是需要替换的占位符,不要原样执行。提交信息说明修改目的,每个提交保持逻辑完整。使用自己的真实开发身份,不冒用其他开发者身份。 ## 4. 推送前:同步远端并处理并行修改 先把自己的工作整理为提交,确认没有未知的未提交修改,再执行同步。以下命令应当在自己的任务分支中执行: ```bash git fetch origin git branch --show-current git status --short git log --left-right --oneline HEAD...origin/main git merge origin/main ``` 如果远端已经有同名任务分支,还必须检查 `HEAD...origin/<任务分支>`。远端出现本地没有的提交时,先查明来源,再用 `git merge origin/<任务分支>` 合入;不允许用本地版本覆盖它。不要把新分支第一次推送时不存在的远端引用当成错误而强推。 发生冲突时: 1. 使用 `git status` 和 `git diff --name-only --diff-filter=U` 定位冲突。 2. 阅读共同基线、双方提交及调用关系,弄清楚双方改动要实现的行为。 3. 逐处整合并保留双方有效意图,同时检查相关文件中未产生文本冲突的逻辑兼容性。 4. 意图或取舍不明确时,停止处理相关冲突并请负责人确认;不得自动选择“自己的版本”。 5. 解决后显式暂存已解决的文件,确认没有未解决冲突,检查暂存差异,再完成 merge 提交。 6. 对合并后的结果重新验证,并在 PR 中说明冲突位置及处理理由。 同步完成后审核整个任务相对最新主分支的差异: ```bash git diff --check origin/main...HEAD git diff --stat origin/main...HEAD git diff origin/main...HEAD git status --short ``` 完成下节验证后才可推送: ```bash git push -u origin HEAD ``` 若推送被拒绝,重新 fetch、查看新增提交、合并、审核及验证。**拒绝不是强推授权。** 不通过修改 push 配置或反复重试危险命令绕过保护。 Fork 开发者约定 `origin` 为自己的 Fork、`upstream` 为本项目:从 `upstream/main` 创建任务分支,同步时合并 `upstream/main`,并检查自己 `origin/<任务分支>` 的更新;推送至自己的 Fork 后向本项目 `main` 发起 PR。不要将自己的 Fork 主分支误认成项目最新主分支。 ## 5. 验证要求 按改动范围执行仓库现有检查: ```bash npm --prefix backend run check npm --prefix frontend run check ``` - 后端改动运行后端检查;前端改动运行前端检查;跨端接口或共享行为改动需要两侧检查。 - 功能修复补充能检出原问题的测试;影响页面交互时验证实际操作路径;涉及接口、权限或数据迁移时验证受影响场景及已有行为。 - 仅文档变更可检查内容、链接、示例命令和 `git diff --check`,说明未运行应用测试的原因。 - 使用隔离的测试环境和数据,不为了检查连接生产数据库或执行生产迁移。 - 记录实际命令、结果和被验证的提交 SHA。失败要如实报告;无法运行的检查标记“未运行/受阻”,不能写成“通过”。 - 同步或冲突解决改变了待合并内容后,重新运行受影响的验证。旧提交上的成功结果不能证明新提交正确。 ## 6. PR 与安全合并 每个 PR 只对应一个明确任务,目标为 `main`,描述至少包含: ```markdown ## 目的与范围 - 解决的问题: - 修改的模块/文件: - 是否使用 AI 及负责开发者: ## 同步与兼容性 - 起始基线 SHA: - 最近同步的 main SHA: - 待审核任务分支 SHA: - 并行 PR、共享接口、迁移/配置影响: - 冲突及处理理由(无冲突也应说明): - 如何确认保留了其他开发者的已有行为: ## 验证 - 实际执行的命令及结果: - 未运行或失败的检查及原因: - 人工验证路径(如适用): ## 风险与回退 - 已知风险: - 回退方式和数据兼容性: ``` 合并要求: 1. 默认由至少一名非提交者的维护者或开发者审核最终差异;AI 自我复查可以辅助,但不代替独立审核。仓库所有者或管理员对明确的 PR 作出书面合并指令时,该授权可以代替独立审核,但必须在 PR 中记录授权人、授权范围和当时的最终提交 SHA。提交 AI 不得伪造授权、冒用其他账号或把模糊的日常开发指令解释为合并授权。 2. 审核需关注是否撤销他人逻辑、丢失配置/依赖、改变接口与权限、破坏已上线功能,不能只看有无冲突或测试绿灯。 3. 审核、所有者/管理员授权和检查必须对应最终待合并提交;后续新增业务代码、依赖变更或冲突解决后需要重新确认,不能沿用失效的批准。授权后仅补充不改变行为的合并记录或文档时,应在 PR 中说明并重新检查最终差异。 4. 合并前再次确认最新 `main` 已被纳入任务分支,并验证组合后的行为。其他 PR 先合并导致主分支前进时,更新本 PR、重新检查并确认审核或所有者/管理员授权仍适用于最终提交后再合并。 5. 由维护者通过仓库 PR 合并功能依次处理;同时有多个待合并 PR 时串行合并。有合并队列时使用针对最新组合提交的检查,避免两份旧验证同时放行。 6. 未解决冲突、必需检查失败、同步状态不清楚,或既无独立审核也无所有者/管理员明确授权时不得合并。授权例外不允许绕过失败检查、未解决冲突、数据库风险证据或分支保护,也不允许直接推送 `main`。 7. 合并后核对主分支结果。删除任务分支前确认已合并且无人继续使用,不删除其他开发者的分支。 ## 7. 发现误合并或代码被覆盖 先保留当前状态、记录相关提交 SHA 和影响,暂停自己受影响的后续提交,交由维护者定位问题。使用新的修复 PR 或 `git revert` 生成撤销提交,让历史可追溯。撤销 merge 提交需要维护者先确认正确的主父提交,不要盲目套用 `-m` 参数。 禁止将 `main` reset 回旧版本再强推。代码回退不会自动恢复数据库和外部状态;涉及迁移或数据变更时,需要单独验证兼容性与恢复方案。部署只能使用已合并、已验证的明确提交,并遵守实际部署授权;提交或合并代码本身不代表获准操作生产服务器。 ## 8. AI 交付前检查清单 - [ ] 已阅读本规范;当前仓库、目录、账号、任务分支和基线正确。 - [ ] 没有覆盖、清理、暂存或提交他人的未提交修改。 - [ ] 提交仅包含本任务内容,没有秘密信息、真实业务数据或无关产物。 - [ ] 涉及数据表、索引、映射、查询或同步时,已验证执行计划、数据量边界和负载控制,并在 PR 记录真实证据。 - [ ] 已同步最新主分支及远端任务分支,未强推、未改写已发布历史。 - [ ] 已逐项审核最终差异;冲突处理保留双方有效行为,疑点已确认。 - [ ] 已取得独立审核,或已在 PR 中记录仓库所有者/管理员针对最终提交的明确合并授权。 - [ ] 已完成受影响的验证,记录准确结果和提交 SHA。 - [ ] PR 已说明范围、兼容性、验证、风险和回退方法。 - [ ] 已明确报告当前状态:本地提交 / 已推送 / PR 待审核 / 已合并;没有把推送成功说成合并或部署成功。 ## 9. 文档要求与服务端强制保护的区别 本文件规定协作流程,`AGENTS.md` 提供 AI 读取入口;它们不是权限控制,不能保证每个 AI 工具自动读取或遵守。使用不自动读取这些文件的工具时,开发者必须主动提供规则。 仓库管理员应在服务端落实以下保护,并以实际设置为准:保护 `main`、禁止直接及强制推送和删除、要求通过 PR 合并、使过期审核失效、绑定真实运行的必需检查、限制合并权限、按个人发放最小权限凭据。团队可默认要求独立审核;需要允许所有者/管理员授权例外时,应确保只有真实所有者或管理员能够执行并保留可审计记录。没有真正运行的检查不能仅凭同名状态作为合并依据。 **添加本文件不等于上述保护已经启用。** 此文档变更不修改仓库权限、分支保护、CI 或生产部署;如需启用服务端限制,应由管理员单独配置并验证。