git / Guías

Deshacer un commit Git: ¿reset, revert o restore?

Decide qué quieres conservar: las modificaciones, el historial de commits o ambos. Comprueba después si alguien ya recibió el commit.

Los ejemplos usan Bash; consulta las referencias para los detalles de tu entorno.

Elige según el estado del trabajo

SituaciónComandoResultado
Quitar un archivo del staginggit restore --staged -- file.txtConserva los cambios en el archivo.
Deshacer el último commit local manteniendo el staginggit reset --soft HEAD~1Retrocede la rama un commit.
Invertir un commit compartidogit revert <commit>Añade un commit que invierte el cambio.

Comprueba git status y git log --oneline -5. Este reset requiere un commit anterior y una rama privada. Un commit de merge necesita otra evaluación: no elijas su padre principal al azar.

Prueba el reset en un repositorio de ejemplo

Usa un directorio nuevo y vacío, fuera del proyecto. El ejercicio crea dos commits, quita el segundo del historial de la rama y mantiene su modificación en el staging.

git init -b main
git config user.name "DevSheet Demo"
git config user.email "demo@example.invalid"
printf "one\n" > note.txt
git add note.txt
git commit -m "First note"
printf "two\n" >> note.txt
git commit -am "Second line"
git reset --soft HEAD~1
git status --short
git diff --cached

Resultado esperado: M note.txt en el estado breve y una línea two añadida en el diff del staging. El archivo conserva las dos líneas.

Invierte un commit compartido

Con el directorio de trabajo limpio, revisa el commit y sustituye el hash de ejemplo por el tuyo. Git suele abrir un editor para el mensaje del nuevo commit.

git show a1b2c3d
git revert a1b2c3d
git status

Los cambios posteriores pueden causar conflictos. Resuélvelos y usa git revert --continue, o cancela con git revert --abort. Revert no borra el commit original ni un secreto que contenía.

Evita perder cambios

git reset --hard puede descartar cambios sin commit y sobrescribir rutas no rastreadas que obstaculizan la operación. No hace falta en este ejercicio.

git restore -- file.txt reemplaza cambios fuera del staging; --staged actúa sobre el índice. Si moviste una rama por error, revisa git reflog y crea una rama de recuperación en el commit anterior comprobado. Reflog no recupera todos los cambios sin commit.

Referencias

Todas las guías