恢复 git 个在 git 合并后删除的文件 --abort

Restore git files deleted after git merge --abort

我丢失了在 "merge conflict" 阶段添加到 git 的文件。

一步一步:

git pull
git status

Git 通知我 "merge conflict",没关系。然后我创建一个新文件并将其添加到 git.

vi test.txt
git add test.txt

之后,中止合并:

git merge --abort

我没有在目录中、通过 "git fsck" 或 "git reflog" 找到文件 "test.txt"。是否可以恢复文件?

不,不是。你必须制作 git commit 而不是 git merge --abort。正如@Muneer Bits 所说,我建议您阅读一些 git 基础知识。 official site contains a lot of documentation, and examples. You can even try it online with an interactive tutorial。 关键是,如果已经提交或隐藏,您就不会丢失您的工作。 我强烈建议您阅读 git 一直输出的建议(除非您有旧版本,在这种情况下您也应该升级)。这些提示应该告诉您通过先添加文件来标记提交已解决,然后通过执行 git commit.

来完成合并

合并提交只是有两个父项的特殊提交。这意味着它们需要在某个时候提交,可以是自动(如果没有冲突)或手动提交。当您中止合并时,您将所有更改还原(重置)到合并前的状态。因此,您丢失了所做的所有更改。

可能的解决方案(取决于您的工作流程):

git pull
#merge conflict, solve it manually
git add modified_files_for_merging
git commit
touch test.txt
git add test.txt
git commit

请注意,合并并未中止。

另请注意,合并并不总是拉取时的最佳解决方案。您还可以 使用 rebase 拉取。但我强烈建议您在尝试冒险的工作之前先熟悉一下 git。而且,一如既往,您最终选择的解决方案将取决于您的工作流程。

你用 git fsck 尝试过什么?

看到这个问题:Recover files that were added to the index but then removed by a git reset


一般答案是:您键入的指令序列已将文件从跟踪(和从磁盘)中删除,无法保证可以检索您的文件内容。

然而,git 有很多安全机制,其中之一是:如果在 repo 的某个地方输入了一些数据,它不会在两周内被删除。

(git有垃圾回收机制,见git help gc)


如果您确实 运行 git add test.txt 在某个时候做了,并且此操作足够新,那么 git 中存储的文件内容应该仍有一些痕迹:

git fsck --full --unreachable --no-reflog

git的说法,文件是blob :

git fsck --full --unreachable --no-reflog | grep blob

这应该给你一个内部 git 散列的列表:

unreachable blob 08bf360988858a012dab3af4e0b0ea5f370a2ae8
unreachable blob 21bf7ea93f9f9cc2b3ecbed0e5ed4fa45c75eb89
unreachable blob 08c12ef37075732cf4645269ab5687ba6ba68943
...

请注意 git add file.txt 存储文件的 内容,而不是文件的 名称 ...

如果您记得文件中的特定字符串,可以尝试使用 git grep <string> <hash> 来缩小您的研究范围:

$ git fsck --full --unreachable --no-reflog | grep blob | awk '{ print  }' > list.txt
$ cat list.txt | while read blob; do
  if git grep -q "string" $blob; then
    echo $blob
  fi
done

然后您可以使用以下命令查看 blob 的全部内容:

git show $blob

并希望找到您正在寻找的文件。

抱歉我的英语不好。

感谢回复#1。我恢复了我的文件!!!开心^.^

我喜欢这个:

git fsck --full --unreachable --no-reflog | grep blob | awk '{ print  }' > ~/Downloads/git.txt

然后我用我记得的不同关键字将文件保存到命名文件夹:

    # execute it in your git project
    cat ~/Downloads/git.txt | while read blob; do
      if git grep -q "keyword in your lost content" $blob; then
        echo $blob; git show $blob > ~/Downloads/git-above-keyword/$blob.ts
      fi
    done

如果你丢失了更多的内容,你应该用不同的关键字多次执行上面的命令。你会得到很多关键字文件夹。

我打开另一个 vscode 并打开每个关键字文件夹,将每个 $bold.ts 代码复制到我的项目文件中。小心点因为$bold.ts可能有重复的代码,你应该区分最后一个代码。