Loading... # Claude Code 数据丢失问题调查与复盘 # 一、事件概述 ## 1. 事件背景 2026 年 3 月 29 日,一名用户在 GitHub 上报告了一个严重问题:其项目代码每 10 分钟被自动重置到远程 main 分支,导致未提交的更改持续丢失。用户初步怀疑是 Claude Code CLI 工具导致。 ## 2. 影响范围 ### A. 影响用户数 单个用户报告,但引发了社区广泛关注 ### B. 影响时长 约 36 小时(从发现问题到定位根因) ### C. 影响功能 未提交的代码更改被自动覆盖,开发工作反复受阻 ## 3. 严重程度 P1 级(潜在数据丢失,影响开发效率) # 二、事件时间线 ## 1. 问题发现(3 月 28 日 - 3 月 29 日) ### A. 现象描述 用户发现项目代码每 10 分钟自动回滚到远程 main 分支状态 ### B. 监控告警 Git reflog 显示 95+ 条重置记录,间隔精确为 600 秒 ## 2. 问题调查(3 月 29 日) ### A. 发现途径 用户通过 Git reflog 和 fswatch 工具追踪文件操作 ### B. 初步判断 怀疑 Claude Code 的自动同步机制导致 ## 3. 问题报告(3 月 29 日 22:12) ### A. 处理措施 用户在 GitHub 提交详细 issue,附上完整证据链 ### B. 效果评估 Claude Code 团队迅速响应调查 ## 4. 根因确认(3 月 30 日) ### A. 解决方案 确认这是用户自己构建的本地工具导致,与 Claude Code 无关 ### B. 验证结果 issue 状态更改为「not planned」,标题更新为「My automated tool...」 ```mermaid sequenceDiagram participant U as 用户 participant CC as Claude Code participant GH as GitHub participant T as 本地工具 Note over U: 3/28-3/29 发现代码丢失 U->>U: 检查 git reflog U->>U: 使用 fswatch 监控 Note over U: 怀疑 Claude Code U->>GH: 3/29 提交 issue GH->>CC: 团队收到报告 CC->>CC: 分析二进制文件 CC->>GH: 无相关代码 Note over U: 3/30 继续调查 U->>T: 发现本地工具 T->>T: GitPython 定时任务 Note over U: 确认根因 U->>GH: 更新 issue ```  # 三、问题分析 ## 1. 直接原因 用户自己构建的自动化工具使用 GitPython 在后台每 10 分钟执行 `git reset --hard origin/main` ## 2. 根本原因(5 Whys 分析) ### A. 为什么出现这个问题? 用户编写的工具使用轮询机制同步远程代码,硬重置导致本地更改丢失 ### B. 为什么没有及时发现问题? 工具在后台静默运行,没有日志记录或用户提示 ### C. 为什么怀疑 Claude Code? 工具共享相同的工作目录,且 Claude Code 正在使用该目录进行开发 ## 3. 深层反思 - 证据误导性:工具与 Claude Code 共享 CWD,导致误判 - 编译二进制难以调试:无法通过常规方式追踪进程行为 - 危险模式使用:`--dangerously-skip-permissions` 绕过了权限确认 # 四、证据链分析 ## 1. Git reflog 证据 用户提交的 reflog 显示: ``` e8ea2c9 HEAD@{2026-03-29 22:19:09}: reset: moving to origin/main e8ea2c9 HEAD@{2026-03-29 22:09:09}: reset: moving to origin/main e8ea2c9 HEAD@{2026-03-29 21:59:09}: reset: moving to origin/main ... ``` 每 10 分钟一次的精确间隔,跨 4 个会话共 95+ 条记录 ## 2. fswatch 文件监控 ``` 23:59:10.349 .git/refs/remotes/origin/HEAD.lock Created 23:59:10.352 .git/logs/HEAD Updated 23:59:10.354 .git/refs/heads/main.lock Created ``` 典型的 `git fetch origin` + `git reset --hard origin/main` 操作模式 ## 3. 进程监控 - Claude Code 进程是唯一拥有该目录 CWD 的进程 - 未发现外部 `git` 二进制进程被调用 - 操作通过程序内 Git 库(如 libgit2)执行 ## 4. 排除项 | 排除项 | 结果 | 说明 | |-------|------|------| | Git hooks | 排除 | 无活跃钩子 | | 用户 hooks | 排除 | 仅有音频相关钩子 | | 插件更新 | 排除 | 删除插件目录后问题仍存在 | | 云同步工具 | 排除 | 目录不在同步范围内 | | Cron/LaunchAgents | 排除 | 无相关定时任务 | | IDE/编辑器 | 排除 | nvim 在不同仓库 | | Time Machine | 排除 | APFS 快照只读 | ## 5. 二进制分析 从编译后的二进制文件中发现: - `hg1()` 函数执行 `fetch origin`,默认使用 `process.cwd()` - `io1()` 函数是 git pull 包装器 - `fileHistory` 状态追踪快照和跟踪文件 但最终确认这些函数与定时重置无关 # 五、解决方案 ## 1. 临时方案 ### A. 实施措施 - 使用 Git worktree(已确认不受影响) - 频繁提交代码保护更改 ### B. 效果评估 worktree 的 reflog 显示零条重置记录,确认主工作树是唯一受影响区域 ## 2. 永久方案 ### A. 改进措施 用户停止或修改其本地同步工具的行为 ### B. 实施计划 识别并移除或修复使用 GitPython 的本地工具 ## 3. 预防措施 - 避免使用 `--dangerously-skip-permissions` 模式 - 编写自动化工具时应添加日志记录 - 调试前应全面检查所有后台进程 # 六、经验总结 ## 1. 做得好的地方 - 用户提供了详尽的证据链(reflog、fswatch、进程监控) - Claude Code 团队快速响应并提供了排查思路 - 用户持续调查最终找到真实原因 ## 2. 需要改进的地方 - 本地工具缺少可见性和日志记录 - 使用危险模式时应更谨慎 - 初步调查时应更全面排查所有可能因素 ## 3. 社区反应 该 issue 获得了大量关注: - 16 个点赞 - 57 个笑脸反应 - 27 个关注 - 被 Hacker News 等技术社区讨论 # 七、相关案例 该问题与以下历史 issue 相关: 1. Issue #8072:代码修订被反复回滚 2. Issue #7232:Claude 未经授权执行 git reset --hard 3. Issue #32793:claude install 破坏项目 git remote URL 这些案例都涉及 Git 操作导致的数据丢失,但本次事件最终确认与 Claude Code 无关。 *** ## 参考资料 1. [GitHub Issue #40710: My automated tool is running git reset --hard origin/main in my project every 10 minutes](https://github.com/anthropics/claude-code/issues/40710) 最后修改:2026 年 03 月 31 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏