有什么方法可以撤消“`git reset .`”吗? 'reverted' 所有文件 - 所有编辑都已从我的工作目录中丢失

Is there any way to undo a "`git reset .`"? It 'reverted' all files - all edits have been lost from my working directory

我为提交准备了大量文件。

然后我意识到最好只提交其中两个文件, 然后在单独的提交中提交其余的。

git reset <filename> unstages 文件名

我想取消一切,
然后重新暂存两个文件,并提交。
然后暂存所有剩余文件并再次提交。

As: "git add ."(将所有文件添加到暂存区)
和“git reset <filename>”(从暂存区删除文件名)
git reset .”(取消暂存所有文件似乎有意义)

糟糕..!
这将我的工作目录恢复为上次提交的版本,
- 我丢失了我所做的所有文件编辑! :-(

无论如何"undo"“git reset .”??

我没有找到这方面的任何文档。
事实上,我根本找不到任何关于“git reset .”的文档。
我最好的猜测是 git 将“.”作为一个选项的值,而不是文件名选项。

但这可以撤销吗?

您从未提交过这些修改,所以不,这不可能...

请放心,我知道你的痛苦是什么感觉......好消息是你再也不会犯这个错误了!

是的!,事实证明,你可以!!

原因如下:git 将 git reset . 解释为 git reset --hard

这样就删除了我工作目录中的所有更改, 将一切恢复到我上次提交的状态。

没有内置方法来恢复我丢失的文件编辑。
但是,git add . 保存了包含这些编辑的每个文件的副本。
我们,只需要获取 where/how git 的句柄,保存所述文件的状态。

简而言之,执行以下步骤:

(1):
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \ $(egrep commit all | cut -d ' ' -f 3) > stagedNotCommitted

这将找到并放置 git 已编入索引的文件列表(因为它们已被暂存),
但从未提交到名为的文件中 stagedNotCommitted

由于git 不知道这些文件的文件名,stagedNotCommitted 将是索引文件哈希的列表。 看起来像

 `369c722e8df1c83b6ebfc0dc2d426aa612535203
  63282280da679aa19d6a2a71e08bed8487f7e688
  6a540aa36ee558611528176dbf87ad8e39475222
  9c8ce87dd8aff2abc78d8a5dbe976473c6fea3de
  9e20a6530229dac42cb87dc0a7153edb4bad96b5
  abec86bc81f8b473e5ea8f0320589619d5e726b2
  b830a382cd30308782a1df12e553227100b47ba4
  c8bc4788fee301c8c88ed29739927689742c55bf
  f87c9f32da264e5e0b9de3d1818e291a687adab9`
  ...    

(2):
从这里你可以在你的文本编辑器中打开每个文件(我用的是 Sublime), 并以正确的名称保存您希望恢复的内容。

我解决这个问题的方法是将每个 "unreachable blog" 保存到一个临时文件中:
(您可以只使用每个文件的前几个 digits)

$ git show 89f45 > _02_89f45 $ git show 07f9c > _03_07f9c $ git show 23ad5 > _04_23ad5

...

从那里在 sublime 中打开所有这些文件很容易。

只需用适当的名称重新保存

完成!! :-)

注意,这只有效,因为我已经 暂存 所有我想恢复的文件。
如果我没有上演(全部)它们,我就走运了。 (或者只能恢复其中的一部分。)

有关更多信息,请访问我在 Whosebug 上发现有用的以下链接:

这个特别有用,有很好的解释!
Undo git reset --hard with uncommitted files in the staging area

其他:
很好,很好解释的信息:
How can I undo git reset --hard HEAD~1?

这个也有一个 post 链接一个声称可以为你做的插件:
Recovering added file after doing git reset --hard HEAD^

最后,这是一个有趣的 table:
https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting/summary

Command Scope Common use cases git reset Commit-level Discard commits in a private branch or throw away uncommited changes git reset File-level Unstage a file git checkout Commit-level Switch between branches or inspect old snapshots git checkout File-level Discard changes in the working directory git revert Commit-level Undo commits in a public branch git revert File-level (N/A)