При неудачном ребейзе или при перемещении веток некоторые коммиты пропали из истории. Эти коммиты осталить в "подвешенном" состоянии (dangling state) и все ещё доступны для восстановления до тех пор, пока не будет запущен процесс сборки мусора (git gc).
Представим вот такую ситуацию:
$ git show-ref -h HEAD
7c61179cbe51c050c5520b4399f7b14eec943754 HEAD
$ git reset --hard HEAD^
HEAD is now at 39ba87b Fixing about and submit pages so they don't look stupid
$ git show-ref -h HEAD
39ba87bf28b5bb223feffafb59638f6f46908cac HEAD
HEAD переместился на один коммит назад и мы потеряли последний коммит и хотим его восстановить. Нам нужен sha хэш коммита, чтобы восстановить его назад. Git всё еще помнит про этот коммит, это видно по следующей команде:
$ git fsck --lost-found
[... some blobs omitted ...]
dangling commit 7c61179cbe51c050c5520b4399f7b14eec943754
Также можно найти утраченный коммит через reflog:
$ git reflog
39ba87b... HEAD@{0}: HEAD~1: updating HEAD
7c61179... HEAD@{1}: pull origin master: Fast forward
[... lots of other refs ...]
Так что теперь мы знаешь хэш утраченного коммита и можем вернуть его назад:
$ git merge 7c61179
Updating 39ba87b..7c61179
Fast forward
css/screen.css | 4 ++++
submit.html | 4 ++--
2 files changed, 6 insertions(+), 2 deletions(-)