【问题标题】:What happens if I delete a file on a git branch using sudo rm -r from the file system locally如果我使用 sudo rm -r 从本地文件系统中删除 git 分支上的文件会发生什么
【发布时间】:2020-09-14 19:08:40
【问题描述】:

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

【问题讨论】:

    标签: git github rm


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      git reset --hard HEAD^
      

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

      git reset --hard HEAD~2
      

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

      【讨论】:

        猜你喜欢
        • 2019-06-26
        • 1970-01-01
        • 2013-10-23
        • 2019-07-24
        • 1970-01-01
        • 1970-01-01
        • 2021-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多