← Git

Reto de código

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.