git-revert-deshacer-cambios-publicos

Deshaciendo cambios público con Git Revert

  • 5 min

El comando git revert es un comando que deshace de forma limpia las modificaciones de un commit con un nuevo commit.

En la entrada anterior vimos como usar git reset para limpiar la historia de nuestro Git local. Pero reset solo se puede usar si no has compartido tu código.

Pero, ¿qué pasa si metes la pata, haces git push, tus compañeros se bajan el código y luego te das cuenta del error?

Pero si por accidente has roto código, y lo has metido en el servidor y tus compañeros de equipo ya lo habían bajado y asimilado, tocar los historiales estallaría por los aires en problemas de todos. No puedes borrar ese commit.

Deberás enmendarla. La única fórmula es aplicar un paso más donde aplicaremos los cambios inversos de los daños arreglando el mal. Para eso está git revert.

El concepto del “Anti-Commit”

Git Revert no borra nada. Crea un nuevo commit que hace exactamente lo contrario que el commit que quieres eliminar.

Si el commit original añadía una línea, el revert la borra. Si borraba un archivo, el revert lo crea de nuevo.

Piensa en Git como un libro de contabilidad.

  • El Commit A dice: “Ingreso 100€”.
  • El Commit B dice: “Gasto 20€”.

Si quieres anular el gasto de 20€ pero el libro de cuentas ya está cerrado y auditado, no puedes arrancar la página (eso sería hacer un reset). Lo que haces es añadir una línea nueva que compense el error.

  • Nuevo Commit C: “Devolución de 20€”.

Eso es exactamente lo que hace git revert.

Reset vs Revert

Esta es la tabla que debes tener en mente para elegir entre ellos:

Característicagit resetgit revert
¿Qué hace?Mueve el puntero atrás (borra historia)Crea un commit nuevo (añade historia)
SeguridadDestructivoNo destructivo
¿Dónde usarlo?Ramas locales / privadasRamas públicas / compartidas
Caso de usoMe he equivocado en mi equipoHe subido un bug a producción ayer

Cómo usarlo

Supongamos que el historial es este:

a1b2c3d (HEAD -› main) Añadir estilos CSS (ERROR: rompe el diseño) 98f1e2a Funcionalidad terminada

El commit a1b2c3d es un desastre y ya está en producción. Para anularlo:

git revert a1b2c3d
Copied!

Al ejecutarlo, pasará lo siguiente:

Git calculará el inverso de los cambios de ese commit.

Se abrirá tu editor de texto pidiéndote un mensaje (por defecto: “Revert “Añadir estilos CSS”…”).

Guardas y cierras.

Ahora tu historial se ve así:

f5g6h7j (HEAD -> main) Revert “Añadir estilos CSS” a1b2c3d Añadir estilos CSS 98f1e2a Funcionalidad terminada

El error sigue en la historia (commit a1b2c3d), pero el código actual ya no lo tiene porque el commit f5g6h7j lo ha anulado. La historia avanza, el código retrocede.

Revertir varios commits

A veces el error no fue solo el último commit, sino los últimos tres. Puedes revertir un rango usando ..:

git revert HEAD~3..HEAD
Copied!

Esto creará 3 commits de reversión, uno por cada commit anulado

Si prefieres que Git no cree 3 commits de reversión, sino que te deje los cambios “preparados” en tu zona de trabajo para que tú hagas un único commit que anule todo a la vez, usa la opción --no-commit (o -n):

git revert -n HEAD~3..HEAD
git commit -m "Revertir funcionalidad X completa"

Copied!