如果我使用 sudo rm -r 从本地文件系统中删除 git 分支上的文件,会发生什么情况

What happens if I delete a file on a git branch using sudo rm -r from the file system locally

我在本地开发分支上使用 sudo rm -r 删除了一个文件。现在我仍然可以在其他分支上查看该文件,但我不太了解它。另外我觉得我的文件丢了,求高手branch.Need求助

如果您不小心删除了一个文件并提交了更改,您可以将当前分支的头部恢复到之前的提交。

git reset --hard HEAD^

此命令可用于返回一个提交

git reset --hard HEAD~2

此命令可用于返回 2 次提交...等等

在Git中,文件不在分支中。文件在 提交 中。提交是 read-only(完全)和永久(好吧,大部分)。无法更改现有提交。

提交在不同的分支中,但是包含任何给定提交的分支集可以随时更改。因此,如果提交 a123456... 现在在分支 B 中,并且您仍然有 a123456... 但它明天不在分支 B 中,则 文件没有任何变化 。在最坏的情况下,如果提交 a123456... 不在分支 B 中并且在任何 other 分支中也找不到,您可能会丢失整个提交。

每个提交中的文件以特殊的 read-only、压缩和 de-duplicated 格式存储。 de-duplication 处理这样一个事实,即每个提交都有 每个 文件的完整副本,就像您(或任何人)进行提交时的形式一样。如果提交 C1 中的某些文件与 C2 中的文件相同,则它们实际上是在这些提交之间以及具有相同副本的所有其他提交之间共享的。因此,如果您丢失了 a123456... 但非常确定该提交中的文件 F 与文件 相同 副本=]F 在其他提交中,您可以从其他提交中获取文件 F

因为这些文件是 read-only 和 de-duplicated 并且最后是只有 Git 本身可以读取的格式,当您使用 git checkoutextract some commit,Git 将提取 in 中提交的所有文件到一个常规的,普通的,read/write 文件中存储在日常生活中。

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