合并/更新master分支时丢失本地目录/文件夹,如何找回?
找回Git合并/同步时丢失的文件和目录
别慌!Git的设计就是尽可能保留历史操作记录,你的文件大概率还能找回来。我给你整理几个实用的操作步骤,按顺序试就行:
1. 先通过git reflog定位丢失前的状态
Git的reflog会记录所有HEAD指针的变动(包括合并、拉取、重置这些操作),这是找回文件的关键。在终端里运行:
git reflog
你会看到类似这样的输出:
a1b2c3d HEAD@{0}: merge master: Fast-forward d4e5f6g HEAD@{1}: checkout: moving from master to your-branch h7i8j9k HEAD@{2}: commit: add new feature
找到你执行合并/同步操作之前的那条记录(比如上面的HEAD@{1}或者HEAD@{2}),记下对应的哈希值(比如d4e5f6g)。
2. 验证该记录是否包含丢失的文件
先确认这个历史版本里确实有你丢失的目录,避免白忙活。运行:
git ls-tree -r <commit-hash> --name-only | grep "lost-directory-name"
如果输出里能看到你丢失的目录路径,说明找对了版本。
3. 找回丢失的文件/目录
有两种方式,选适合你的:
方式一:直接提取丢失的目录到当前分支
这种方式不会改变当前分支的其他内容,只把丢失的目录恢复回来,最安全:git checkout <commit-hash> -- path/to/lost-directory执行完后,你会发现丢失的目录已经回到工作区了,记得提交这个恢复操作:
git add path/to/lost-directory git commit -m "recover lost directory from historical commit"方式二:暂时回到丢失前的状态查看(可选)
如果你想先确认整个状态再恢复,可以切换到那个历史版本(注意这是分离HEAD状态,不要在这个状态下提交新内容):git checkout <commit-hash>确认文件都在之后,切回你的原分支,再用方式一提取文件即可:
git checkout your-branch-name
4. 极端情况:reflog里找不到记录怎么办?
如果reflog里没找到对应的操作(比如过了很久,reflog被清理了),可以试试用git fsck查找未被引用的对象:
git fsck --lost-found
Git会在.git/lost-found/目录下生成一些文件,你可以查看这些文件的内容,看看是不是你丢失的文件。不过这个方法比较繁琐,适合其他方法都失效的情况。
内容的提问来源于stack exchange,提问作者Shyamala Pai
相关产品推荐
相关产品推荐

