恢复git merge -abort后删除的git文件

时间:2016-09-13 10:44:57

标签: git git-merge git-pull

我在#34;合并冲突"期间丢失了添加到git的文件。相。

一步一步:

git pull
git status

Git告诉我"合并冲突",没关系。然后我创建一个新文件并将其添加到git。

vi test.txt
git add test.txt

之后,中止合并:

git merge --abort

我还没找到文件" test.txt"既不是在目录中,也不是通过" git fsck",也不是" git reflog"。是否可以恢复文件?

3 个答案:

答案 0 :(得分:4)

您尝试使用git fsck做了什么?

请参阅此问题:Recover files that were added to the index but then removed by a git reset

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

但是,git有很多安全机制,其中之一是:如果某些数据输入回购中的某个地方,则在两周之前不会被删除。

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 $3 }' > 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 :(得分:2)

不,不是。您必须制作git commit而不是git merge --abort。正如@Muneer Bits所说,我建议你阅读一下git基础知识。 official site包含大量文档和示例。你甚至可以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。而且,与往常一样,您最终选择的解决方案将取决于您的工作流程。

答案 2 :(得分:1)

中文的英文不好。

请回答#1。我恢复了我的文件!!! ^。^

我确实这样:

git fsck --full --unreachable --no-reflog | grep blob | awk '{ print $3 }' > ~/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可能会重复代码,因此您应该区分最后一个代码。