git - 如果我使用 sudo rm -r 从本地文件系统中删除 git 分支上的文件会发生什么
问题描述
我在本地开发分支上使用 sudo rm -r 删除了一个文件。现在我仍然可以在其他分支上查看该文件,但我不太了解它。另外我认为我丢失了主分支上的文件。需要帮助。
解决方案
在 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
仍然存在,并且会保留多年。)
推荐阅读
- python - Mongoengine - 参考字段列表字段的分层视图
- searchkick - Searchkick 如何搜索 Post created user_id 和 title 短语将在哪里找到
- python - 笔记本和终端之间的tqdm自动切换
- here-api - 在哪里可以找到 HERE 地图中所有道路类型的列表?
- c# - 用c#方法读取csv文件
- javascript - 读取对象属性会导致未定义的 Uncaught TypeError
- sql - 更新由选择获取的数据
- javascript - 如何禁用 Angular 中不同组件中的按钮?
- ubuntu - 使用 Java 在 Ubuntu 上查询 HSQLDB 数据库
- jquery - 使用数据表动态加载数据的分页