Programación

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.

Enviar por WhatsApp

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.

Qué comando usar para cada cosa.Quiero…: Sacar un archivo de lo preparado; Descartar cambios sin confirmar; Corregir el último commit; Anular un commit ya publicado. Uso…: git restore --staged; git restore; git commit --amend; git revertCOMPARATIVAQuiero…Sacar un archivo de lo preparadoDescartar cambios sin confirmarCorregir el último commitAnular un commit ya publicadoUso…git restore --stagedgit restoregit commit --amendgit revert
Qué comando usar para cada cosa.

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.

Sacar un archivo del área de preparación.> git add * | > git restore --staged archivo.txt | El archivo vuelve a estar modificado, sin preparar.EN LA TERMINALTerminal>git add *>git restore --staged archivo.txtEl archivo vuelve a estar modificado, sin preparar.
Sacar un archivo del área de preparación.

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.

Antes de deshacer.Sí: git restore descarta cambios sin confirmar para siempre. Sí: Corrige con --amend solo commits locales. Sí: Usa revert si el commit ya se compartió. No: git reset --hard sin saber lo que haceLISTA RÁPIDAPiensa antes de ejecutargit restore descarta cambios sin confirmar para siempreCorrige con --amend solo commits localesUsa revert si el commit ya se compartiógit reset --hard sin saber lo que hace
Antes de deshacer.

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.