Git revert命令相关:恢复删除文件及文件存储机制问询
为什么revert删除提交后文件会回到原位置
当你用git rm删掉文件并提交后,这个提交的核心变化是在仓库的目录树(Tree对象)里移除了该文件的条目。而git revert的作用是生成一个和目标提交完全反向的新提交——针对删除文件的提交,反向操作就是把被删掉的文件重新添加回来。
举个实际流程的例子:
- 删掉文件并提交:
git rm test.txt && git commit -m "remove test.txt" - 回滚这个删除提交:
git revert <这个提交的哈希值> - 执行完后你会发现
test.txt重新出现在原位置,因为revert生成的新提交里,Git自动把该文件的内容重新加入到了仓库的目录树中。
Git存储已删除文件的核心逻辑
Git从来不会直接“删除”文件内容,它的存储机制是基于对象数据库的,所有内容都以不可变的对象形式存在,已删除文件的存储规则如下:
- 文件内容存在Blob对象里:每个文件的内容都会被计算哈希值,生成一个唯一的Blob对象存在
.git/objects目录下。只要这个Blob对象还有任何引用(比如旧提交、分支标签、操作日志),就会一直保留。 - 删除操作只是移除目录树的引用:当你删除文件并提交时,新提交对应的Tree对象(记录目录结构)里会去掉该文件的条目,但包含该文件的旧Tree对象和旧提交依然存在,只要有地方能找到这些旧对象,文件内容就不会消失。
- 只有垃圾回收会清理无引用对象:当某个Blob对象彻底没有任何引用(包括本地操作日志reflog里的记录也过期了),执行
git gc命令时,Git才会把这个无主的Blob对象从数据库中彻底删除,释放磁盘空间。 - reflog是救星:Git会记录本地所有分支的操作历史,哪怕你删掉了包含该文件的分支,reflog里依然能找到旧提交的记录,通过
git reflog找到对应提交后,就能把文件恢复回来,默认reflog记录会保留90天。
内容的提问来源于stack exchange,提问作者Suva
相关产品推荐
相关产品推荐

