git checkout -- 文件 恢复误改误删的内容
文件被改坏了、或误删了还没提交的文件,想恢复成最近一次提交的版本?git checkout -- 文件 和 git restore 帮你一键还原。本文讲清用法与风险。
场景:某行代码被你改得一团糟,或者不小心删了一个已提交过的文件,想一键恢复到「最近一次提交」的干净版本。这正是 git checkout -- 文件 的用途。
恢复工作区的改动
git checkout -- 文件.txt
这会用最近一次提交(HEAD) 里的版本覆盖工作区,把文件还原成干净状态。
恢复多个文件或整个目录
git checkout -- 文件1.txt 文件2.js
git checkout -- src/ # 恢复整个目录
新版命令:git restore(推荐)
Git 2.23+ 引入了更语义化的 restore,和 checkout 文件恢复等效,新手更易懂:
git restore 文件.txt # 恢复工作区
git restore . # 恢复全部
重要:恢复的是「哪个版本」
- 默认
git checkout -- 文件/git restore 文件:恢复自 暂存区(若已 add)或 HEAD(若未 add) - 想明确回到某次提交:
git checkout HEAD~1 -- 文件
误删了文件怎么办
如果文件之前提交过,误删后可直接恢复:
git checkout -- 误删的文件.txt # 或 git restore 误删的文件.txt
但注意:从未 add 过的新文件(未跟踪)不在版本库里,checkout/restore 无法恢复,需靠编辑器历史或回收站。
风险提醒(务必看)
git checkout -- 文件 / git restore 文件 会永久丢弃该文件当前工作区的改动,不可用 reflog 找回(reflog 只保护提交,不保护未提交改动)。用之前:
- 确认这个文件没有想保留的修改
- 拿不准就先把文件备份:
cp 文件.txt 文件.txt.bak
常见问题
- 只想丢弃整个仓库的所有未提交改动:谨慎,
git reset --hard HEAD会连暂存一起清空。 - 提示 cannot checkout:可能文件被 Git 认为是重命名或冲突状态,先
git status查看状态。 - restore 提示没这个命令:Git 版本过低,用旧命令
git checkout -- 文件。
一句话速记
git checkout -- 文件 / git restore 文件 把已提交的文件恢复成干净版本,但会丢当前改动、且救不了未跟踪新文件。
?
常见问题 FAQ
git checkout -- 文件 会把我最近做的修改都丢掉吗?
会。它用最近一次提交(或暂存区)的内容覆盖工作区,当前工作区对那个文件的改动会永久丢失且不可找回。用前确认没有想保留的改动。
git checkout -- 和 git restore 有区别吗?
基本等效。git restore 是 Git 2.23+ 引入的更语义化命令,git restore 文件 等同于 git checkout -- 文件。新项目推荐用 restore。
误删了一个还没提交的新文件,能恢复吗?
如果新文件从未 git add 过(未跟踪),checkout 无法恢复,因为它不在版本库里。应立即用编辑器/回收站找回,或养成及时 add 的习惯。
想恢复暂存区里已经 add 的改动到提交版本怎么操作?
git restore --staged 文件 会取消暂存(从暂存区退回工作区),但不改文件内容;若要连内容也还原成提交版本,用 git checkout HEAD -- 文件。