Git 工作流与会话管理 Deep-Dive

May 22, 2026 · View on GitHub

AI Agent 如何追踪代码归属、管理文件历史、支持对话分支?本文基于 Claude Code(v2.1.89 源码分析)和 Qwen Code(v0.16.0 开源)的源码分析,对比两者在 commit attribution、文件历史快照、会话分支和输出模式方面的差异。


1. 架构总览

维度Claude CodeQwen Code
Commit Attribution✅ Co-Authored-By + 按文件字符归因 + git notes
Git Diff 统计✅ numstat + hunks 解析(50 文件 / 1MB 上限)依赖 simple-git npm
文件历史✅ per-file SHA256 快照(100 个/session)Git worktree checkpoint
会话分支✅ /branch(transcript 完整 fork + forkedFrom 溯源)
Output Styles✅ Learning(教学模式)+ Explanatory(解释模式)

2. Commit Attribution(代码归因)

2.1 Claude Code

Co-Authored-By 注入(源码: utils/commitAttribution.ts):

git commit 消息末尾自动追加:
Co-Authored-By: Claude <noreply@anthropic.com>

按文件字符归因

  • 跟踪每个文件的 claudeChars(AI 贡献字符数)vs humanChars(人类贡献字符数)
  • 通过 diff 前缀/后缀匹配计算贡献比例
  • SHA256 哈希标识文件版本

Attribution 元数据(存储在 git notes 中):

{
  "version": 1,
  "summary": { "claudeChars": 1500, "humanChars": 200 },
  "files": [
    { "path": "src/main.ts", "claudeChars": 800, "humanChars": 50, "hash": "abc123" }
  ],
  "surface": "cli/opus-4-6",
  "sessionId": "session-uuid"
}

模型名清理:内部模型名(opus-4-6-fast)在外部仓库自动清理为公开名(claude-opus-4-6),避免泄露内部代号。

2.2 Qwen Code

无 commit attribution 机制——commit 消息中不标注 AI 贡献,无法区分 AI vs 人类代码。

影响:开源项目中 AI 生成代码的透明度缺失;审计场景无法追溯。


3. Git Diff 统计

3.1 Claude Code

结构化 diff 解析(源码: utils/gitDiff.ts):

// 两阶段 diff:
// 1. git diff HEAD --numstat → O(1) 内存快速探测(文件数 + 行数)
// 2. git diff HEAD → 完整 hunks(仅在文件数不超限时)

// 限制:
MAX_FILES = 50                  // 超过 50 文件跳过详情
MAX_DIFF_SIZE_BYTES = 1_000_000 // 单文件 >1MB 跳过
MAX_LINES_PER_FILE = 400        // GitHub auto-load 限制
MAX_FILES_FOR_DETAILS = 500     // 超过 500 文件仅显示 numstat

// 特殊处理:
// - merge/rebase/cherry-pick/revert 期间跳过 diff
// - 未跟踪文件: git ls-files --others(仅文件名)
// - 单文件 diff: 与默认分支 merge-base 比较(PR 风格视图)

统计信息

  • filesCountlinesAddedlinesRemoved
  • 按文件:addedremovedisBinaryisUntracked
  • 结构化 hunks:oldStartoldLinesnewStartnewLineslines[]

3.2 Qwen Code

使用 simple-git npm 包调用 git 命令,无专门的 diff 解析器。无 numstat 快速探测、无文件数限制、无结构化 hunks 输出。


4. 文件历史快照

4.1 Claude Code

Per-file SHA256 快照(源码: utils/fileHistory.ts):

编辑前 → fileHistoryTrackEdit() → 备份原始文件
                                   ├── 计算 SHA256 内容哈希
                                   ├── 检查 mtime 避免重复备份
                                   └── 存储: {hash}@v{version}

消息完成后 → fileHistoryMakeSnapshot() → 创建快照
                                          ├── 记录所有已跟踪文件的当前版本
                                          ├── 删除的文件标记 backupFileName: null
                                          └── 快照上限: 100 个/session

恢复:按消息 ID 回滚到特定快照——比 git-level checkpoint 更细粒度。

4.2 Qwen Code

Git Worktree Checkpoint(源码: packages/core/src/services/gitWorktreeService.ts):

setupWorktrees() → git worktree add(创建独立工作副本)
                → git stash create(捕获脏状态)
                → 复制未跟踪文件
                → 创建 baseline commit

// Diff 从 baseline 开始——仅捕获 agent 变更,排除预先存在的编辑

区别:Git-level(整体快照)vs file-level(按文件版本),Qwen 的粒度更粗但与 git 生态天然兼容。


5. 会话分支(/branch)

5.1 Claude Code

// 源码: commands/branch/branch.ts
// /branch [名称] → fork 当前 transcript 为新 session

// 保留的元数据:
// - 完整消息历史(时间戳、gitBranch、parentUuid、isSidechain)
// - content-replacement 条目(prompt cache 预览)
// - forkedFrom: { sessionId, messageUuid }(溯源)

// 命名: "对话标题 (Branch)" → "(Branch 2)" → "(Branch 3)"
// 分支自动成为活跃 session;原始 session 可通过 --resume 恢复

用例

  • 探索替代实现方案而不丢失当前进度
  • A/B 对比不同架构决策
  • 从某个关键节点创建多个实验分支

5.2 Qwen Code

无会话分支功能。cache-aware 二次查询(原 forkedQuery.ts,v0.16.0 已合并入 packages/core/src/utils/forkedAgent.ts)用于 speculation/followup,不是对话分叉。


6. Output Styles(输出模式)

6.1 Claude Code

两种内置模式(源码: constants/outputStyles.ts):

模式行为
Explanatory在代码变更后添加 "Insight" 块:解释实现选择和代码库模式——"提供教育性洞察"
Learning暂停执行,要求用户编写代码——"通过动手实践学习"

Learning 模式详情

  • 对 20+ 行的函数,请求用户贡献 2-10 行设计决策/业务逻辑/算法
  • 格式:Context → Your Task → Guidance
  • 代码中插入 TODO(human) 占位符
  • 等待人类实现后继续
  • 适用场景:教学、代码审查培训、新人上手

加载优先级:built-in → plugin → user settings → project settings

6.2 Qwen Code

无内置 output style 模式。settingsSchema.ts 有通用设置框架,但未定义 Learning/Explanatory 等具体模式。


7. 对比总结

维度Claude CodeQwen Code差距
Commit Attribution按文件字符归因 + git notes缺失
Diff 统计原生解析(numstat + hunks + 限制)simple-git 库中等
文件快照per-file SHA256(100 个/session)Git worktree(整体)粒度差异
会话分支/branch + forkedFrom 溯源缺失
Output StylesLearning + Explanatory缺失

8. 关键源码文件

Claude Code

文件职责
utils/commitAttribution.tsCo-Authored-By + 按文件字符归因
utils/gitDiff.ts结构化 diff 解析(numstat + hunks + 限制)
utils/fileHistory.tsPer-file SHA256 快照 + 按消息恢复
commands/branch/branch.ts/branch 会话分叉
constants/outputStyles.tsLearning / Explanatory 输出模式

Qwen Code

文件行数职责
packages/core/src/services/gitWorktreeService.ts1,491Git worktree checkpoint(v0.16.0 大幅扩展:Phase C 含 session 持久化、hooksPath、三模式 --resume 恢复)
packages/core/src/utils/forkedAgent.tsCache-aware 二次查询(forkedQuery.ts 在 v0.16.0 已合并入此文件,非对话分叉)

免责声明: 以上分析基于 2026 年 Q1 初稿,2026-05-22 对照 v0.16.0 复核(Claude Code v2.1.89、Qwen Code v0.16.0),后续版本可能已变更。