如何通过Git恢复未提交且已被清空的编辑文件内容?
用Git找回未提交就被清空的编辑内容
现有文件:
a.adoc b.adoc c.adoc e.adoc
未知原因导致AsciidocFX 1.8.6清空了这些已编辑文件的内容,且无法通过Ctrl+Z撤销。当前文件已变为空白且已保存,但尚未提交至Git。
执行git status命令显示:
On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: a.adoc modified: b.adoc modified: c.adoc modified: d.adoc modified: e.adoc
执行git diff a.adoc可查看与最新提交版本相比被删除的内容,但当前空白文件与上一提交版本差异较大。
场景说明
- 原始文件已提交
- 文件被编辑保存但未提交,随后内容被删除
- 当前文件为空白
需求:找回场景中被删除的编辑内容(类似Ctrl+Z的效果)
解决方案
方法1:从Git对象库恢复(最可靠)
Git会自动缓存文件修改的快照,哪怕没执行git add,也能从对象库找回:
- 执行命令:
git fsck --lost-found
该命令会扫描Git仓库,把所有未被引用的对象存入.git/lost-found/other目录,每个对象以哈希值命名。 - 查看目录下的文件内容,找到对应你编辑过的内容:
cat .git/lost-found/other/<哈希值> - 找到目标内容后,复制到对应的空白
.adoc文件即可。
方法2:通过git diff提取内容
如果git diff能显示出被删除的编辑内容,可直接提取:
- 执行
git diff <文件名>,比如git diff a.adoc,输出中以-开头的行就是你之前编辑的内容(注意排除文件开头的---/+++行)。 - 把这些行去掉前缀
-,复制到空白文件中即可。
方法3:利用暂存区恢复(仅适用于曾执行过git add的情况)
如果之前把编辑内容暂存过(执行过git add),可以这样操作:
- 先恢复暂存区的内容到工作区:
旧版本Git可使用:git restore --staged <文件名> git restore <文件名>
这个方法仅在你曾暂存过编辑内容时有效,未执行过git checkout -- <文件名>git add则无法使用。
内容的提问来源于stack exchange,提问作者Manuel Jordan
相关产品推荐
相关产品推荐

