有没有办法撤消“`git reset .`”?它“还原”了所有文件 - 我的工作目录中的所有编辑都已丢失

时间:2016-04-04 05:31:19

标签: git undo git-reset git-add git-stage

我上传了大量用于提交的文件。

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

git reset <filename> unstages filename

我想取消所有内容,
然后重新启动两个文件,并提交 然后暂存所有正在重写的文件并再次提交。

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

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

无论如何要“撤消”“git reset .”??

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

但是这可以撤销吗?

2 个答案:

答案 0 :(得分:2)

你从未犯过这些修改,所以不,这是不可能的......

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

答案 1 :(得分:1)

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

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

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

没有内置方式来恢复我丢失的文件编辑 但是,git add .保存了每个文件的副本,其中包含了这些编辑内容 我们只需要了解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), 并以正确的名称保存您想要恢复的那些。

我这样做的方法是将每个“无法访问的博客”保存到临时文件中: (你可以只使用每个文件的前几位数字)

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

...

从那里打开崇高的所有这些文件很容易。

使用适当的名称重新保存

完成!! : - )

请注意,这只有效,因为我已经已暂存我要恢复的所有文件。
如果我没有上演(全部)他们,我会失去运气。 (或者只能恢复其中一些。)

有关详细信息,请访问我在StackOverflow上发现的以下链接:

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

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

这个帖子还有一个帖子链接一个声称为你做的插件:
Recovering added file after doing git reset --hard HEAD^

最后,这是一个有趣的表格:
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)