Git Reflog deve ser seu amigo

Imagine um cenário onde você rebaseou seu branch e os comprimiu ordenadamente em n commits ou você fez a apressadamente git reset --hard.

Agora todos os commits foram perdidos ou rebaseificados, simplesmente, eles não são mais reconhecíveis usando seus IDs de commit anteriores.

Se você quiser voltar a um estado de repo antes de fazer o rebase ou resetar –hard, você pode usar git reflog.

O Git mantém internamente um log de estado do seu HEAD e todas as mudanças que foram feitas nele.

git reflog

7b4ab0e HEAD@{0}: checkout: moving from 3-dummy to master
a256440 HEAD@
{1}: commit (amend): Fixes Dummy Issue
d848c34 HEAD@
{2}: commit: Fixes issue#3
09dca41 HEAD@{3}: commit: Issue 3 first cut
7b4ab0e HEAD@{4}: checkout: moving from master to 3-dummy
7b4ab0e HEAD@{5}: clone: from git@github.com:abishekk92/box.git

Se você percebeu, todas as mudanças no estado do HEAD são registradas. Depois de saber para qual estado queremos mover o HEAD,


git reset
--hard HEAD@{x}

Se você tiver alterações e não puder fazer um hard reset para um reflog específico, mas ainda quiser as alterações do commit perdido.

git cherry-pick <commit-hash>

E também o git limpa seu blob assim que atinge 5000 objetos, então não seria possível redefinir para um estado realmente antigo do HEAD, a menos que você tenha configurado o git para isso.