【问题标题】:Restore git files deleted after git merge --abort恢复 git merge --abort 后删除的 git 文件
【发布时间】:2017-01-20 22:37:25
【问题描述】:

我在“合并冲突”阶段丢失了添加到 git 的文件。

一步一步:

git pull
git status

Git 通知我“合并冲突”,没关系。然后我创建一个新文件并将其添加到 git。

vi test.txt
git add test.txt

之后,中止合并:

git merge --abort

我没有在目录中找到文件“test.txt”,也没有通过“git fsck”或“git reflog”找到。可以恢复文件吗?

【问题讨论】:

    标签: git git-merge git-pull


    【解决方案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 可能重复代码,你应该区分最后一个代码。

    【讨论】:

    • 嗨!我在这里说你的帖子和你的回答救了我的命。谢谢!
    【解决方案2】:

    你对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 $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
    

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

    【讨论】:

    • 使我免于在中止合并后丢失重要更改!
    【解决方案3】:

    不,不是。您必须创建 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 更加熟悉。而且,与往常一样,您最终选择的解决方案将取决于您的工作流程。

    【讨论】:

      猜你喜欢
      • 2020-07-09
      • 2021-12-27
      • 1970-01-01
      • 2019-04-11
      • 2022-01-01
      • 2018-08-30
      • 2011-03-14
      • 2012-06-09
      • 1970-01-01
      相关资源
      最近更新 更多