首页 > 解决方案 > 如果我使用 sudo rm -r 从本地文件系统中删除 git 分支上的文件会发生什么

问题描述

我在本地开发分支上使用 sudo rm -r 删除了一个文件。现在我仍然可以在其他分支上查看该文件,但我不太了解它。另外我认为我丢失了主分支上的文件。需要帮助。

标签: gitgithubrm

解决方案


在 Git 中,文件不在分支中。文件在commits中。提交是只读的(完全)和永久的(嗯,大部分)。任何现有的提交都无法更改。

提交位于不同的分支中,但包含任何给定提交的分支集可以随时更改。因此,如果提交a123456...现在在分支 B 中,而您仍然有a123456...但明天不在分支 B 中,则文件没有发生任何事情。在最坏的情况下,如果提交a123456...不在分支 B 中并且在任何其他分支中也找不到,那么您可能会丢失整个提交。

每个提交中的文件都以一种特殊的、只读的、压缩的和去重复的格式存储。重复数据删除处理每个提交都有每个文件的完整副本这一事实,就像您(或任何人)提交时的形式一样。如果提交 C1 中的某些文件与 C2 中的文件相同,那么它们实际上是在这些提交之间共享的,并且每个其他具有相同副本的提交也是如此。因此,如果您丢失了a123456...但很确定该提交中的文件F与其他提交中的文件F相同,您可以从其他提交中获取文件F。

因为这些文件是只读的和重复数据删除的,并且最终以只有 Git 本身可以读取的格式,当您使用git checkout提取某个提交时,Git 会将该提交的所有文件提取到一个常规的、普通的,以日常方式存储的读/写文件。

只要您sudo rm没有删除提交或其他内部 Git 对象(全部存储在.git目录中),并且您没有进行一些更改,您就可以重新提取任何丢失的文件。为此,请使用git restore(在 Git 2.23 或更高版本中)或git checkout(在旧版本的 Git 中)。请注意,git checkout也可以检查整个提交,这可能不是您想要做的;事实上,一个命令——<code>git checkout——可以做两种截然不同的事情(“恢复一个文件”或“检查一个完整的提交”),这就是为什么它在 Git 2.23 中被拆分为两个新的单独命令的原因. (不过,为了兼容性,旧的git checkout仍然存在,并且会保留多年。)


推荐阅读