在暂存区有未提交的文件时如何撤销 Git reset --hard 命令

131

我试图找回我的工作。我愚蠢地使用了git reset --hard,但在那之前我只进行了git 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 --hard
HEAD is now at ff546fa added new strucuture for api

在这种情况下,是否有可能撤销git reset --hard的操作?


@MarkLongair 很棒啊!你刚刚帮我解决了问题!我写了一个Python脚本来创建所有输出的文件!我会将这个脚本作为答案添加上去。 - Boy
6
不是“愚蠢地”做了,而是“天真地”做了...因为我刚刚也做了同样的事情! - Rosdi Kasim
仍然可能很愚蠢;-) - Duncan McGregor
这是一篇关于如何撤销 Git 强制重置的优秀文章,需要进行一些手动操作。 - Jan Swart
1
@MarkLongair find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort对我有用。日期也会显示,从结尾开始检查 blobs。 - ZAky
我如何在“git show 907b308…”之后恢复文本?这会给我一个差异,而不是文件。 - Danijel
13个回答

0
以上解决方案可能有效,但是有更简单的方法可以恢复,而不是通过git的复杂撤销。我猜测大多数git重置发生在少量文件上,如果您已经在使用VIM,这可能是最省时的解决方案。但要注意的是,您必须已经在使用ViM的持久撤消,无论如何都应该使用它,因为它提供了撤消无限数量更改的能力。
以下是步骤:
  1. 在vim中按下:并输入命令set undodir。如果您在.vimrc中打开了persistent undo,它将显示类似于undodir=~/.vim_runtime/temp_dirs/undodir的结果。

  2. 在您的repo中使用git log查找您最后一次提交的日期/时间

  3. 在您的shell中使用cd ~/.vim_runtime/temp_dirs/undodir导航到您的undodir

  4. 在此目录中使用此命令查找自上次提交以来更改的所有文件

    find . -newermt "2018-03-20 11:24:44" \! -newermt "2018-03-23" \( -type f -regextype posix-extended -regex '.*' \) \-not -path "*/env/*" -not -path "*/.git/*"

    这里的“2018-03-20 11:24:44”是上次提交的日期和时间。如果您执行了git reset --hard的日期是“2018-03-22”,则使用“2018-03-23”。这是由于find的一个怪癖,其中下限是包含的,而上限是排除的。 https://unix.stackexchange.com/a/70404/242983

  5. 接下来,打开每个文件并在vim中执行“earlier 20m”。您可以使用“h earlier”查找有关“earlier”的更多详细信息。这里的earlier 20m表示返回到文件状态20分钟之前,假设您在20分钟前执行了git hard --reset。重复此操作以处理从find命令中输出的所有文件。我相信有人可以编写一个脚本来组合这些内容。


0
记住你的文件层次结构,并使用Mark Longair与Phil Oakley修改的技术,可以取得惊人的结果。
基本上,如果你至少将文件添加到了仓库但没有提交,你可以通过交互式地使用git show、检查日志并使用shell重定向来恢复每个文件(记住你感兴趣的路径)。
希望对你有帮助!

0

我无法使用 git 命令恢复文件。在我的情况下,这是一个 CPP 文件。我知道它里面有一个独特的字符串,this 对我很有帮助。命令如下:

sudo grep -a -B[number of rows before the text being searched] -A[number of rows after the text being searched] '[some unique text in the lost file]' /dev/sda3 > test.cpp

搜索整个磁盘,但最终找到了丢失文件的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接