Saltar al contenido principal

Git Revertir Combinar Confirmar: Una guía con ejemplos

Aprende a deshacer de forma segura una fusión Git utilizando `git revert`, preservando el historial de confirmaciones y resolviendo posibles conflictos.
Actualizado 5 nov 2024  · 7 min de lectura

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

Desarrolla tus habilidades en Python para convertirte en un ingeniero de datos profesional.
Empieza Gratis

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.

Ilustración de cómo funciona git revert

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í:

Identificar el hash de confirmación con git log

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 revert crea 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.Explicación de lo que son ramas Git divergentes

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.

Ilustración de lo que ocurre cuando movemos la HEAD del <code data-mce-selected=

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

Cómo identificar que se utilizó el Avance rápido para fusionar

Para deshacer dicha fusión, sólo tenemos que mover la HEAD de la rama main de vuelta a donde estaba. Para ello, nosotros:

  1. Identifica el HEAD anterior utilizando el git reflog
  2. Restablece el HEAD al anterior utilizando git reset --hard , sustituyendo por el anterior HEAD.

La salida de git reflog tendrá este aspecto:

Encontrar la antigua referencia HEAD

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

Ilustración de lo que ocurre cuando desplazamos la HEAD hacia atrás

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. 

Ilustración de una confirmación 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:

Identificar el hash de la confirmación de fusión

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

Ilustración de lo que ocurre cuando revertimos una confirmación git merge

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:

  1. Git pausará la reversión: Tenemos que resolver manualmente los conflictos. Git marcará los archivos conflictivos y requerirá intervención.
  2. Resuelve los conflictos: Abrimos cada archivo conflictivo, resolvemos los conflictos marcados por Git y guardamos los cambios.
  3. Pon en escena los archivos resueltos: git add
  4. 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.


Photo of François Aubry
Author
François Aubry
LinkedIn
Enseñar siempre ha sido mi pasión. Desde mis primeros días como estudiante, busqué con entusiasmo oportunidades para dar clases particulares y ayudar a otros estudiantes. Esta pasión me llevó a realizar un doctorado, en el que también trabajé como ayudante de profesor para apoyar mis esfuerzos académicos. Durante esos años, encontré una inmensa satisfacción en el entorno tradicional del aula, fomentando las conexiones y facilitando el aprendizaje. Sin embargo, con la llegada de las plataformas de aprendizaje en línea, reconocí el potencial transformador de la educación digital. De hecho, participé activamente en el desarrollo de una plataforma de este tipo en nuestra universidad. Estoy profundamente comprometida con la integración de los principios de la enseñanza tradicional con metodologías digitales innovadoras. Mi pasión es crear cursos que no sólo sean atractivos e informativos, sino también accesibles para los alumnos en esta era digital.
Temas

Los mejores cursos de ingeniería de datos

programa

Ingeniero de datos

40 horas hr
Adquiere habilidades demandadas para ingerir, limpiar y gestionar datos de forma eficaz, así como para programar y supervisar canalizaciones, lo que te diferenciará en el campo de la ingeniería de datos.
Ver detallesRight Arrow
Comienza El Curso
Ver másRight Arrow
Relacionado

tutorial

Tutorial de Git Revert y Git Reset para principiantes

Una guía tutorial para principiantes que muestra cómo utilizar los comandos Git Revert y Reset.
Zoumana Keita 's photo

Zoumana Keita

10 min

tutorial

Tutorial de GIT Push y Pull

Aprende a realizar solicitudes de Git PUSH y PULL con GitHub Desktop y la línea de comandos.

Olivia Smith

13 min

tutorial

Tutorial de GitHub y Git para principiantes

Un tutorial para principiantes que muestra cómo funciona el control de versiones Git y por qué es crucial para los proyectos de ciencia de datos.
Abid Ali Awan's photo

Abid Ali Awan

17 min

tutorial

Git Prune: Qué es la poda Git y cómo usarla

La poda Git es un comando Git que elimina del repositorio los objetos que ya no son accesibles desde ninguna confirmación o rama, ayudando a liberar espacio en disco.
François Aubry's photo

François Aubry

5 min

tutorial

Git pull force: Cómo sobrescribir una rama local con una remota

Aprende por qué git pull --force no es la mejor forma de sobrescribir una rama local con la versión remota, y descubre el método adecuado utilizando git fetch y git reset.
François Aubry's photo

François Aubry

tutorial

Git rename branch: Cómo cambiar el nombre de una rama local o remota

Aprende a renombrar ramas Git locales y remotas utilizando el terminal o la interfaz gráfica de usuario (GUI) de clientes populares como GitHub.
François Aubry's photo

François Aubry

See MoreSee More