You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Git恢复文件:误强制推送后丢失新文件的恢复方法咨询

恢复强制推送后丢失的文件与内容

别慌,你猜的方向完全没错——那些丢失的内容很大概率还以悬空Blob不可达对象的形式藏在本地Git仓库里,咱们一步步来确认和恢复:

一、先确认丢失的对象是否存在

1. 查看Git操作轨迹(Reflog)

强制推送会覆盖本地分支的历史,但Git会悄悄记录所有HEAD的变更路径,你用这个命令就能找回之前的提交记录:

git reflog

输出会是类似这样的条目:

abc1234 HEAD@{0}: push -f: forced update
def5678 HEAD@{1}: commit -a: add new files and dirs

这里的def5678就是你执行强制推送前的提交哈希——这个提交里就包含你创建的新文件,先把这个哈希记下来。

2. 扫描不可达对象与悬空Blob

git fsck命令可以揪出仓库里所有无法通过当前分支/标签访问到的对象,包括未追踪文件变成的悬空Blob,以及被覆盖的旧提交:

git fsck --lost-found

执行后,Git会把找到的不可达对象放到.git/lost-found/目录下:

  • .git/lost-found/blobs/:存放所有悬空文件内容的Blob对象
  • .git/lost-found/commits/:存放被覆盖的不可达提交对象

二、恢复你需要的内容

1. 从Reflog的旧提交里提取文件

如果你找到了强制推送前的提交哈希(比如上面的def5678),先创建一个临时分支来保存这个提交的内容,避免误操作:

git checkout -b temp-recovery def5678

现在你可以在这个临时分支里看到所有丢失的新文件,直接把需要的文件复制到当前工作区就行(不用合并整个分支,避免带入有问题的历史)。

2. 恢复悬空Blob(未提交的未追踪文件)

如果你的新文件还没来得及提交就丢失了,它们会以悬空Blob的形式存在。你可以逐个查看Blob的内容来确认:

git show <blob-hash>

找到对应的Blob后,把内容写回本地文件:

git cat-file -p <blob-hash> > path/to/your/lost/file

比如你要恢复src/new-module.js,就执行:

git cat-file -p abc1234 > src/new-module.js

三、额外确认:检查本地refs备份

Git有时会在分支被覆盖前自动创建备份,你可以看看.git/refs/original/目录(如果存在的话),里面可能保存着强制推送前的分支引用:

ls .git/refs/original/

如果有内容,你可以直接查看这个引用对应的提交:

git show refs/original/heads/your-branch-name

内容的提问来源于stack exchange,提问作者Gal Grünfeld

火山引擎 最新活动