Cuatro casos, cuatro comandos. Busca tu situación y copia el comando que aparece debajo. Regla número cero: ¿ya hiciste push? Usa revert. En los demás casos damos por hecho que el commit sigue en local.
🎙️ Publicado y grabado:
git reset --soft HEAD~1
# el commit desaparece y todos los cambios vuelven al staging,
# listos para otro commit. no se pierde nada: es la opción segura.
git reset --hard HEAD~1
# ⚠ desaparecen el commit Y tus cambios. asegúrate de querer hacerlo.
# (¿borraste lo que no era? mira reflog al final: se puede recuperar)
git commit --amend -m "the message I meant to write"
# ¿olvidaste incluir un archivo? añádelo y enmienda sin editar:
git add forgotten.py
git commit --amend --no-edit
git revert HEAD
# crea un commit NUEVO que anula el anterior.
# el historial avanza y no fastidia al equipo. haz push.
git revert abc1234 # lo mismo para cualquier commit anterior, usando su hash
reset reescribe el historial. Si alguien ya descargó el historial anterior, tu force-push deja su trabajo huérfano y el commit puede volver la próxima vez que alguien haga push. De paso, te ganas una conversación bastante incómoda en la reunión diaria. revert deshace el contenido sin tocar el historial. En ramas compartidas, usa revert. Siempre.
git reset --soft HEAD~3 # los últimos 3 commits vuelven juntos al staging
# ahora puedes confirmarlos como un único commit limpio: squash casero
git reflog
# muestra cada posición por la que pasó HEAD, incluidos commits "borrados":
# a1b2c3d HEAD@{0}: reset: moving to HEAD~1
# f4e5d6c HEAD@{1}: commit: the one you want back ←
git reset --hard HEAD@{1} # volver al punto anterior al desastre
# git conserva los commits huérfanos unos 30 días. el pánico es opcional.
reset --soft HEAD~1 · descartarlos → reset --hard HEAD~1 · corregir el mensaje → --amend · ya publicado → revert HEAD · recuperar un desastre → reflog