行者孙Python

单机篇-Day8|后悔药:git reset 回退版本,误删 / 改错怎么办

📖 知识点

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 三种模式(核心)

 

模式命令作用生活比喻
软回退

git reset --soft ID

只动版本库,改动留在暂存区把档案抽出来,稿子还在信封里
默认 / 混合

git reset ID

回退版本,改动回到工作区档案和信封都收走,草稿在桌上
硬回退

git reset --hard ID

全部回到旧版本,改动全丢彻底倒带,之后改动全没

4. 最常用的 --hard(彻底回退)

git reset --hard 7a8b9c0

 

运行示例:

HEAD is now at 7a8b9c0 项目正式纳入Git管理

 

--hard 把代码彻底回到 7a8b9c0 这个版本,之后的所有改动都会消失。⚠️ 会丢改动,用前想清楚。

⚠️ 易错提醒

  1. git reset --hard ID 会丢弃该版本之后的改动,别乱用

  2. 回退前先 git log --oneline 记下要回到的版本 ID

  3. --soft 不丢改动、--hard 丢改动;想留改动别用 --hard

⚔️ 剧情 Kata 实战任务

任务需求:

  1. 当前仓库里有几次提交(用 git log 查看)

  2. 模拟 "改坏代码":修改外卖 App.py,提交一个坏版本

  3. 用 git log 找到 "能用的版本"ID

  4. 用 git reset --hard 那个ID 回退,代码回到可用状态

  5. 用 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: 增加外卖下单功能
...

 

💡 完成动作示意:

  1. 提交了 "坏代码" 版本(d8e9f0a)

  2. git log --oneline 看到最新是坏版本

  3. git reset --hard c5d6e7f 回到 "添加.gitignore" 那个可用版本

  4. git log --oneline 里坏版本消失了,代码回到可用状态 —— 后悔药见效!

🧠 思考题

  1. git reset --hard ID 会丢弃什么?为什么用它前要先 git log 看清版本 ID?

  2. --soft、默认、--hard 三种回退,对 "改动" 的处理有什么不同?想 "保留改动回退版本" 该用哪种?

‹ 返回目录
🏠首页 Python 📦资源 👤关于我