如何撤销git checkout filename?误执行git checkout .后如何恢复未提交修改?
恢复
git checkout . 撤销的未提交修改 & 撤销 git checkout filename 操作 先给你分情况说明,能不能恢复完全取决于你的修改有没有被 Git 记录过:
一、恢复 git checkout . 导致丢失的修改
git checkout . 会把当前目录下所有文件的工作区状态,重置到**暂存区或 HEAD(最近一次提交)**的版本——简单说就是把你没提交的修改直接覆盖了。能不能找回来分两种情况:
1. 你的修改从未执行过 git add
这种情况下,Git 根本没把你的修改存入它的数据库,相当于系统直接覆盖了文件内容。这时候 Git 帮不了你,只能依赖系统层面的恢复工具:
- Windows:可以用 Recuva、Disk Drill 这类文件恢复软件,扫描磁盘找回被覆盖的文件;如果开了系统还原,也可以尝试还原到之前的系统快照。
- macOS:如果你开了 Time Machine,直接从时间机器里恢复对应文件;或者用 Disk Drill 这类工具。
- Linux:可以试试
testdisk或者photorec这类开源恢复工具,不过覆盖后的文件恢复成功率不高,得看运气。
2. 你的修改曾经执行过 git add(哪怕之后又修改过但没再 add)
如果之前用 git add 把修改暂存过,那 Git 其实在本地数据库里保存了这个暂存版本。你可以这么找:
- 运行
git fsck --lost-found,这个命令会扫描 Git 数据库里的“丢失”对象,把它们放到.git/lost-found/other目录下。 - 进入
.git/lost-found/other,用cat或者文本编辑器查看每个文件的内容,找到你丢失的修改。 - 把找到的文件内容复制回原文件即可。
另外,你也可以用 git reflog 查看 HEAD 的操作记录,找到 git checkout . 之前的那个状态,然后用 git restore --source=HEAD@{1} .(Git 2.23+ 版本支持)来尝试恢复,但这个方法只对已经被 Git 追踪的文件有效。
二、撤销 git checkout filename 操作
git checkout filename 本质上和上面的情况类似,都是用暂存区或 HEAD 的版本覆盖了工作区的修改。恢复方法同样分两种:
1. 修改未执行过 git add
和上面一样,Git 没记录这个修改,只能靠系统文件恢复工具尝试找回。
2. 修改执行过 git add
- 如果你用的是 Git 2.23 及以上版本,直接运行:
这里的git restore --source=HEAD@{1} filenameHEAD@{1}代表你执行git checkout filename之前的 HEAD 状态,你可以先用git reflog确认这个状态的正确性。 - 如果是旧版本 Git,用:
这个命令会把之前状态下的git checkout HEAD@{1} -- filenamefilename内容恢复到工作区。
最后提醒一句:以后操作 Git 前,最好先用 git status 确认当前状态,不确定的命令可以先加 --dry-run 参数看效果,避免误操作~
内容的提问来源于stack exchange,提问作者mana
相关产品推荐
相关产品推荐

