将丢失的更改恢复到git工作目录

时间:2018-12-20 17:08:34

标签: git

我的回购中有很多未更改的更改。当尝试从远程分支选择樱桃时,发生冲突。我打了中止,这删除了我对工作目录所做的所有未分段的更改,并且丢失了很多代码。

我如何找回它?

这似乎是个问题:

enter image description here

我尝试过:git checkout @ {-1}

那给了我一个空头。

1 个答案:

答案 0 :(得分:1)

除了通过(例如)MacOS Time Machine或备份进行恢复之外,您可能还不走运。


“未按阶段进行的更改”在Git中具有误导性。没有这样的事情。只有工作树文件。当Git说工作树文件不同时,这是一个正确的说法:工作树副本与其他副本不同。当Git显示出差异时,是通过将工作树副本与其他副本进行比较而被构造的。

如果差异消失了,那么肯定发生了两件事之一(或两者都有!):

  • 另一个副本现在匹配:因此,工作树副本仍然相同,但是 other 副本匹配。例如,当您添加并提交时,就会发生这种情况:git add复制每个文件的工作树副本以替换陈旧的索引副本,然后该提交从索引副本进行新的提交。

  • 或者,工作树副本现在匹配:旧的工作树副本已被丢弃,并替换为您要与之进行比较的副本(索引或HEAD提交,最有可能)。

值得记住的是,在使用Git时,每个提交都具有每个文件的完整副本(嗯,提交中的每个文件,但这都是一种 1 ,但是这些副本采用特殊的,仅Git的压缩形式。除了 Git之外,它们对其他任何东西都没有用。

因此,Git提供了一种从提交中提取文件的方法,将它们转换回有用的形式。这会将文件的副本放入工作树,您可以在其中查看和处理它。这些副本不是由Git管理和维护的,而是在Git提取它们之后将它们放在工作树中。除了在提取过程中创建它们(或用提取的内容替换其内容)的过程中,Git不能对它们负责。

在当前(冻结的)HEAD提交和(完全流动的,不受Git管理的)工作树之间,Git保留了每个副本的“几乎冻结”或“肮脏”的副本文件。该副本最初与HEAD提交匹配,并且始终采用特殊的仅Git格式。

每个文件的这些副本都存在于Git所谓的 index staging area cache 中,具体取决于Git的谁/哪个部分正在执行呼叫。

使用git add时,您告诉Git:获取工作树副本中的所有内容,然后将其复制回索引中,替换旧的索引副本。 Git修改了内容,使它们大部分都冻结了,以便它们准备好进入 next 提交。如果您之前git add所访问的文件以前没有在索引中,那么现在它以特殊的仅Git格式在索引中 ,可以提交了。

因此,对于索引,我知道的最好的简短描述是您打算接下来进行的提交。每个文件都有自己的副本,随时可以提交。与大多数其他面向提交的版本控制系统相比,git commit如此之快:其他系统不得不扫描整个工作树(通常非常缓慢),重新压缩每个文件的 查看是否不同或为下一次提交做好准备。通过将它们从 current 提交保存到该索引中,Git使它们都准备好用于 next 提交。

因此,每个文件有三个副本:HEAD副本,索引副本和工作树副本。与每个提交的副本一样,HEAD(当前提交)副本被冻结且安全。索引和工作树副本可以更改。如果要确保不会丢失文件,请将其复制到索引中并提交。有时您可以稍后再使用git rebase -i删除提交,从而删除提交。


1 更确切地说,提交中的文件副本会持续到提交本身持续的时间。通常,那是永远的。但是,如果您进行了一些提交,则永远不要将其发送/推送给任何人,然后使用git rebase -i将它们压缩在一起,最终您将获得一个最终提交,而其他中间提交最终将过期(并且永远不会被发送/推送) )。