Cómo deshacer cambios en Git: restore, amend y revert
git restore, git commit --amend y git revert: cuándo usar cada uno y qué puede perderse, según la documentación oficial de Git.
En Git hay un comando distinto según qué quieras deshacer y en qué punto estés: git restore --staged para sacar un archivo del área de preparación, git restore para descartar cambios sin confirmar, git commit --amend para corregir el último commit y git revert para anular un commit que ya compartiste. Y todos menos el último pueden hacerte perder trabajo, así que conviene saber cuál usar.
Sacar un archivo del área de preparación
Imagina que has hecho git add * y has preparado un archivo que querías confirmar aparte. git status te recuerda cómo deshacerlo:
git restore --staged archivo.txt
El archivo vuelve a estar modificado pero sin preparar; tus cambios no se pierden. Desde Git 2.23, git restore es la forma moderna de hacerlo. En versiones anteriores, y en la versión en español de Pro Git, se usaba git reset HEAD archivo.txt.
Descartar los cambios de un archivo
Si no quieres conservar los cambios de un archivo desde la última confirmación:
git restore archivo.txt
Cuidado: es destructivo. Los cambios locales de ese archivo se pierden y no se pueden recuperar con Git porque nunca se confirmaron. En versiones antiguas, el equivalente era git checkout -- archivo.txt.
La documentación indica además que git restore puede restaurar el contenido de otro commit con la opción --source.
Corregir el último commit
Si te has dejado un archivo fuera o te has equivocado en el mensaje:
git add archivo_olvidado
git commit --amend
Terminas con un solo commit: el segundo sustituye al primero. Pro Git lo explica así: no estás tanto corrigiendo el commit como reemplazándolo por uno nuevo, como si el anterior nunca hubiera existido. Por eso conviene corregir solo commits locales que aún no has publicado.
Deshacer un commit ya publicado: git revert
Cuando el commit ya está en el repositorio compartido, no lo reescribas: usa git revert. Según la documentación, crea commits nuevos que invierten el efecto de commits anteriores, a menudo de uno solo defectuoso, así que el historial se conserva. Requiere que tu directorio de trabajo esté limpio, sin modificaciones respecto a HEAD.
git revert <commit>
Y git reset
git reset mueve la rama a otro commit y puede ser peligroso, sobre todo con la opción --hard, según Pro Git. Si estás aprendiendo, quédate con restore, amend y revert.
Resumen
| Quiero… | Comando | ¿Se pierde algo? |
|---|---|---|
| Sacar un archivo de lo preparado | git restore --staged archivo |
No |
| Descartar cambios sin confirmar | git restore archivo |
Sí, esos cambios |
| Corregir el último commit (local) | git commit --amend |
Sustituye al commit anterior |
| Anular un commit ya publicado | git revert <commit> |
No: añade un commit nuevo |
Si estás empezando con Git, mira primero Git y GitHub: primeros pasos y ramas, merge y pull request. Y si no te manejas con la terminal, repasa los comandos básicos.
Fuentes consultadas
- Fundamentos de Git: Deshacer cosas (Pro Git) (Git (Pro Git))
- Git Basics: Undoing Things (Pro Git) (Git (Pro Git))
- git-restore (Documentación de Git)
- git-revert (Documentación de Git)
Guía de PortalTec: https://www.portaltec.eu/articulos/deshacer-cambios-git/
