有什么方法可以撤消“`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)
我为提交准备了大量文件。
然后我意识到最好只提交其中两个文件, 然后在单独的提交中提交其余的。
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)