📖 知识点
1. 前提:文件要 "提交过" 才能找回
Git 能恢复的是之前提交(commit)过的版本。只要这个文件在某次提交里存在过,误删了就能找回来。
💡 生活比喻:git 像 "回收站 + 时光机"—— 但不是所有文件都救得回,得是你之前存过档的才算数。没提交过的文件,Git 也无能为力(就像没写过日记的日子,想不起细节)。
2. 误删未提交的文件:git restore
如果文件被删,但改动还没提交,可以用 git restore 从暂存区 / 版本库恢复:
git restore 文件名
把文件恢复到最近一次提交(或暂存)的状态。
3. 找回已提交但被删的文件:git checkout
如果文件是之前提交过的版本,误删后用 git checkout 从版本库恢复:
git checkout -- 文件名
git checkout -- 下单模块.py
--后面的文件名,从版本库恢复这个文件到最近提交的样子。
4. 找回整个 "丢失的提交":git reflog(进阶救星)
如果连提交记录都混乱了,用 git reflog 查看操作历史,找回被 reset 弄丢的提交:
git reflog
这个可以查到所有操作记录和曾经的版本 ID,用于 "复活" 被 reset 掉的提交(进阶用法,先认识)。
⚠️ 易错提醒
恢复的前提是文件之前提交过,没提交过救不回
git restore 文件名恢复未提交的删除;git checkout -- 文件名从版本库恢复恢复的是 "最近一次提交" 的版本,之后的改动会丢
⚔️ 剧情 Kata 实战任务
任务需求:
先确保 "下单模块.py" 之前提交过(git add + commit)
模拟误删:用 rm 删掉 "下单模块.py"
用
git checkout -- 下单模块.py从版本库找回验证文件回来了,内容完好
体会 "Git 时间机器" 的威力
参考代码(在终端依次敲)
# 0. 进仓库
cd ~/外卖App
# 1. 确保"下单模块.py"提交过(先建文件并提交)
echo "def 下单(): return '下单成功'" > 下单模块.py
git add 下单模块.py
git commit -m "feat: 新增下单模块"
# 2. 模拟误删(小张手滑)
rm 下单模块.py
# 3. 确认删了
ls
# 4. 用时间机器找回
git checkout -- 下单模块.py
# 5. 验证找回来了
ls
cat 下单模块.py
运行示例:
user@linux:~/外卖App$ git commit -m "feat: 新增下单模块"
[master e1f2a3b] feat: 新增下单模块
user@linux:~/外卖App$ rm 下单模块.py
user@linux:~/外卖App$ ls
外卖App.py .gitignore # 下单模块.py 不见了!
user@linux:~/外卖App$ git checkout -- 下单模块.py
user@linux:~/外卖App$ ls
外卖App.py .gitignore 下单模块.py # 回来了!
user@linux:~/外卖App$ cat 下单模块.py
def 下单(): return '下单成功'
💡 完成动作示意:
下单模块.py提交过,有存档
rm 下单模块.py误删 → ls 里不见了
git checkout -- 下单模块.py从版本库恢复ls 里文件回来了,
cat内容完好 —— 时间机器把小张的心血救回来了!
🧠 思考题
Git 能恢复被删文件的前提是什么?为什么 "没提交过" 的文件救不回?
git checkout -- 文件名和git restore 文件名都能恢复,分别适用于什么情况?(提示:一个从版本库恢复,一个恢复未提交的删除)