跳到主内容

course materials · 2026 秋季本科

练习二:投资研报的 Git 管理

Week 3 · 2026-09-22 · 上机材料

返回本周材料

已有初稿的研报项目:开启版本记录、数据与评级分开提交、读 diff、用 revert 只撤销一条;含 WorkBuddy 讲解录播与每步自查。

切换上机材料(4 篇)
本页目录

上机导航 · 常见问题

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

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

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

🎬 讲解录播

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

分段导览

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

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

录播说明

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

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

目标

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

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

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

开始之前

1. 复制项目

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

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

月度策略研报/
├── 宏观与行业数据/
│   ├── 宏观数据_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 说:

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

它会请求执行 git init,允许。等它报告完,核对两点:

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

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

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

4. 首次提交:初稿存档

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

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

✅ 自查

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

第一步:两步分开提交

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

对 Claude Code 说:

先确认当前工作区干净。

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

第一步:打开 研报草稿/月度策略_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 把第二条提交的改动展示出来:

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

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

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

✅ 自查

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

第三步:政策变了,只撤销第二条提交

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

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

先让 Claude Code 说方案,不执行:

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

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

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

方案没问题就放行:

可以,按这个做。撤销的备注写“撤销电力设备(新能源)评级下调:补贴政策延续”。

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

打开 研报草稿/月度策略_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、社融按练习要求保留原值)、新能源一行是“维持超配”且理由提到补贴延续。