用途
该技能帮助用户在升级 SaaS Pegasus 代码库时解决 Git 合并冲突。最常见的调用场景是:用户已将主分支合并到 Pegasus 升级分支后遇到冲突,需要协助解决;也可以让技能代为执行整个合并流程。
主要能力
技能会先通过 git status 判断是否存在进行中的合并,并询问用户具体需求:是已经运行过 git merge 需要解决冲突,还是希望由技能代为执行合并,或是需要帮助判断冲突优先级。
针对不同类型的冲突文件,技能采用不同策略:
- 数据库迁移:丢弃 Pegasus 的迁移改动,保留用户版本,因为迁移文件应重新生成而非合并。对每个冲突的迁移文件执行 git checkout --theirs <migration-file>,全部冲突解决后运行 ./manage.py makemigrations。若 djstripe 被升级,还需检查应用迁移是否引用了已不存在的旧 djstripe 迁移。
- 依赖锁文件(uv.lock、requirements.txt、package-lock.json):接受 Pegasus 版本,用 git checkout --ours <lock-file> 和 git add <lock-file> 处理;源文件(pyproject.toml、requirements.in、package.json)则谨慎合并保留自定义内容。解决后立即运行 uv sync 或 npm install 重新生成锁文件,不要等到合并后步骤。
- 静态资源(static/ 下的 JavaScript/CSS 打包文件):接受任一版本,合并后运行 npm run build 或 npm run dev 重新构建。
- 配置文件(.env.example、settings 文件):谨慎合并,保留自定义内容。
- 其他文件:逐案评估,阅读双方版本后智能合并。
使用方式
若用户希望由技能执行完整合并流程,技能会:运行 git fetch 获取最新分支和提交;运行 git branch -a 查找最新的 Pegasus 升级分支(通常以 pegasus-YYYY.MM 为前缀,如 pegasus-2025.01);检查当前分支,必要时检出升级分支;运行 git pull 确保升级分支最新;确定主开发分支(通常为 main 或 master);执行 git merge <main-branch>;按上述策略处理冲突;重新同步依赖(Python 用 uv sync,JavaScript 用 npm install)。
合并完成后默认连续执行验证步骤,不中途暂停确认,除非某步骤失败或用户表示希望在推送前审查:前端安装与构建(npm install && npm run build)、Python 依赖同步(uv sync)、迁移(./manage.py makemigrations 然后 ./manage.py migrate)、测试(./manage.py test),并提交上述步骤产生的待处理变更。Docker 用户可用 make upgrade 替代构建和迁移步骤。
验证通过后默认推送分支(git push -u origin <branch-name>),并报告分支名和升级摘要,同时向用户展示推送输出中的“Create a pull request”链接。若验证步骤失败或有警告、用户此前表示希望在推送前审查、合并涉及不确定的重大判断、或存在与升级无关的本地提交,则应暂缓推送并先询问。
适用场景
适用于使用 SaaS Pegasus 框架并需要升级代码库的开发者,尤其是升级后遇到 Git 合并冲突的情况。技能也涵盖 djstripe 2.10 升级(Pegasus 2026.2.2+)的特殊处理:djstripe 2.10 将此前所有迁移压缩为 0001_initial 和 0002_2_10,需检查应用迁移是否引用已不存在的旧 djstripe 迁移(如 ('djstripe', '0012_2_8')),若有则更新依赖引用为 ('djstripe', '0001_initial'),不要删除迁移文件;许多模型字段被移除并改为通过 @property 从 stripe_data JSONField 读取,Product 上的 default_price、type 现为属性,select_related("default_price") 会失败需移除,对已移除字段使用 filter()、order_by()、values() 会失败需改用 stripe_data__<field>;迁移后需运行 ./manage.py djstripe_sync_models Product Price 重新填充 stripe_data,否则 product.default_price 等属性会返回 None;针对 dj-stripe#2038 的 RunSQL 迁移已不再需要,可清空其 operations 列表保留文件作为空操作。
限制
若用户没有 pegasus-YYYY.MM 分支,技能会引导其查阅 Pegasus 升级文档。若冲突数量过多,建议按优先级顺序审查(先迁移,再锁文件,再配置)。对用户自定义修改应保守处理,存疑时保留用户改动并记录 Pegasus 的差异。遇到不熟悉的文件类型,技能会解释冲突双方并询问用户选择。技能还建议启用 git config rerere.enabled true 以记住冲突解决方案,并提醒在 GitHub 合并 Pegasus PR 时始终使用“Create a merge commit”而非 squash 或 rebase。解决非平凡冲突时,应使用 git show HEAD:<file> 和 git show main:<file> 查看各分支的干净版本,而非直接解析冲突标记。