Reto 002 - Deshacer un commit conservando los cambios
Escenario
Acabas de hacer un commit local (que no has subido a ningún remoto), pero te das cuenta de que lo hiciste antes de tiempo: querías seguir editando. Tu objetivo es deshacer ese último commit pero conservar todos los cambios para poder seguir trabajando y volver a commitear después.
Como el commit es local y no publicado, es seguro reescribir la historia.
Cómo resolverlo
# 1. Ver el historial para confirmar cual es el ultimo commit
git log --oneline
# 9c8b7a6 Commit prematuro que quiero deshacer <- HEAD
# 1a2b3c4 Commit anterior (este se queda)
# 2. Deshacer el ultimo commit conservando los cambios EN STAGING
git reset --soft HEAD~1
# HEAD~1 significa "un commit antes del actual"
# --soft: deshace el commit pero deja los cambios preparados (staged)
# 3. Verificar: el commit ya no esta, pero los cambios siguen listos
git status
# Changes to be committed: (tus archivos siguen en staging)
git log --oneline
# 1a2b3c4 Commit anterior (este se queda)
Por qué funciona
git reset --soft HEAD~1 mueve el puntero de la rama un commit hacia atrás (HEAD~1), "quitando" el último commit del historial. El modo --soft es la clave: conserva los cambios en el staging area, listos para volver a commitear. Con --mixed (por defecto) quedarían sin stage; con --hard se borrarían (eso sí perderías el trabajo).
Solución completa
Ver solución comentada
# Opcion A: conservar los cambios EN STAGING (listos para recommitear)
git reset --soft HEAD~1
# Opcion B: conservar los cambios SIN STAGE (en el working directory)
git reset --mixed HEAD~1
# o simplemente: git reset HEAD~1 (mixed es el modo por defecto)
# Ahora puedes seguir editando y volver a commitear cuando estes listo
echo "mas contenido" >> archivo.txt
git add .
git commit -m "Version final con los cambios completos"
Clave: usa --soft o --mixed para conservar tu trabajo; nunca uses --hard aquí porque borraría los cambios. Y esto es seguro solo porque el commit era local: si ya lo hubieras publicado, usarías git revert en su lugar.