I am trying to recover staged deleted files from my local branch. I tried git checkout file name, but it did not work. I don't want to use reset hard as it will reset all my required changes that I made to the other files. So is there a way to restore the deleted files only?
- 
                    Try `git reset --` followed by `git checkout -- – Xaqron Aug 24 '17 at 21:22` 
- 
                    1Possible duplicate of [Unstage a deleted file in git](https://stackoverflow.com/questions/9591407/unstage-a-deleted-file-in-git) – Leonardo Alves Machado Aug 24 '17 at 21:35
2 Answers
There are several ways to do it. git reset <filename> should reset a single file only.
You can also do a git show HEAD:<filename> and save the output back to filename, then just git add it back in.
 
    
    - 114,536
- 5
- 94
- 148
Let's restate the question first.
Given this output from git status:
$ git status
On branch SOMEBRANCH
Your branch is up-to-date with ...
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
        deleted:    SOMEFILE
You now want to get file SOMEFILE back into both the work-tree and the index, so that the git status output will not say deleted:    SOMEFILE.
Method 1: follow the advice git status gives
If you follow the advice that git status itself prints:
$ git reset HEAD SOMEFILE
the status will change to:
$ git status
On branch SOMEBRANCH
Your branch is up-to-date with ...
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
        deleted:    SOMEFILE
Now you have to take the advice shown again in git status:
$ git checkout -- SOMEFILE
Method 2 (short-cut)
The text just above Method 1 is the key to the short-cut.  We want to copy the file SOMEFILE from the HEAD commit into the index, then copy the file SOMEFILE from the index into the work-tree.  There is a command that does this: it's git checkout:
$ git checkout HEAD -- SOMEFILE
The trick is that when you say git checkout -- SOMEFILE, you are telling Git to copy the file only from the index to the work-tree.
This is why it takes two steps to do it the way git status suggests: the first step, git reset HEAD SOMEFILE, copies the file from the HEAD commit to the index.  The second step, git checkout -- SOMEFILE, copies the file from the index to the work-tree.  Using the git checkout HEAD -- SOMEFILE syntax we make Git copy from HEAD to index first, then from index to work-tree, all with one command.
(But the advice that git status gives works too.)
 
    
    - 448,244
- 59
- 642
- 775
 
    