What reset does to each area
Reset moves the branch pointer back and treats the three areas differently:
| Mode | Commits | Staging | Files |
|---|---|---|---|
--soft | undone | kept | kept |
--mixed | undone | cleared | kept |
--hard | undone | cleared | deleted |
All three move the pointer. The only real question is what you do with the changes that were already there.
Getting back what you lost
Even the scary resets are usually recoverable, because git keeps a ledger of every HEAD movement:
git reflog
The reflog lists where the branch has been, including commits you reset away. Copy a lost commit's hash from there and checkout it to bring the work back. This is the reason --hard only becomes permanent until you actually discard something in a way reflog cannot find.