恢复 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可能有重复的代码,你应该区分最后一个代码。
我丢失了在 "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可能有重复的代码,你应该区分最后一个代码。