【发布时间】:2020-09-14 19:08:40
【问题描述】:
我在本地开发分支上使用 sudo rm -r 删除了一个文件。现在我仍然可以在其他分支上查看该文件,但我不太了解它。另外我认为我丢失了 master 分支上的文件。需要帮助。
【问题讨论】:
我在本地开发分支上使用 sudo rm -r 删除了一个文件。现在我仍然可以在其他分支上查看该文件,但我不太了解它。另外我认为我丢失了 master 分支上的文件。需要帮助。
【问题讨论】:
在 Git 中,文件不在分支中。文件在 commits 中。提交是只读的(完全)和永久的(嗯,大部分)。任何现有的提交都不能更改。
commits 位于不同的分支中,但包含任何给定提交的分支集可以随时更改。因此,如果提交 a123456... 现在在分支 B 中,而您仍然有 a123456... 但明天它不在分支 B 中,文件没有发生任何事情。在最坏的情况下,如果提交 a123456... 不在分支 B 中并且在任何 other 分支中也找不到,那么您可能已经丢失了整个提交。
每个提交中的文件都以一种特殊的、只读的、压缩的和去重复的格式存储。重复数据删除处理每个提交都具有 every 文件的完整副本这一事实,就像您(或任何人)提交时所具有的形式一样。如果提交 C1 中的某些文件与 C2 中的文件相同,那么它们实际上是在这些提交之间共享的,并且每个其他具有相同副本的提交也是如此。因此,如果您丢失了a123456...,但很确定该提交中的文件 F 与其他文件中的文件 F 是 same 副本提交,您可以从另一个提交中获取文件 F。
因为这些文件是只读的并且是去重的,并且最终是只有 Git 本身可以读取的格式,所以当你使用git checkout 来提取一些提交时,Git 会提取in 中的所有文件都提交到以日常方式存储的常规、普通、读/写文件中。
只要您的 sudo rm 没有删除 commits 或其他内部 Git 对象(都存储在 .git 目录中),并且您没有在制作一些更改,您可以重新提取任何丢失的文件。为此,请使用 git restore(在 Git 2.23 或更高版本中)或 git checkout(在旧版本的 Git 中)。请注意,git checkout 也可以签出整个提交,这可能不是您想要做的;事实上,一个命令——git checkout——可以做两种截然不同的事情(“恢复一个文件”或“检查一个完整的提交”)中的任何一种,这就是为什么它被分成两个新的Git 2.23 中的单独命令。 (不过,旧的 git checkout 仍然存在,并且会保留多年,以保持兼容性。)
【讨论】:
如果您不小心删除了一个文件并提交了更改,您可以将当前分支的头部恢复为之前的提交。
git reset --hard HEAD^
此命令可用于返回一次提交
git reset --hard HEAD~2
此命令可用于返回 2 次提交...等等
【讨论】: