W3docs

git revert

Aprende sobre el comando git revert, sus diferencias con git reset, las opciones disponibles y ejemplos de uso prácticos.

git revert

Esta página explica qué hace git revert, las opciones que acepta, un ejemplo completo paso a paso, cómo se diferencia de git reset, cómo revertir un commit de fusión y cómo resolver los conflictos que puede producir una reversión.

Descripción

El comando git revert es una operación de deshacer que avanza hacia adelante en el historial. A diferencia de comandos como git reset, no reescribe el historial. En lugar de eliminar o mover commits, calcula la inversa de los cambios que introdujo el commit objetivo y registra esa inversa como un nuevo commit en la parte superior de la rama actual.

Dado que nada se elimina del historial, git revert es la forma segura de deshacer trabajo que ya has enviado a un repositorio compartido: todos los que tienen el commit original lo conservan, y la reversión simplemente añade un commit de seguimiento que lo cancela. Esto preserva el historial completo de revisiones, lo cual es importante para la trazabilidad y la colaboración limpia.

Algunas cosas a tener en cuenta:

  • Una reversión necesita una referencia de commit para saber qué deshacer. Ejecutar git revert sin argumento falla.
  • Una reversión deja el árbol de trabajo en el estado que tendría si ese commit nunca hubiera ocurrido (relativo a los commits circundantes), no necesariamente una diferencia vacía, ya que commits posteriores pueden seguir tocando las mismas líneas.
  • Revertir una reversión vuelve a aplicar el cambio original, ya que la inversa de una inversa es el original.

Cuándo usar git revert

Usa git revert cuando:

  • El commit que quieres deshacer ya está publicado (enviado, abierto en un pull request o descargado por compañeros de equipo).
  • Quieres deshacer un commit específico en algún punto del historial sin tocar los commits que vinieron después.
  • Necesitas un registro auditable de que un cambio fue revertido deliberadamente.

Prefiere git reset cuando el commit es local y no publicado y simplemente quieres eliminarlo, o git commit --amend cuando solo necesitas corregir el commit más reciente (no enviado).

Opciones

-e --editAbre el editor del sistema configurado y te solicita que edites el mensaje del commit antes de confirmar la reversión. Opción predeterminada.
--no-editHace que la reversión no abra el editor (lo opuesto a la opción -e).
-n --no-commitAñade las modificaciones inversas al Índice de Preparación y al Directorio de Trabajo en lugar de crear un nuevo commit.
-m <parent-number>Para revertir commits de fusión, especifica el commit padre contra el que revertir.

Ejemplos

# Stage the reverted changes without committing them (useful for review)
git revert -n HEAD

# Revert a merge commit against its first parent
git revert -m 1 <merge-commit-hash>

Cómo funciona

Al igual que git checkout y git reset, git revert también toma un commit específico, pero no mueve los punteros de referencia hacia ese commit. La operación de reversión toma el commit especificado, invierte las modificaciones de ese commit y crea un nuevo commit de reversión.

A continuación, un ejemplo de creación de un repositorio:

comando git revert

mkdir git_revert_example
cd git_revert_example/
git init .
#Initialized empty Git repository in /git_revert_example/.git/
touch w3docs_file
git add w3docs_file
git commit -m "original commit"
#[master (root-commit) 299b15f] original commit
#1 file changed, 0 insertions(+), 0 deletions(-)
#create mode 100644 w3docs_file
echo "original content" >> w3docs_file
git commit -m "add new content to w3docs_file"
#[master 3602d88] add new content to w3docs_file
#1 file changed, 1 insertion(+)
echo "prepended line content" >> w3docs_file
git commit -m "prepend content to w3docs file"
#[master 86bb32e] prepend content to w3docs file
#1 file changed, 1 insertion(+)
git log --oneline
#86bb32e prepend content to w3docs file
#3602d88 add new content to w3docs file
#299b15f original commit

En este ejemplo, se inicializa un repositorio en un directorio recién creado llamado git_revert_example. Se realizan 3 commits al repositorio en los que se añade un archivo llamado w3docs_file, cuyo contenido ha sido modificado dos veces. Usamos git log al final de la configuración del repositorio para mostrar los 3 commits en el historial. Ahora podemos invocar git revert:

git revert

git revert HEAD
#[master b9cd081] Revert "prepend content to w3docs file"
#1 file changed, 1 deletion(-)

git revert no funcionará sin pasar una referencia de commit. En el ejemplo anterior pasamos la referencia HEAD para revertir el último commit. Una reversión crea un nuevo commit y abre el editor del sistema configurado para que puedas editar su mensaje (pasa --no-edit para aceptar el predeterminado). Podemos usar git log y ver el nuevo commit añadido encima del historial anterior:

git log --oneline

git log --oneline
#b9cd081 Revert "prepend content to w3docs file"
#86bb32e prepend content to w3docs file
#3602d88 add new content to w3docs_file
#299b15f original commit

Después de la reversión, el commit "prepend" (86bb32e) sigue en el historial del proyecto. git revert añadió un nuevo commit (b9cd081) que deshace sus cambios en lugar de eliminarlo. Esa es la diferencia clave con git reset.

Revertir sin confirmar

Pasa -n (--no-commit) cuando quieras deshacer varios commits en una sola reversión combinada, o inspeccionar los cambios inversos antes de registrarlos. Git prepara las modificaciones inversas pero se detiene antes de crear un commit, dejándote en control:

# Stage the inverse of the last two commits, then commit once
git revert -n HEAD~1 HEAD
git status        # review the staged changes
git commit -m "Roll back the last two changes"

Cuando listas más de un commit (o un rango), Git aplica una reversión por cada uno. Sin -n crearía un commit por cada reversión; con -n se combinan en el único commit que tú mismo creas.

Revertir un commit de fusión

Un commit de fusión tiene dos padres, por lo que Git no puede determinar por sí solo qué lado quieres conservar. Debes indicar qué padre representa la "línea principal" a la que revertir usando -m <parent-number>. Los números de padre comienzan en 1:

# Undo a merge, keeping the first parent (usually the branch you merged into)
git revert -m 1 <merge-commit-hash>

En un escenario típico de "fusionar una rama de características en main", el padre 1 es main y el padre 2 es la rama de características, por lo que -m 1 descarta los cambios de la rama de características.

Advertencia

Revertir una fusión registra que los commits fusionados fueron deshechos. Si más tarde intentas fusionar esa rama nuevamente, Git verá esos commits como ya fusionados y los omitirá. Para reintroducir el trabajo generalmente tienes que revertir la reversión primero. Prefiere revertir commits individuales en lugar de revertir una fusión cuando sea posible.

Resolver un conflicto de reversión

Si commits posteriores modificaron las mismas líneas que la reversión está intentando deshacer, Git se detiene con un conflicto, igual que un conflicto de merge. Edita los archivos marcados, prepáralos y luego finaliza la reversión en curso:

git revert HEAD~2
# CONFLICT (content): Merge conflict in w3docs_file
# error: could not revert 4f2a1c0... change w3docs_file
# resolve the conflict markers in the file, then:
git add w3docs_file
git revert --continue   # records the revert commit

# Or, to back out of the whole operation:
git revert --abort

Reset vs. revert

El comando git revert deshace un commit añadiendo un nuevo commit, mientras que git reset reescribe el historial moviendo el puntero de la rama hacia atrás y descartando los commits posteriores.

git revert

git revert1

Revertir es la opción segura para commits que ya han sido publicados en un repositorio compartido, y permite apuntar a un commit específico en cualquier lugar del historial. Evita git revert en commits privados y no publicados donde git reset es más simple y limpio.

Comandos relacionados

  • git reset — mueve el puntero de la rama y descarta commits posteriores (deshacer que reescribe el historial).
  • git commit --amend — corrige el commit más reciente no enviado.
  • git checkout — descarta los cambios no confirmados en el árbol de trabajo.
  • git cherry-pick — la operación contraria: aplica los cambios de un commit en la rama actual.

Práctica

Práctica
¿Cuáles son las características y opciones del comando 'git revert'?
¿Cuáles son las características y opciones del comando 'git revert'?
Was this page helpful?