imagen

Git Revert

A veces hemos enviado uno o varios commits que ya fueron fusionados a la rama base del proyecto y por alguna razón (rompimos producción) y necesitamos "eliminar" ese cambio, para este escenario git nos provee del comando revert .

Este comando recibe el hash del commit que queremos revertir y genera un nuevo commit (con un nuevo hash)

Supongamos que enviamos el commit C301 que ya fue fusionado a la rama base y posterior a el ya fueron agregados nuevos commits.

Rama base, master o main 
C300----C301----C302----C303

Pero debemos "deshacer" los cambios que se aplicaron en el C301, debemos crear una nueva rama desde la rama base y hacer revert del commit usando git revert y esto genera un nuevo commit (B301) "eliminando" los cambios aplicados en el C301

La rama debería verse algo así:

Rama temporal que usaremos para hacer el revert
C300----C301----C302----C303----B301----

Luego hacemos un PR/MR a la rama base para llevarnos el revert a la rama base

Rama base, master o main 
C300----C301----C302----C303----B301----
                         \        /
                          \ B301 /
                          revert/h101

¿Por que simplemente no eliminamos el commit?

Cuando los cambios se fusionan en la rama base y estamos trabajando en equipo, las probabilidades de que nuestros compañeros hayan efectuado un git pull origin de dicha rama (llevándose ese hash/commit) son muy altas y eliminar un commit implicaría re calcular los HASH de los commits siguientes o en caso de eliminar solo el ultimo, la referencia del HEAD de la rama base cambiaría y cuando intenten hacer un nuevo pull o un merge tendrían conflictos con las referencias o lo que seria peor, al haberse llevado el commit que queremos eliminar, cuando envíen sus ramas a la rama base, el commit volverá a aparecer en la rama base.

Por lo anterior hacer un nuevo commit usando git revert <hash> es la manera "menos dolorosa" de redimir tu alma.