GitMuninnGitMuninn
← Volver al blog

Cómo deshacer un commit en Git: reset, revert y amend

El comando correcto para cada situación: corregir el último commit, deshacer commits locales, revertir algo que ya está en el remoto y recuperar lo que parecía perdido.

¿Hiciste commit del archivo equivocado, escribiste mal el mensaje o mandaste a main algo que no debías? A todos nos pasó. Git tiene varias formas de deshacer un commit, y elegir la correcta depende de una pregunta: ¿ese commit ya se envió al remoto?

Resumen rápido

  • Corregir el último commit, todavía sin enviar: git commit --amend.
  • Deshacer commits locales, todavía sin enviar: git reset.
  • Deshacer un commit que ya está en el remoto: git revert.
  • Recuperar algo que parecía perdido: git reflog.

Corregir el último commit con amend

Si el problema es solo el mensaje, o si olvidaste incluir un archivo, --amend reemplaza el último commit por una versión corregida:

# solo cambiar el mensaje
git commit --amend -m "Corrige validación del email"

# incluir un archivo olvidado, manteniendo el mensaje
git add src/validacao.ts
git commit --amend --no-edit

--amend crea un commit nuevo en lugar del anterior. Por eso, úsalo solo en commits que todavía no enviaste. Si ya lo enviaste, vas a necesitar git push --force-with-lease, y eso complica las cosas a quien ya descargó el commit anterior.

Deshacer commits locales con reset

git reset mueve el branch a un commit anterior. La diferencia entre los modos es qué pasa con los cambios de los commits deshechos:

git reset --soft HEAD~1   # deshace el commit y deja los cambios en el stage
git reset --mixed HEAD~1  # deshace el commit y deja los cambios fuera del stage (por defecto)
git reset --hard HEAD~1   # deshace el commit y borra los cambios
  • --soft sirve para juntar varios commits en uno: deshaces los últimos y haces commit de nuevo.
  • --mixed sirve para rehacer el commit eligiendo mejor los archivos.
  • --hard descarta el trabajo. Úsalo con cuidado y solo cuando estés seguro.

HEAD~1 significa un commit antes del actual. HEAD~3 retrocede tres commits. También puedes usar el hash: git reset --soft a1b2c3d.

Deshacer un commit ya enviado con revert

Cuando el commit ya está en el remoto y otras personas pueden haberlo descargado, no reescribas el historial. Usa git revert, que crea un commit nuevo que hace exactamente lo contrario:

git revert a1b2c3d
git push

El historial sigue mostrando el commit original y, después de él, el commit que lo deshizo. Nadie del equipo tiene que hacer nada especial.

Para revertir un commit de merge, dile a Git qué lado mantener con -m 1, que normalmente es el branch principal:

git revert -m 1 <hash-del-merge>

Recuperar lo que parecía perdido con reflog

¿Hiciste un reset --hard y te arrepentiste? Git guarda por un tiempo todas las posiciones por las que pasó HEAD. git reflog muestra esa lista:

git reflog
# a1b2c3d HEAD@{0}: reset: moving to HEAD~1
# f4e5d6c HEAD@{1}: commit: Agrega exportación a CSV

git reset --hard f4e5d6c

Esto funciona con commits que existieron en tu repositorio local. Los cambios que nunca llegaron a un commit y se borraron con --hard no aparecen en el reflog.

Deshacer cambios que todavía no son un commit

  • Descartar los cambios de un archivo: git restore src/app.ts.
  • Sacar un archivo del stage sin perder el cambio: git restore --staged src/app.ts.
  • Guardar todo para después: git stash, y recuperarlo con git stash pop.

Deshacer commits en GitMuninn

En GitMuninn, el grafo muestra exactamente dónde está cada commit y en qué branches ya entró. Ves si el commit ya llegó al remoto antes de decidir entre reset y revert, y el historial de cada archivo está a un clic.

Mira tus branches en GitMuninn.

Entra en la lista de lanzamiento y recibe 50% de descuento en Pro y Business por 12 meses.

Plan de interés

Para macOS, Windows y Linux. Sin spam, sal cuando quieras.