Deshacer cambios en git


En este post vamos a ver las diferencias entre git reset y git revert y entender como deshacer cambios

Deshacer cambios en git
oscar Escrito por oscar 25 April 2025 91 0

Entender cómo deshacer cambios en Git es clave cuando estás trabajando en equipo o cometiste un error y querés volver atrás. En este post vamos a ver las diferencias entre git reset y git revert, y cuándo conviene usar cada uno, con ejemplos.

Antes de empezar

🛠️ git reset

Deshace commits o cambios locales, reescribiendo el historial, a continuación, dejo enlace de las documentaciones oficiales para que lean a detalle, la ides de este posr es hacer ejemplos practicos y no repetir documentacion:

Con git reset hay varios modos:

🔸 git reset --soft <commit>

  • Vuelve al commit especificado pero mantiene los cambios en el área de preparación (staging).
  • Ideal si te equivocaste al hacer un commit y querés corregirlo o modificar el mensaje.
git reset --soft HEAD~1

🔙 Elimina el último commit, pero los archivos siguen listos para hacer commit de nuevo.

🔸 git reset --mixed <commit> (por defecto)

  • Quita el commit y también saca los archivos del staging, pero los cambios siguen en tu directorio de trabajo.

git reset HEAD~1

🔸 git reset --hard <commit>

  • ⚠️ PELIGRO: Borra el commit, saca del staging y también elimina los cambios del directorio. No se puede recuperar fácilmente.
  • Útil si querés descartar por completo lo que hiciste.
git reset --hard HEAD~1

📌 git revert

Crea un nuevo commit que deshace los cambios de un commit anterior. No reescribe el historial. Ideal para trabajo colaborativo.

🧪 Ejemplo:

git revert <id-del-commit>

Esto no borra el commit, sino que hace otro commit "inverso".

git revert 91a1b7f 

✅ Se usa cuando ya hiciste push y querés deshacer sin romper el historial compartido.

🔄 Comparación rápida

Comando ¿Reescribe historial? ¿Afecta cambios locales? ¿Se recomienda en colaboración?
git reset ✅ Sí (cuidado con --hard) ✅ Sí ❌ No (puede causar conflictos)
git revert ❌ No ❌ No ✅ Sí

🧪 Ejercicio practico

1️⃣ Procedemos a crear un repositorio de prueba en nuestro local, y en este repositorio vamos a realizar varias confirmaciones con Confirmar cambios con git commit

Primero creamos el proyecto en un directorio que llamaremos proyecto-git

git init

Añadimos un archivo

echo "primera linea de texto" > README.md

Creamos una confirmación:

git add .
git commit -a -m "primer commit"

2️⃣ Al revisar el historial con git logs podemos ver los commit ya realizados

$ git log --oneline
ea2e974 (HEAD -> master) otra linea de texto
141a634 Añadimos un subtitulo
cd4bacd Añadimos una formula
e50b580 Añadimos un comando
6c6992f Añadimos un texto
2a7a450 primer commit

Tenemos una serie de commits en rama master, y el commit más reciente es ea2e974. Vamos a trabajar con el comando git reset, que sirve para mover el puntero HEAD y opcionalmente modificar el estado del área de staging y del directorio de trabajo.

Supongamos que quieres volver al commit cd4bacd (Añadimos una formula)

🎯 git reset --soft cd4bacd

  • Mueve HEAD al commit cd4bacd.
  • Mantiene todos los cambios posteriores (141a634, ea2e974) en el área de staging (index).
  • Ideal si quieres modificar los últimos commits (reordenar, combinar, etc.).

Resultado:

HEAD -> cd4bacd Cambios de 141a634 y ea2e974 siguen en el área de staging.

🎯 git reset --mixed cd4bacd (comportamiento por defecto)

  • Mueve HEAD al commit cd4bacd.
  • Elimina los commits posteriores del historial.
  • Los cambios de ea2e974 y 141a634 quedan como archivos modificados (unstaged) en tu working directory.

Resultado:

HEAD -> cd4bacd Cambios de commits posteriores visibles con `git status`, pero no en staging. 

🎯 git reset --hard cd4bacd

  • Mueve HEAD al commit cd4bacd.
  • Elimina por completo los commits posteriores (ea2e974, 141a634) y sus cambios del área de staging y del working directory.
  • Los cambios se pierden si no los guardaste.

Resultado:

HEAD -> cd4bacd Los commits posteriores y sus cambios desaparecen.

🧠 ¿Cuándo usar cuál?

  • 🧪 reset: Para deshacer commits locales antes de compartirlos (ideal en desarrollo).
  • 🔄 revert: Para deshacer commits ya compartidos (seguro en colaboración).

Comentario

Debe aceptar antes de enviar