使用暂存区域中的未提交文件撤消git reset --hard

使用暂存区域中的未提交文件撤消git reset --hard

我正在努力恢复我的工作。我愚蠢地做了git reset --hard,但在那之前我只做过get add .而且没做过git commit。请帮忙!这是我的日志:

MacBookPro:api user$ git status# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)#   modified:   .gitignore...MacBookPro:api user$ git reset --hardHEAD is now at ff546fa added new strucuture for api

git reset --hard在这种情况下可以撤消吗?


互换的青春
浏览 1006回答 3
3回答

潇潇雨雨

您应该能够恢复添加到索引中的任何文件(例如,在您的情况下git add .),尽管它可能有点工作。为了将文件添加到索引,git将它添加到对象数据库,这意味着只要尚未发生垃圾收集,它就可以恢复。在JakubNarębski的答案中有一个如何做到这一点的例子:执行git reset后恢复添加的文件--hard HEAD ^但是,我在测试存储库上尝试了这一点,并且存在一些问题 -&nbsp;--cached应该是--cache,并且我发现它实际上并没有创建.git/lost-found目录。但是,以下步骤对我有用:git&nbsp;fsck&nbsp;--cache&nbsp;--unreachable&nbsp;$(git&nbsp;for-each-ref&nbsp;--format="%(objectname)")这应该输出对象数据库中的任何ref,索引或reflog都无法访问的所有对象。输出看起来像这样:unreachable&nbsp;blob&nbsp;907b308167f0880fb2a5c0e1614bb0c7620f9dc3unreachable&nbsp;blob&nbsp;72663d3adcf67548b9e0f0b2eeef62bce3d53e03......对于每个blob,你可以这样做:git&nbsp;show&nbsp;907b308输出文件的内容。输出太多了?更新响应sehe以下的评论:如果您发现该命令的输出中列出了许多提交和树,您可能希望从输出中删除任何从未引用的提交引用的对象。(通常你可以通过reflog回到这些提交 - 我们只对已添加到索引但永远无法通过提交找到的对象感兴趣。)首先,保存命令的输出,使用:git&nbsp;fsck&nbsp;--cache&nbsp;--unreachable&nbsp;$(git&nbsp;for-each-ref&nbsp;--format="%(objectname)")&nbsp;>&nbsp;all现在可以找到那些无法访问的提交的对象名称:egrep&nbsp;commit&nbsp;all&nbsp;|&nbsp;cut&nbsp;-d&nbsp;'&nbsp;'&nbsp;-f&nbsp;3因此,您可以找到已添加到索引但未在任何时间提交的树和对象,具有:git&nbsp;fsck&nbsp;--cache&nbsp;--unreachable&nbsp;$(git&nbsp;for-each-ref&nbsp;--format="%(objectname)")&nbsp;\ &nbsp;&nbsp;$(egrep&nbsp;commit&nbsp;all&nbsp;|&nbsp;cut&nbsp;-d&nbsp;'&nbsp;'&nbsp;-f&nbsp;3)这极大地减少了你必须考虑的物体数量。更新:&nbsp;下面的Philip Oakley提出了另一种减少要考虑的对象数量的方法,即只考虑最近修改过的文件.git/objects。你可以找到这些:find&nbsp;.git/objects/&nbsp;-type&nbsp;f&nbsp;-printf&nbsp;'%TY-%Tm-%Td&nbsp;%TT&nbsp;%p\n'&nbsp;|&nbsp;sort(我在这里发现了这个find调用。)该列表的结尾可能如下所示:2011-08-22&nbsp;11:43:43.0234896770&nbsp;.git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b2011-09-13&nbsp;07:36:37.5868133260&nbsp;.git/objects/de/629830603289ef159268f443da79968360913a在这种情况下,您可以看到这些对象:git&nbsp;show&nbsp;b21700b09c0bc0fc848f67dd751a9e4ea5b4133b git&nbsp;show&nbsp;de629830603289ef159268f443da79968360913a(请注意,您必须删除/路径末尾的内容才能获取对象名称。)

临摹微笑

我只是做了一个git reset --hard并丢失了一个提交。但我知道提交哈希,所以我能够做git cherry-pick COMMIT_HASH来恢复它。我在丢失提交的几分钟内就这样做了,所以它可能适合你们中的一些人。

心有法竹

首先,我将所有哈希保存到文件中:git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > allhashes接下来我将它们全部放入(删除'无法访问的blob'的东西)列表并将数据全部放入新文件中...你必须选择你的文件并重新命名它们你需要...但我只需要一些files..hope这有助于某人......commits = ["c2520e04839c05505ef17f985a49ffd42809f",&nbsp; &nbsp; "41901be74651829d97f29934f190055ae4e93",&nbsp; &nbsp; "50f078c937f07b508a1a73d3566a822927a57",&nbsp; &nbsp; "51077d43a3ed6333c8a3616412c9b3b0fb6d4",&nbsp; &nbsp; "56e290dc0aaa20e64702357b340d397213cb",&nbsp; &nbsp; "5b731d988cfb24500842ec5df84d3e1950c87",&nbsp; &nbsp; "9c438e09cf759bf84e109a2f0c18520",&nbsp; &nbsp; ...&nbsp; &nbsp; ]from subprocess import callfilename = "file"i = 1for c in commits:&nbsp; &nbsp; f = open(filename + str(i),"wb")&nbsp; &nbsp; call(["git", "show", c],stdout=f)&nbsp; &nbsp; i+=1
打开App,查看更多内容
随时随地看视频慕课网APP