我的回购中有很多未更改的更改。当尝试从远程分支选择樱桃时,发生冲突。我打了中止,这删除了我对工作目录所做的所有未分段的更改,并且丢失了很多代码。
我如何找回它?
这似乎是个问题:
我尝试过:git checkout @ {-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
将它们压缩在一起,最终您将获得一个最终提交,而其他中间提交最终将过期(并且永远不会被发送/推送) )。