Restore git files deleted after git merge --abort

Sorry for my Poor English.

Thanks for reply#1. I restored my files!!! Happy ^.^

I did like this:

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

Then i saved files to named folders with different keyword which i remembered:

    # 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

If you lost more content, you should execute above command many times with different keyword. and you will get many keyword folders.

I opened another vscode and opened each keyword folder, copied every $bold.ts code to my project file. do it careful because $bold.ts maybe have repeat codes, you should distinguish the last code.


No, it's not. You had to make a git commit instead of a git merge --abort. As @Muneer Bits put it, I advise you to read a bit on the git basics. The official site contains a lot of documentation, and examples. You can even try it online with an interactive tutorial. The point is, you can't lose your work if it has been commited or stashed. I strongly encourage you to read the advices git is outputting all the time (unless you have an old version, in which case you should upgrade too). These tips should have told you to mark the commit resolved by adding the file first, then finalize the merge by performing a git commit.

Merge commits are just special commits with two parents. That means they need to be commited at some point, be it automatically (if there is no conflict) or manually. When you aborted the merge, you reverted (reset) all your changes to the point you were before the merge. And thus you lost every changes you made.

Possible solution (depending on your workflow):

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

Note that the merge wasn't aborted.

Be also aware that merging is not always the best solution when pulling. You can also pull with rebase. But I strongly encourage you to become a bit more familiar with git before attempting risky things with your work. And, as always, the solution you choose in the end will depend on your workflow.


What have you tried with git fsck ?

see this SO question : Recover files that were added to the index but then removed by a git reset


The general answer is : the sequence of instructions you typed has removed the file from tracking (and from the disk), there is no guarantee that the content of your file can be retrieved.

However, git has a lot of safety mechanism, and one of them is : if some data is entered somewhere in the repo, it will not be deleted before two weeks.

(git has a garbage collection mechanism, see git help gc)


If you did indeed run git add test.txt at some point, and this action was recent enough, there should still be some trace of the content of the file stored within git :

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

in git parlance, a file is a blob :

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

This should give you a list of internal git hashes :

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

note that git add file.txt stores the file's content, not the file's name ...

If you remember a specific string in your file, you can try to narrow your research by using 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

You can then view the whole content of a blob using :

git show $blob

and hopefully find back the file you were looking for.