📖 知识点
1. git reset 是什么?
git reset 可以把当前代码回退到之前的某个提交(版本),相当于 "读档回到过去"。改坏了、提交错了,都能用它回到能用的版本。
💡 生活比喻git reset 像游戏的 "读档":打 BOSS 打输了,读回打 BOSS 之前的存档重来。代码改坏了,reset 到之前提交的版本,一切回到那个 "能用的瞬间"。
2. git log 找到要回退的版本
回退前,先用 git log --oneline 找到 "想回到哪个版本":
git log --oneline
运行示例:
55e6f8a feat: 增加外卖下单功能
7a8b9c0 项目正式纳入Git管理
a1b2c3d 首次提交:创建外卖App.py
最上面的是最新提交。想回到哪个,记下它前面的ID(如 7a8b9c0)。
3. git reset 三种模式(核心)
| 模式 | 命令 | 作用 | 生活比喻 |
|---|---|---|---|
| 软回退 |
| 只动版本库,改动留在暂存区 | 把档案抽出来,稿子还在信封里 |
| 默认 / 混合 |
| 回退版本,改动回到工作区 | 档案和信封都收走,草稿在桌上 |
| 硬回退 |
| 全部回到旧版本,改动全丢 | 彻底倒带,之后改动全没 |
4. 最常用的 --hard(彻底回退)
git reset --hard 7a8b9c0
运行示例:
HEAD is now at 7a8b9c0 项目正式纳入Git管理
--hard把代码彻底回到 7a8b9c0 这个版本,之后的所有改动都会消失。⚠️ 会丢改动,用前想清楚。
⚠️ 易错提醒
git reset --hard ID会丢弃该版本之后的改动,别乱用回退前先
git log --oneline记下要回到的版本 ID
--soft不丢改动、--hard丢改动;想留改动别用 --hard
⚔️ 剧情 Kata 实战任务
任务需求:
当前仓库里有几次提交(用 git log 查看)
模拟 "改坏代码":修改外卖 App.py,提交一个坏版本
用 git log 找到 "能用的版本"ID
用
git reset --hard 那个ID回退,代码回到可用状态用 git log 和 git status 验证回退成功
参考代码(在终端依次敲)
# 0. 进仓库
cd ~/外卖App
# 1. 模拟改坏:加一行"坏代码"并提交
echo "def 坏代码(): raise 报错" >> 外卖App.py
git add 外卖App.py
git commit -m "bug: 我改坏了下单模块"
# 2. 看历史,找到"能用的版本"(假设是 c5d6e7f)
git log --oneline
# 3. 回退到能用的版本(换成你查到的ID)
git reset --hard c5d6e7f
# 4. 验证:坏代码没了,回到可用版本
git log --oneline
cat 外卖App.py
运行示例:
user@linux:~/外卖App$ git commit -m "bug: 我改坏了下单模块"
[master d8e9f0a] bug: 我改坏了下单模块
user@linux:~/外卖App$ git log --oneline
d8e9f0a bug: 我改坏了下单模块
c5d6e7f chore: 添加.gitignore忽略日志和缓存
55e6f8a feat: 增加外卖下单功能
...
user@linux:~/外卖App$ git reset --hard c5d6e7f
HEAD is now at c5d6e7f chore: 添加.gitignore忽略日志和缓存
user@linux:~/外卖App$ git log --oneline
c5d6e7f chore: 添加.gitignore忽略日志和缓存
55e6f8a feat: 增加外卖下单功能
...
💡 完成动作示意:
提交了 "坏代码" 版本(d8e9f0a)
git log --oneline看到最新是坏版本
git reset --hard c5d6e7f回到 "添加.gitignore" 那个可用版本
git log --oneline里坏版本消失了,代码回到可用状态 —— 后悔药见效!
🧠 思考题
git reset --hard ID会丢弃什么?为什么用它前要先git log看清版本 ID?--soft、默认、--hard三种回退,对 "改动" 的处理有什么不同?想 "保留改动回退版本" 该用哪种?