用途
Code History 用于追溯特定代码随时间的演变——它何时被引入、如何变化以及为什么变化。
适用场景:
- 理解某个函数或方法随时间的演变
- 追踪某个特定代码模式何时被引入或修改
- 查找哪个提交/PR 引入、修改或删除了某段代码
- 调查代码为何变更以及每次修订的动机
不适用场景:
- 用户想要修改代码(本技能为只读)
- 用户想要没有特定目标的通用 git log
- 用户只需要针对单行最后作者的 git blame
- 用户只想查看某个特定提交的 diff(git show 已足够)
本技能为只读。绝不修改任何文件或运行写入命令。
主要能力
该技能通过一组工具与命令来收集和分析代码历史:
| 用途 | 工具 | 命令 / 模式 |
|---|---|---|
| 搜索代码模式历史 | Bash | git log -p --all -S '<pattern>' |
| 追踪函数行历史 | Bash | git log -L :'<func>':<file> --no-patch |
| 追踪文件历史 | Bash | git log --follow --oneline -- <path> |
| 查找模式位置 | Grep | 在代码库中搜索模式 |
| 读取文件上下文 | Read | 读取周边代码以理解 |
| 将提交关联到 PR | Bash | gh pr list --search '<sha>' --state all |
使用方式
第 1 步:识别目标
解析 $ARGUMENTS 以确定要追踪的内容:
| 输入类型 | 示例 | 检测方式 |
|---|---|---|
| 代码模式 | user["type"] == "ADMIN" |
包含运算符、引号、括号 |
| 函数/方法名 | ensure_valid_state |
单个标识符,无运算符 |
| 文件路径 | src/auth/services.py |
包含 / 或文件扩展名 |
| 模糊 | 其它 | 请用户澄清 |
如果输入是函数名,使用 Grep 搜索定义模式来定位它所属的文件。
第 2 步:收集历史
首先测量历史规模:
git log --oneline --all -S '<pattern>' | wc -l
然后选择合适策略:
- 如果提交数 ≤ 30:使用
git log -p --all -S '<pattern>'读取完整历史 - 如果提交数 > 30:用
-- <file_path>或--since="1 year ago"缩小范围。如果仍然很大,聚焦最近 20 个提交,并注明较早历史已被截断。
按目标类型:
- 代码模式:
git log -p --all -S '<pattern>' - 函数:补充
git log -L :'<function_name>':<file_path> --no-patch --oneline - 文件:
git log --follow --oneline -- <file_path>
第 3 步:关联到 PR
对每个相关提交,提取 PR 引用:
- 从提交消息中:解析 PR 编号(如
(#123)、Merge pull request #123) - 通过 gh CLI(如果可用):
gh pr list --search '<commit-sha>' --state all --json number,title,url --limit 1 - 如果 gh 未安装或失败,仅依赖提交消息解析并注明。
第 4 步:分析变更
对历史中的每个提交进行分类:
| 维度 | 取值 |
|---|---|
| 变更类型 | Added / Modified / Refactored / Moved / Deleted / Restored |
| 意图 | Bug fix / Feature / Refactoring / Performance / Cleanup / Migration |
| 范围 | Targeted(提交直接针对此代码)/ Incidental(更大变更的副作用) |
从提交消息、PR 标题和 diff 上下文中确定意图。如果意图不明确,明确说明而不是猜测。
第 5 步:输出
时间线表格:
## Change History: `<target>`
| # | Date | Author | Commit | PR | Change |
|---|------|--------|--------|----|--------|
| 1 | YYYY-MM-DD | name | `abcdef1` | #N title | Added — initial implementation |
| 2 | YYYY-MM-DD | name | `abcdef2` | #N title | Modified — added validation |
| 3 | YYYY-MM-DD | name | `abcdef3` | #N title | Refactored — extracted to util |
详细分析(针对每个重要变更):
- 变更前后 diff 摘要
- 变更意图(基于提交消息/PR)
- 功能影响——行为或接口发生了什么变化
洞察(仅在历史中有直接证据支持时):
- 总结演变轨迹(例如“从 10 行辅助函数开始,经过 5 个 PR 成长为 80 行类”)
- 标记历史中发现的具体问题:被回滚的变更、对同一区域的重复修补、提交消息与实际 diff 之间的范围不匹配
- 如果同一提交触及多个相关位置,连接跨文件的相关变更
适用场景
- 代码考古与理解遗留代码
- 代码审查前的背景调查
- 定位引入 bug 或行为的提交
- 理解某段代码的设计决策历史
限制
- 本技能为只读,不修改任何文件或运行写入命令
- 不适用于通用 git log、单行 git blame 或查看单个提交 diff 的场景
- 当历史提交数超过 30 时可能需要缩小范围或截断较早历史
- 如果 gh CLI 不可用,PR 关联仅依赖提交消息解析
- 意图不明确时会明确说明,而非猜测