使用git filter-repo后本地仓库及引用被删除,如何恢复?
先查看Git引用日志(reflog),它记录了本地所有HEAD和分支的变更轨迹,哪怕分支被删除也能找到操作痕迹:
运行命令:git reflog
在输出里找到执行git filter-repo之前的最后一次有效提交对应的哈希值(比如类似abcdefg HEAD@{3}: commit: 完成XX模块开发的记录),然后通过该哈希值恢复分支:git branch recover-progress abcdefg
或者直接切换到该提交状态:git checkout abcdefg如果reflog里找不到目标提交,用Git对象检查工具找回孤立的提交对象:
运行命令:git fsck --lost-found
该命令会扫描Git对象库,将所有未被引用的提交、树对象放到.git/lost-found/commits目录下。你可以逐个查看这些提交的内容:git show <提交哈希值>
找到包含丢失进度的提交后,同样用git branch命令基于它创建新分支。注意:Git默认会保留未引用对象至少14天(由
gc.pruneExpire配置控制),只要你是近期执行的filter-repo操作,这些丢失的提交对象大概率还没被垃圾回收。即使超过14天也可以尝试上述方法,因为自动垃圾回收不一定会准时触发。恢复成功后,第一时间把恢复的分支推送到远程仓库,避免再次丢失:
git push origin recover-progress后续执行
git filter-repo这类破坏性操作前,务必先克隆一份本地仓库副本做测试,或者确保所有本地进度已推送到远程备份。
内容的提问来源于stack exchange,提问作者PeterTschmoik

