Programa
Podemos poner en peligro una aplicación al fusionar código problemático, ya sea por integrar accidentalmente un trabajo inacabado en la rama principal o por pasar por alto un fallo crítico que se coló en las pruebas automatizadas.
En este artículo, te guiaré a través del proceso de utilización de git revert para deshacer una fusión de forma segura, garantizando que el historial de confirmaciones permanece intacto y se preserva la integridad del proyecto.
Conviértete en Ingeniero de Datos
Cómo git revert Obras
Podemos pensar en git revert como la versión de Git del comando deshacer. Sin embargo, el comando git revert no borra confirmaciones ni salta a un estado anterior de la rama. En su lugar, crea una nueva confirmación que revierte los cambios de una confirmación concreta.

La sintaxis para revertir una confirmación con el hash es:
git revert <commit_hash>
Podemos listar los commits junto con sus identificadores hash utilizando el comando git log. La salida de git log lista las confirmaciones de la más reciente a la más antigua, así:

Por ejemplo, para revertir la confirmación que implementa la función restar, utilizaríamos el comando
git revert 7ba24a3e62d4d37182428ccfaa070baa222b1151
Utilizando git revert podemos deshacer los cambios de una confirmación concreta sin afectar al historial de confirmaciones.
Ten en cuenta que git revert no es mágico, y dependiendo del historial de confirmaciones, puede dar lugar a un conflicto que haya que resolver manualmente.
Ventajas de git revert Sobre los cambios manuales
¿Por qué es útil git revert si podemos necesitar resolver un conflicto manualmente? ¿No sería más fácil deshacer manualmente los cambios? Veamos sus ventajas:
- Preserva el historial:
git revertcrea una nueva confirmación que deshace los cambios de una confirmación especificada preservando todo el historial de confirmaciones. Esto ayuda a mantener un historial transparente de cambios y anulaciones. - Inversión atómica: Garantiza que las inversiones sean atómicas y coherentes. Cuando borramos y confirmamos cambios manualmente, existe el riesgo de que se produzcan errores humanos.
- Conciencia de conflicto: Garantiza que se nos avise mediante conflictos si hay alguna integración o cambio que dependa de la confirmación original. Esto puede parecer incómodo, pero evita efectos secundarios no deseados.
- Metadata: La nueva confirmación creada por git revert incluye metadatos y un mensaje de confirmación que describe contextualmente lo que se ha revertido, ayudando a comprenderlo en el futuro. Sin
git revert, este contexto podría perderse.
Revertir una Fusión en Diferentes Escenarios
En esta sección aprenderemos a deshacer una fusión. Por poner un ejemplo, supondremos que estamos fusionando una rama llamada feature en la rama main ejecutando el comando desde la rama main:
git merge feature
Lo que aprendamos aquí puede aplicarse a dos ramas cualesquiera sustituyendo los nombres adecuadamente.
Revertir una fusión que no tiene confirmación asociada
El comando git merge no siempre crea una nueva confirmación. Sólo se crea una confirmación si la rama main ha divergido de la rama feature. Como git revert requiere un commit para operar una, no podemos utilizarla en este caso.
Las ramas main y feature divergen cuando se crean nuevos commits en main que no son ancestros de la rama feature. En otras palabras, se crearon nuevos commits en main después de que se creara feature.
Si las ramas no han divergido, cuando ejecutemos el comando git merge feature en la rama principal, Git utilizará el avance rápido para fusionar. Esto significa que desplaza el HEAD de la rama main al HEAD de la rama feature.

Podemos observar que esto ha ocurrido mirando el resultado de git merge:

Para deshacer dicha fusión, sólo tenemos que mover la HEAD de la rama main de vuelta a donde estaba. Para ello, nosotros:
- Identifica el
HEADanterior utilizando elgit reflog - Restablece el
HEADal anterior utilizandogit reset --hard, sustituyendopor el anteriorHEAD.
La salida de git reflog tendrá este aspecto:

Podemos identificar la anterior HEAD fijándonos en la línea que dice "checkout: moving from feature to main" (escribe feature y main porque esos son los nombres de nuestras ramas).
En este caso, la cabeza anterior es fe59838. Para mover el HEAD de la rama principal de nuevo a ella y deshacer la fusión, utilizamos entonces el comando
git reset --hard fe59838

Revertir una fusión que tiene una confirmación asociada
Si la rama main y la rama feature han divergido, cuando fusionamos dos ramas, se crea un nuevo commit, llamado commit de fusión.

La confirmación de fusión aplica los cambios de una rama a otra. En este caso, los cambios en feature se aplican a la rama main.
Para revertir los cambios en la rama main, utilizamos git revert en la confirmación de fusión. Esto creará una nueva confirmación que deshará los cambios introducidos en la rama main con la fusión, restaurando efectivamente el estado de la rama principal al que tenía antes de la fusión.
En primer lugar, tenemos que identificar el hash de la confirmación de fusión. Podemos hacerlo utilizando el comando git log:

Como la confirmación de fusión tiene dos padres, la sintaxis de git revert es ligeramente diferente. Necesitamos utilizar la opción -m 1 para especificar que queremos revertir los cambios relativos a la rama main:
git revert -m 1 b8dab2c8611e324ed0d273133987415350e6d10d

Resolución de conflictos al revertir un commit
A veces pueden surgir conflictos al revertir una confirmación, sobre todo si la confirmación que se está revirtiendo entra en conflicto con cambios posteriores en el código base. En tales casos:
- Git pausará la reversión: Tenemos que resolver manualmente los conflictos. Git marcará los archivos conflictivos y requerirá intervención.
- Resuelve los conflictos: Abrimos cada archivo conflictivo, resolvemos los conflictos marcados por Git y guardamos los cambios.
- Pon en escena los archivos resueltos:
git add - Continúa la reversión:
git revert --continue
Conclusión
Utilizar git revert para deshacer confirmaciones de fusión garantiza que cada cambio y corrección quede documentado en el historial de confirmaciones.
Además, comprender los escenarios apropiados para aplicar git reset frente a git revert nos permite tomar mejores decisiones, especialmente cuando consideramos flujos de trabajo colaborativos o cambios sólo locales.
Puedes leer más sobre este tema en la sección de preguntas más frecuentes. Si quieres aprender más sobre Git, te recomiendo estos recursos:
Preguntas frecuentes
¿Puedo revertir una fusión ya realizada con git revert?
Sí, ese es el principal caso de uso de git revert en las fusiones. Si los cambios son locales, entonces git reset es una forma más fácil de deshacer la fusión.
Para que los demás vean los cambios, tenemos que empujarlos al repositorio remoto. Así que, para deshacer una fusión ya realizada, lo hacemos:
git revert -m 1
git push origin
Sustituyendo por el hash de la confirmación de la fusión y por el nombre de la rama donde se realizó la fusión.
¿Se borrará el commit merge después de usar git revert?
No. La confirmación de fusión permanece en el historial, pero sus cambios son deshechos por la nueva confirmación. El objetivo de deshacer una fusión con git revert es preservar el historial de confirmaciones.
¿Existen formas distintas de git revert para deshacer una fusión?
Una forma alternativa de deshacer una fusión es utilizar git reset. Este método restablece la rama a un estado anterior a la confirmación de fusión. Este enfoque es más intrusivo y puede causar problemas si otros colaboradores ya han basado su trabajo en los commits que pensamos resetear. Por tanto, sólo se recomienda cuando estamos seguros de que no afectará a los demás.
git reset --hard
git push --force
Sustituyendo por el hash de la confirmación a la que queremos volver.
¿Cuándo debo usar git reset para deshacer una fusión?
Te recomiendo que sólo utilices git reset para deshacer una fusión cuando ésta sólo se haya producido localmente y aún no se haya enviado.