---
title: "W03 上机进阶练习：回退与换主题"
---

# 🧪 进阶练习：回退与换主题

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

做完[练习一](https://ai.lingnan.top/materials/2026-autumn/w03/lab-1)、[练习二](https://ai.lingnan.top/materials/2026-autumn/w03/lab-2)之后再做。

| 练习 | 材料 | 要求 |
| --- | --- | --- |
| 只恢复误删的一节 | `材料包/04_回退练习/练习说明.md`，解压 `回退练习.zip` 里的 `restore-lab/` | 工作区里两个文件都有未提交的改动：一个被误删了一节，一个是新草稿。用 `git restore --source=<哈希> -- <文件>` 只恢复那一节，不碰另一份草稿 |
| 说出四种状态 | 同上，`status-lab/` | 四个文件分别处于已修改未暂存、已暂存、新建未跟踪、被忽略。对照面板标记和 `git status` 说出各在哪个位置 |
| 换一个主题再做一遍 | `材料包/03_迁移主题/` | 社团活动与经费的数据表，12 个社团 × 12 个月。另建一个项目文件夹（示例名 `社团经费简报/`，原始资料文件夹 `社团经费数据/`），从第一步做起；口径说明里有一处缺报月份的处理规则，第四步在这里核 |

回退练习的两个仓库自带 `.git/`，解压后不要新建仓库，直接在里面启动 Claude Code 或打开面板看。这两个仓库是预先做好的，里面的文件夹名不按本手册的原则起，不用改。

## 回退练习：两个带历史的小仓库

> 教学模拟材料。仓库里的数据、结论与“课程助教”署名均为虚构。

`回退练习.zip` 里有两个已经带 Git 历史的小项目：

| 文件夹 | 练什么 | 用到的动作 |
| --- | --- | --- |
| `restore-lab/` | 从旧提交取回一个文件里被误删的一节，不碰另一个文件的未提交草稿 | `git restore --source=<哈希> -- <文件>` |
| `status-lab/` | 说出四个文件各自处于哪个位置（已修改未暂存、已暂存、未跟踪、被忽略） | `git status`、VS Code 源代码管理面板 |

两个仓库都由助教预先布置好“事故现场”：历史已经提交，工作区里有未提交的改动。它们的价值在 `.git/` 这个隐藏文件夹里，**不要在里面运行 `git init`**，也不要一上来就提交或放弃更改。

### 一、解压与核对

把 zip 解压到你自己的文件夹（桌面、文档都可以），得到 `restore-lab/` 与 `status-lab/` 两个文件夹。用 VS Code 打开其中一个文件夹，或在终端进入它，先核对一遍，再开始练习。

#### restore-lab

```bash
git status --short
git log --oneline
```

应看到：

```txt
 M 论文稿/introduction.md
 M 论文稿/results.md

b37a5d5 补充数据来源说明
dda9454 补充稳健性分析
6ac65d0 初稿
```

再看一眼“补充稳健性分析”那次提交里 `results.md` 的样子：

```bash
git show dda9454:论文稿/results.md
```

输出里应有一节 `## 稳健性分析`，而当前工作区的 `论文稿/results.md` 没有这一节。

#### status-lab

```bash
git status --short
git log --oneline
```

应看到：

```txt
 M 协作记录/任务说明.md
M  简报成品/简报.html
?? 协作记录/检查记录.md

0ea41b3 初始化
```

`简报成品/简报.pdf` 在文件夹里能看到，但 `git status` 不列它；加上 `--ignored` 才会以 `!!` 显示。

#### 核对不通过怎么办

- 提示 `fatal: not a git repository`：说明 `.git/` 没有跟着解压或复制过来。常见原因是复制时跳过了隐藏文件夹，或者用网盘同步过一次。重新从 zip 解压一份，不要在当前文件夹新建空仓库。
- 哈希或状态与上面不一致：说明这份仓库已经被动过（提交、放弃更改、恢复过）。重新解压一份干净的再开始。
- 中文文件名显示成 `\345\244...` 这样的转义：在终端运行 `git config --global core.quotepath false`。

### 二、restore-lab：只取回误删的那一节

#### 现场

第二次提交“补充稳健性分析”在 `论文稿/results.md` 加了一节“稳健性分析”；第三次提交“补充数据来源说明”只改了 `论文稿/data.md`。之后有人在工作区把 `results.md` 的“稳健性分析”一节删掉了，没有提交；同时 `论文稿/introduction.md` 末尾多了一段标着“（草稿）”的新内容，也没有提交。

#### 目标

把 `论文稿/results.md` 恢复成“补充稳健性分析”那次提交时的样子，`论文稿/introduction.md` 的草稿一个字都不能丢。

要做到这一点，先得从 `git log --oneline` 里找到那次提交的哈希，再用 `git restore --source=<哈希> -- 论文稿/results.md` 指定从哪次提交取、取哪个文件。不带路径的 `git restore .` 会把 `introduction.md` 的草稿一起丢掉，且找不回来。

#### 怎么做

在 `restore-lab/` 里启动 `claude`，先让它报告、不执行：

```txt
论文稿/results.md 里的“稳健性分析”一节被误删了，还没提交；论文稿/introduction.md 有一段未提交的草稿要保留。请先用 git status 和 git log --oneline 看一下现状，找出“补充稳健性分析”那次提交的哈希，告诉我你打算怎么把 results.md 恢复到那个版本，写出你会运行的命令。先不要执行。
```

它应该报告哈希是 `dda9454`，给出 `git restore --source=dda9454 -- 论文稿/results.md` 这样的方案，并说明这条命令不会碰 `introduction.md`。自己对照 `git log --oneline` 确认哈希对应的是“补充稳健性分析”而不是最新那次“补充数据来源说明”，文件路径也对，再放行：

```txt
可以，按你说的执行，然后运行 git status --short 和 git diff --stat 给我看结果。
```

#### 做对了应该看到

```bash
git status --short
```

```txt
 M 论文稿/introduction.md
```

`results.md` 不再出现在列表里，说明它与最近一次提交一致（第三次提交没有改这个文件，所以取回“补充稳健性分析”的版本后与 HEAD 相同）；`introduction.md` 仍是 ` M`，草稿还在。打开 `论文稿/results.md`，“稳健性分析”一节回来了；打开 `论文稿/introduction.md`，末尾那段“（草稿）”还在。

在 VS Code 源代码管理面板里：“更改”一组只剩 `introduction.md` 一项。点开它能看到右侧多出的草稿段落。

#### 常见错法

- 让 Claude Code 直接“恢复所有文件”或运行不带路径的 `git restore .`：`introduction.md` 的草稿会一起被丢掉，且找不回来。
- 用 `git reset --hard`：同样丢草稿，本课程不用这条命令。
- 恢复后顺手提交：这道题不要求提交；若要提交，先确认提交说明写清楚“取回被误删的稳健性分析一节”。

### 三、status-lab：四个文件各在哪个位置

#### 现场

仓库只有一次提交“初始化”。之后助教布置了四种状态，每个文件一种：

| 文件 | 状态 |
| --- | --- |
| `协作记录/任务说明.md` | 已修改，未暂存 |
| `简报成品/简报.html` | 已修改，已暂存 |
| `协作记录/检查记录.md` | 新建，未跟踪 |
| `简报成品/简报.pdf` | 被 `.gitignore` 忽略（规则是 `*.pdf`） |

#### 目标

不看上面这张表，自己从 `git status` 的输出和 VS Code 源代码管理面板判断每个文件处于哪个位置，并说出理由。

#### 怎么做

先自己看 `git status --short` 的两列标记：左列是暂存区，右列是工作区。

```txt
 M 协作记录/任务说明.md   左列空、右列 M：工作区改了，暂存区没有 → 已修改未暂存
M  简报成品/简报.html     左列 M、右列空：改动已放进暂存区 → 已暂存
?? 协作记录/检查记录.md   两列问号：Git 还没跟踪这个文件 → 未跟踪
```

`简报成品/简报.pdf` 不出现，因为 `.gitignore` 里的 `*.pdf` 把它挡在外面。运行 `git status --short --ignored` 会多出一行 `!! 简报成品/简报.pdf`。

再对照 VS Code 源代码管理面板（左侧栏的分叉图标）：

| 面板里的位置 | 标记 | 对应文件 |
| --- | --- | --- |
| “暂存的更改”一组 | M | `简报成品/简报.html` |
| “更改”一组 | M | `协作记录/任务说明.md` |
| “更改”一组 | U | `协作记录/检查记录.md` |
| 面板里不出现；资源管理器里文件名显示为灰色 | — | `简报成品/简报.pdf` |

判断完，再让 Claude Code 复述一遍作对照：

```txt
请运行 git status，然后逐个文件告诉我它处于工作区、暂存区还是未跟踪，哪个文件被 .gitignore 忽略了、是哪条规则挡住的。只报告，不要改任何东西。
```

它的答案应与你自己的判断一致。若不一致，先看 `git status` 的原始输出，再决定信谁。

#### 可以追加的两个小动作

- 打开 `协作记录/任务说明.md` 和 `简报成品/简报.html`，用 `git diff` 看未暂存的改动；已暂存的改动要用 `git diff --staged` 才能看到。体会一下两条命令的区别。
- 在面板里点 `协作记录/任务说明.md` 旁的 “+”（暂存更改），再看 `git status --short`：它从 ` M` 变成 `M `。再点 “−”（取消暂存）变回去。这两步不会改文件内容。

### 四、练完之后

- 两个文件夹用完可以删掉；再练一次就重新解压。
- 别把它们放进网盘同步的文件夹里长期保存，同步工具可能丢掉 `.git/` 里的内容。
