---
title: "W03 上机练习二：投资研报的 Git 管理"
---

# 🧪 练习二：投资研报的 Git 管理

[上机导航](https://ai.lingnan.top/materials/2026-autumn/w03/lab-manual) · [常见问题](https://ai.lingnan.top/materials/2026-autumn/w03/faq)

这个练习反过来：不是从空文件夹开始，而是拿到一个已经有初稿的月度策略研报项目（宏观与行业数据为真实公开数据，配置判断为练习设定），自己给它开启版本记录，把初稿存档。然后按项目里 `CLAUDE.md` 的规则做两件事，分开提交：更新宏观数据；下调新能源板块评级。用 `git log --oneline` 看历史，读一次 diff。接着收到一份“补贴政策延续”的通告，评级下调的依据不成立了，用 `git revert` 只撤销那一条提交，宏观数据的更新不受影响，历史里两条都在。

与数据简报练习的对照：那边的 `.gitignore` 是白名单（先挡一切，再放行 `.md`、`.html`），这边是黑名单（默认记录一切，逐条列出不记录的原始数据文件夹 `宏观与行业数据/`、交付稿文件夹 `交付稿/` 等）。两种写法都让原始数据留在仓库外，只记录你和 AI 一起改出来的原稿；哪种合适，看你更容易数清“该记录的”还是“不该记录的”。项目文件夹的名字也照第一步的原则起：`宏观与行业数据/` 只读不进仓库，`研报草稿/` 由 Git 跟踪，`交付稿/` 不进仓库。

步骤、可以说的话和每步自查都在 `材料包/02_投资研报/练习说明.md`，照它做，另建一个项目文件夹，不和数据简报混在一起。做完 `git log --oneline` 应有 5 行，其中一条是撤销。

## 🎬 讲解录播

<video controls preload="metadata" playsinline style="display:block;width:100%;aspect-ratio:16/9;background:#000;border-radius:10px" src="/course-materials/2026-autumn/w03/media/ex2-demo.mp4"></video>

时长 7 分 19.80 秒，带讲解和字幕。播放器右下角可以全屏。

### 分段导览

点击时间会打开视频对应位置，不是同页播放器内跳转。导言之外，左侧节点对应五步操作。

| 时间 | 步骤 | 看什么 |
| --- | --- | --- |
| [0:00](/course-materials/2026-autumn/w03/media/ex2-demo.mp4#t=0.000000) | 导言 | 已有初稿的研报项目、要解决的问题、五步流程和观看重点 |
| [0:59](/course-materials/2026-autumn/w03/media/ex2-demo.mp4#t=59.333333) | 初稿存档 | 读项目规则，开启版本记录；核对忽略范围，初稿四个文件存档 |
| [2:38](/course-materials/2026-autumn/w03/media/ex2-demo.mp4#t=158.200000) | 分开提交 | 更新 8 月宏观三项、改评级，分成两次提交；每次提交前核对再确认 |
| [4:19](/course-materials/2026-autumn/w03/media/ex2-demo.mp4#t=259.233333) | 读差异 | 用 git show 看评级那一条：一行删、一行加，没有夹带宏观数据 |
| [4:51](/course-materials/2026-autumn/w03/media/ex2-demo.mp4#t=291.233333) | 精准撤销 | 收到教学模拟通告，先审方案，再用 revert 只撤销评级、保留历史 |
| [6:04](/course-materials/2026-autumn/w03/media/ex2-demo.mp4#t=364.266667) | 更新理由 | 按通告更新理由并提交；回看五条历史和最终研报 |

### 录播说明

- 视频使用 WorkBuddy 图形界面；步骤和可以说的话见材料包里投资研报的练习说明。规则文件采用明确读取并复述，不仅凭文件名假定生效。
- 为了单独观察精准撤销，本片只让评级那一行变化，摘要和“与上月相比的调整”段没有联动修改；真实写研报时要一并处理。
- 等待与操作间停顿已压缩，讲解画面有停留。本片最终有五次提交，下调和撤销都保留，工作区干净；各次编号以真实历史为准。


> 研报里的宏观与行业数据是真实公开数据（国家统计局、中国人民银行、申万宏源研究，来源见项目里的 `宏观与行业数据/数据来源说明.md`）。行业配置判断、第三步的政策通告是课堂练习设定，不构成投资建议。

## 目标

你会拿到一个已经有初稿的月度策略研报项目。练习结束时，你应该做到：

- 把一个已有文件的项目放进 Git，并确认原始数据不在记录范围内；
- 让 Claude Code 把“更新数据”和“修改判断”作为两次独立提交存档，提交前先看它报告的改动；
- 用 `git log --oneline` 看历史，读懂一次 diff；
- 政策变了，用 `git revert` 只撤销其中一条提交，历史保留，另一条提交不受影响。

整个过程动作交给 Claude Code，你负责看它的报告和审批。命令行你自己只要会三条：`git status`、`git log --oneline`、`git diff`。

## 开始之前

### 1. 复制项目

把材料包里的 `项目起点/` 整个复制到你放项目的地方，改名为你自己的项目名，例如 `月度策略研报/`。放在桌面、文档或你之前建的练习文件夹里都可以，一个任务一个项目文件夹。

复制后在里面新建一个空的 `交付稿/` 文件夹。打开项目检查这几样东西都在：

```txt
月度策略研报/
├── 宏观与行业数据/
│   ├── 宏观数据_202607.csv               7 月快照，初稿引用的是它
│   ├── 宏观数据_202608.csv               8 月快照，第一步要更新成它
│   ├── 行业轮动数据_202608.csv           17 个行业 7、8 月涨跌幅
│   ├── 宏观月度数据_2024-2026.csv        完整序列，本练习不用
│   ├── 行业月度涨跌幅_2024-2026.csv      完整序列，本练习不用
│   └── 数据来源说明.md                   每个数字从哪来、怎样引用
├── 研报草稿/
│   └── 月度策略_202608.md
├── 交付稿/                               你自己建的空文件夹
├── CLAUDE.md
├── README.md
└── .gitignore                            隐藏文件，见下一段
```

`.gitignore` 以点开头，Finder 和资源管理器默认不显示，复制时容易漏掉。用 VS Code 或 WorkBuddy 的工作空间文件树能看到它；如果确认它没被复制过来，就把材料包里的 `gitignore_内容.txt` 复制到项目根目录，让智能体改名为 `.gitignore`，内容一字不改，再初始化仓库。

先读一遍 `CLAUDE.md`，尤其是“Git 工作流”一节。接下来 Claude Code 的每一步动作都受这几条规则约束，你可以对照检查它有没有照做。

### 2. 在项目里启动智能体

用 WorkBuddy 时，新建任务并选择 `月度策略研报/` 作为工作空间，沿用当前“均衡”模式和默认权限。先明确让它读取并复述根目录 `CLAUDE.md` 的文件约定和 Git 工作流，再发送下面的指令。提交和撤销必须在报告范围与风险后停下，等你发出下一条确认消息再执行；这是一项协作约定，不是系统逐次审批。WorkBuddy 的“查看变更”可能将文件整篇显示为绿色，看本练习的差异要让它展示实际 `git diff`／`git show` 结果。

用 Claude Code 时，用 VS Code 打开项目文件夹，在集成终端里输入 `claude` 启动。检查当前权限模式，不要开启自动放行；会改文件或仓库的操作按实际授权提示审批。下文自然语言指令两条路线都可使用，WorkBuddy 不照搬 Claude Code 的终端入口和 Yes／No 提示。

### 3. 初始化仓库，确认忽略规则

对 Claude Code 说：

```txt
这个项目还没有 Git 仓库。请在当前目录执行 git init，然后告诉我：按现在的 .gitignore，哪些文件会被记录、哪些会被忽略。先不要提交。
```

它会请求执行 `git init`，允许。等它报告完，核对两点：

- 会记录的应该是 `CLAUDE.md`、`README.md`、`.gitignore` 和 `研报草稿/月度策略_202608.md` 四个文件；
- `宏观与行业数据/` 下的六个文件都不在记录范围内。

如果它把 `宏观与行业数据/` 列进了要记录的文件，先别往下走，检查 `.gitignore` 是否在项目根目录、文件名有没有拼错。

也可以在 VS Code 左侧“源代码管理”面板里看一眼：未跟踪的文件列表里应该没有 `宏观与行业数据/`。

### 4. 首次提交：初稿存档

```txt
确认无误。请把这些文件全部提交，备注写“初稿存档”。提交前把要提交的文件列出来让我确认。
```

它列出文件、你确认、它请求执行 `git commit`、你允许。

**✅ 自查**

- 在终端输入 `git log --oneline`，应该有 1 行，备注是“初稿存档”。
- 输入 `git status`，应该显示工作区干净（英文提示是 `nothing to commit, working tree clean`），并且没有提到 `宏观与行业数据/`。
- 在 VS Code 里打开 `宏观与行业数据/宏观数据_202608.csv`，文件名应该是灰色的，表示它被忽略。

## 第一步：两步分开提交

初稿的宏观部分引用的是 7 月数据，8 月数据已经到了；同时要把电力设备（新能源）的判断从“维持超配”改为“下调至标配”。按 `CLAUDE.md` 的规则，这是一次数据更新和一次内容修改，要分两次提交。

对 Claude Code 说：

```txt
先确认当前工作区干净。

然后做两步修改，分开提交，每一步提交前先列出改动让我确认：

第一步：打开 研报草稿/月度策略_202608.md，把“一、宏观经济”里的 CPI、PPI 和制造业 PMI 三项更新为 宏观与行业数据/宏观数据_202608.csv 中 2026-08 的值，括号里的发布日期也按该文件改，数据来源那一行改成 8 月的文件。GDP、M2、社融和其他段落不动。改完后单独提交，备注写“更新 8 月宏观数据：CPI、PPI 和制造业 PMI”。

第二步：把“三、行业轮动建议”表格里电力设备（新能源）那一行的配置建议从“维持超配”改为“下调至标配”，理由改为补贴退坡预期。其他行业不动。改完后单独提交，备注写“下调电力设备（新能源）评级至标配，依据补贴退坡预期”。

两次提交都完成后，显示最近 5 次存档记录让我确认。
```

它会按顺序做：看状态 → 改数据 → 报告改动 → 等你确认 → 提交 → 改判断 → 报告改动 → 等你确认 → 提交 → 显示历史。

每次它报告改动时，对照检查：

- 第一次报告里应该有三处数字：CPI 0.5% 改为 0.8%，PPI 3.5% 改为 3.8%，制造业 PMI 49.2% 改为 49.8%，加上数据来源那一行的文件名；不应该出现电力设备那一行，也不应该动 GDP 和 M2。
- 第二次报告里应该有电力设备（新能源）那一行，不应该再碰宏观部分。

如果它想把两处修改放进一次提交，或者第一次就把电力设备也改了，直接告诉它“分开，先提交宏观数据那部分”。

**✅ 自查**

- `git log --oneline` 应该有 3 行，从上到下是：下调电力设备、更新宏观数据、初稿存档。
- `git status` 应该干净。
- 打开 `研报草稿/月度策略_202608.md`，宏观部分的 CPI 是 0.8%、PPI 是 3.8%、PMI 是 49.8%，数据来源写的是 `宏观数据_202608.csv`；表格里电力设备（新能源）一行是“下调至标配”。
- `宏观与行业数据/` 里的文件没有被改动过。

## 第二步：看历史，读一次 diff

先自己在终端输入 `git log --oneline`，把 3 行记录和每行前面的短编号看一遍。这个编号是提交的身份证，下一步要用。

然后让 Claude Code 把第二条提交的改动展示出来：

```txt
把“下调电力设备（新能源）评级至标配”那条提交改了什么，用 diff 显示给我看，并用一句话解释开头带减号和加号的行各是什么意思。
```

你应该看到一对行：减号那行是旧的“维持超配”，加号那行是新的“下调至标配”。除此之外没有别的改动，说明第二条提交没有夹带宏观数据的修改。

另一种看法：在 VS Code 里打开 `研报草稿/月度策略_202608.md`，左侧资源管理器最下方的“时间线”会列出这个文件的每次提交，点一条就能看到那次的前后对照。

**✅ 自查**

- 你能说出第二条提交的短编号是多少。
- diff 里改动的行数是 1 行减、1 行加。

## 第三步：政策变了，只撤销第二条提交

材料包 `后续材料/` 里有一份 `政策通告_补贴延续_教学模拟.md`：补贴政策延续到年底。这份通告是练习设定，不是真实文件，作用是给你一个撤回判断的理由。刚才下调电力设备（新能源）评级的依据不成立了，要撤回这一条修改，但宏观数据的更新要保留，而且撤回本身要留在历史里，让以后看历史的人知道发生过什么。

把通告复制进你项目的 `宏观与行业数据/` 文件夹（它是新收到的原始材料，和数据表放在一起，同样不进仓库）。

先让 Claude Code 说方案，不执行：

```txt
宏观与行业数据/ 里新收到一份政策通告（宏观与行业数据/政策通告_补贴延续_教学模拟.md），补贴政策延续到年底，刚才下调电力设备（新能源）评级的依据不成立了。

我要撤销“下调电力设备（新能源）评级至标配”那一条提交，但保留这次撤销在历史里，宏观数据的更新不能受影响。先告诉我你打算怎么做、会用什么命令、影响哪些文件，不要执行。
```

它的方案应该是：用 `git revert` 对第二条提交生成一条新的“抵消”提交，只影响 `研报草稿/月度策略_202608.md` 里电力设备那一行，第一条提交的宏观数据不动，历史里三条旧记录都还在。它应该报出要撤销的那条提交的短编号，对照你在第二步记下的编号。如果它提出 `git reset` 或者要删掉历史记录，不要同意，让它改用 `revert`。

方案没问题就放行：

```txt
可以，按这个做。撤销的备注写“撤销电力设备（新能源）评级下调：补贴政策延续”。
```

它请求执行 `git revert`，允许。撤销完成后，电力设备那一行会自动回到“维持超配”和原来的理由。但原来的理由没有提到通告，按通告把理由更新一次，再提交：

```txt
打开 研报草稿/月度策略_202608.md，确认电力设备（新能源）那一行已经回到“维持超配”，然后把这一行的理由改为“补贴政策延续至年底，四季度需求预期改善（依据 宏观与行业数据/政策通告_补贴延续_教学模拟.md）”。其他内容不动。改完后提交，备注写“电力设备（新能源）维持超配：理由更新为补贴政策延续至年底”。提交前列出改动让我确认。
```

**✅ 自查**

- `git log --oneline` 应该有 5 行，从上到下：理由更新、撤销下调、下调电力设备、更新宏观数据、初稿存档。被撤销的那条还在，没有被抹掉。
- `git status` 应该干净。
- 打开 `研报草稿/月度策略_202608.md`：宏观部分仍然是 CPI 0.8%、PPI 3.8%、PMI 49.8%，数据来源仍是 `宏观数据_202608.csv`；电力设备（新能源）一行是“维持超配”，理由里提到补贴延续。
- `宏观与行业数据/` 里的文件没有被改动过。

## 收尾（可选）

打开 `README.md`，把“版本记录：____”一行填上一句话，例如“5 次提交，见 git log；按政策通告撤销过一次评级下调”。然后让 Claude Code 提交，备注写“README：补充版本记录”。此时 `git log --oneline` 是 6 行。

## 为什么要分开提交

第三步能做得这么干净，前提是第一步分成了两次提交。撤销的最小单位是一条提交：`git revert` 抵消的是整条提交里的全部改动。数据更新和判断修改各占一条，撤销判断修改时数据更新毫发无损。

如果第一步把两处修改放进了同一条提交，第三步撤销它的时候，CPI、PPI 和 PMI 也会一起退回 7 月的旧值，你得再手动改一遍数据，历史里也多出一笔说不清的往返。一条提交对应一个明确目标，往后不管是审阅还是回退，都能按目标单独处理。

这也是 `CLAUDE.md` 里“数据更新和内容修改分开提交”这条规则的意义。Claude Code 会读取项目规则；WorkBuddy 每个新任务都先明确要求读取并复述该文件，再核对它是否照做，不能只凭文件名假定已加载。

## 与数据简报练习的对照

两个练习的 `.gitignore` 写法不同：

| | 数据简报练习 | 本练习 |
| --- | --- | --- |
| 写法 | 白名单：先忽略一切（`*`），再放行 `*.md`、`*.html`、`.gitignore` | 黑名单：默认记录一切，逐条列出不记录的 `宏观与行业数据/`、`交付稿/`、`.DS_Store`、`.claude/settings.local.json` |
| 适合 | 项目里会出现很多种临时文件、导出物，说不清有多少 | 项目结构固定，不该记录的东西数得清 |
| 风险 | 新加一种要记录的文件类型时忘了放行，文件就静默不进仓库 | 新出现一种不该记录的文件时忘了加，它就进了仓库 |

两种写法都能达到同一个目的：原始数据不进仓库，仓库里记录的是你和 Claude Code 一起改出来的原稿。哪种更合适，取决于你更容易数清“该记录的”还是“不该记录的”。

顺带一提，教材案例里的宏观数据是 `.xlsx`，这里换成了 `.csv`。CSV 是文本文件，Claude Code 能直接读，Git 也能显示它的 diff；`.xlsx` 是二进制文件，进了仓库也看不出改了哪一格。


## 做完后检查：项目里应有的文件

第二个练习（投资研报）在另一个项目文件夹里：`git log --oneline` 5 行（做了收尾是 6 行），其中一条是撤销；`git ls-files` 里没有 `宏观与行业数据/` 和 `交付稿/`；`研报草稿/` 里的宏观段已更新的 CPI、PPI、制造业 PMI 引用 8 月快照 `宏观数据_202608.csv`（GDP、M2、社融按练习要求保留原值）、新能源一行是“维持超配”且理由提到补贴延续。
