Los tres árboles
Git rastrea tres "árboles": el commit HEAD, el índice (área de staging), y el árbol de trabajo (tus archivos en disco). git reset mueve el puntero del branch y opcionalmente reescribe el índice y el árbol de trabajo.
--soft: solo mover HEAD
git reset --soft HEAD~1
# Los cambios del último commit quedan staged
git commit -m "Mejor mensaje"
--mixed: también resetear el índice (predeterminado)
git reset HEAD~1
# Equivalente a --mixed; los cambios quedan unstaged pero en tus archivos
--hard: resetear todo
git reset --hard HEAD~1
# El último commit y los cambios del árbol de trabajo desaparecen
Una tabla de decisión
- ¿Quieres rehacer el último mensaje?
--soft HEAD~1luego commit de nuevo. - ¿Quieres unstagear todo?
--mixed(o sologit reset). - ¿Quieres descartar cambios locales y coincidir con el remote?
--hard origin/main.
Resetear un solo archivo
git reset HEAD path/to/file
git checkout -- path/to/file
git restore --staged path/to/file
git restore path/to/file
Reset vs revert
reset reescribe la historia moviendo el puntero del branch. revert crea un nuevo commit que deshace uno previo. Usa revert en branches compartidos.
Recuperar de un mal --hard
git reflog
git reset --hard HEAD@{1}