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.