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
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.