Cuando trabajamos en equipo con Git, deshacer cambios puede ser un tema delicado, especialmente si ya hemos compartido nuestro trabajo en un repositorio remoto. Por eso, es fundamental conocer herramientas que nos permitan corregir errores sin afectar la colaboración. Una de las formas más seguras y efectivas para deshacer un commit es usando el comando git revert.
Imaginemos que nuestro diseñador gráfico ha hecho un commit con cambios en la plantilla de nuestra página web, pero el resultado no cumple con nuestras expectativas. Queremos deshacer ese cambio, pero sin causar conflictos con el trabajo que él también está haciendo en el repositorio. Aquí es donde git revert se convierte en nuestro aliado, porque a diferencia de git reset, que puede generar problemas de sincronización cuando otros colaboradores tienen commits diferentes, git revert crea un nuevo commit que invierte los cambios realizados previamente, manteniendo así la integridad del historial.
Para entender cómo funciona, primero podemos revisar qué cambios se hicieron en ese commit con git diff. Por ejemplo, si queremos comparar dos commits específicos, podemos usar:
git diff f5f0388 b4844b
Esto nos mostrará las líneas que se eliminaron y las que se añadieron. En nuestro caso, el diseñador eliminó una tipografía bonita y la sustituyó por otra menos atractiva, además de cambiar el tamaño de la letra. Las líneas eliminadas aparecen en rojo con un signo menos, y las añadidas en verde con un signo más.
El comando git revert hace exactamente lo contrario: vuelve a añadir las líneas que se eliminaron y elimina las que se añadieron, creando un commit que deshace el cambio anterior. Así, si complementamos un commit con su opuesto, el resultado es como si no hubiésemos hecho ningún cambio.
Para referirnos a commits de forma relativa, podemos usar la sintaxis HEAD~n, donde HEAD es el commit actual y n es el número de commits hacia atrás. Por ejemplo, HEAD~1 es el commit anterior a HEAD, y HEAD~2 dos commits atrás. Esto nos facilita trabajar con commits recientes sin tener que copiar sus hashes completos.
Para revertir un commit, simplemente ejecutamos:
git revert b4844b
o si queremos revertir el último commit:
git revert HEAD
Al hacerlo, Git abrirá un editor para que escribamos el mensaje del nuevo commit que deshace el cambio. Una vez guardado, el repositorio vuelve al estado deseado, pero con un historial limpio y sin conflictos para otros colaboradores.
Ahora bien, ¿qué pasa si queremos revertir varios commits? Si hacemos un git revert para cada uno, terminaremos con varios commits nuevos que empiezan con revert, lo que puede saturar el historial. Para evitar esto, podemos usar la opción -n o --no-commit, que aplica los cambios de revert pero no crea el commit automáticamente, dejándonos la posibilidad de agrupar varios reverts en uno solo.
Por ejemplo, para revertir los dos últimos commits en un único commit, haríamos:
git revert -n HEAD
git revert -n HEAD~1
git revert --continue
Con esto, los cambios de ambos commits se revierten y se preparan en el área de staging, y luego con git revert --continue finalizamos el proceso creando un solo commit que deshace ambos cambios.
En definitiva, git revert es una herramienta mucho más segura y cómoda para deshacer cambios en repositorios compartidos, ya que no altera el historial de manera destructiva, sino que añade nuevos commits que corrigen errores anteriores. Esto facilita la colaboración y evita conflictos que pueden surgir con comandos como git reset, especialmente cuando otros desarrolladores ya han sincronizado sus repositorios. Por eso, salvo que sepamos exactamente lo que hacemos y estemos trabajando en un entorno controlado, git revert debería ser nuestra opción preferida para corregir commits.