Undo delete in GIT
Asked Answered
R

2

68

I made something very stupid. I made a commit using git commit (file edits + new files) (C). Then I made amend last commit. Then I deleted all files recursively (!) using git rm -r Then I made another git commit (C).

A-B-C
    ↑
  master

Is there any way to undelete the files but keep the changes I had in my first commit? (C) I'd rather do not go back to (B). I tried git reset --soft head^, so then the git status lists files I deleted, then I did git checkout, but still no luck. I don't even know if it's possible.

Rosemaria answered 28/2, 2012 at 6:59 Comment(2)
so you want your files of commit A back?Tolyl
No, I want to still be on C but without files deleted, only my file edits and file adds. I do not have the files in my working tree now, they are deleted.Rosemaria
V
187

Do yourself a favour and do not do git checkout <hash> like the other answer suggests and go into more problems.

IF you have deleted file from your working directory and not committed the changes yet, do:

git checkout -f

CAUTION: commit uncommitted files before executing this command, otherwise you're going to lose them all

The deleted files should be back again.

If not and if you can find the commit that you want ( C, etc. - your question is not clear ) from git reflog, just do git reset --hard <hash from reflog> and you should be all set.

Violation answered 28/2, 2012 at 7:36 Comment(7)
+1 You might add a link to a detached head question (like https://mcmap.net/q/12033/-why-did-my-git-repo-enter-a-detached-head-state/…), to illustrate the issue with the git checkout SHA1 answer. Would ORIG_HEAd have helped in this case? (https://mcmap.net/q/11804/-head-and-orig_head-in-git/…)Priddy
Ok, so this answer is actually better. reset --hard to <hash> leaves me on my master branch, and I'm not left in 'detached HEAD' state. The answer by Sasha was also good in case of retrieving my lost data.Rosemaria
In addition to restoring your deleted file, git checkout -f also discards all other changes that you have not staged so beware.Basilisk
That last comment needs to be highlighted. And beware that it does NOT restrict itself to your current directory as you might assume, it'll clobber your entire repository. wow.Bonny
for selective undelete of a specific file: git checkout -- <FILENAME>Janice
If the file is not yet commited, but already staged, you need to unstage it first (git reset HEAD <path to file>).Scientistic
i've managed to accidentally delete some untracked files. any solution?Obsequious
D
6

If I understood you correctly you rewrote commit C. So the original commit, let's call it C1 is not accessible from your commit graph, but it is still there (git keeps all commits for a while). Use git reflog to get the commit hash and git checkout <hash> or another appropriate command to get to the old state C1.

Disharoon answered 28/2, 2012 at 7:7 Comment(2)
One more question. Now it says I'm in 'detached HEAD' state. How do I get back to be on my 'master' branch?Rosemaria
You are welcome. However, I do not understand the down vote. A git reset --hard <hash> is potentially far more dangerous. It was not clear if the poster had amended the original commit C with changes he wanted to keep.Disharoon

© 2022 - 2024 — McMap. All rights reserved.