Deshacer cambios

Intermedio
Git
Git
Actualizado: 24/08/2025

Deshacer cambios no confirmados

En el desarrollo diario con Git, es común realizar modificaciones en archivos que posteriormente queremos descartar. Git proporciona comandos específicos para deshacer cambios que aún no han sido confirmados mediante un commit, permitiendo restaurar archivos a su estado anterior de forma segura.

Descartar cambios en archivos modificados con git restore

El comando git restore es la herramienta moderna para descartar modificaciones en archivos del directorio de trabajo. Este comando permite restaurar archivos a su estado en el último commit, eliminando cualquier cambio no guardado.

Sintaxis básica:

git restore <archivo>

Ejemplo práctico:

Supongamos que has modificado un archivo config.js y quieres descartar todos los cambios:

# Ver el estado actual
git status

# Salida:
# modified:   config.js

# Descartar los cambios
git restore config.js

# Verificar que los cambios se han descartado
git status

# Salida:
# nothing to commit, working tree clean

Para restaurar múltiples archivos simultáneamente:

# Restaurar archivos específicos
git restore archivo1.js archivo2.css

# Restaurar todos los archivos modificados
git restore .

El comando git restore también permite restaurar archivos desde un commit específico:

# Restaurar desde un commit específico
git restore --source=HEAD~2 config.js

# Restaurar desde una rama específica
git restore --source=main config.js

Quitar archivos del staging area con git reset

Cuando has añadido archivos al staging area con git add pero quieres quitarlos sin perder las modificaciones, git reset es la herramienta adecuada.

Sintaxis para quitar archivos del staging:

git reset <archivo>

Ejemplo práctico:

# Añadir archivos al staging area
git add database.js styles.css

# Ver el estado
git status

# Salida:
# Changes to be committed:
#   new file:   database.js
#   modified:   styles.css

# Quitar un archivo específico del staging
git reset database.js

# Verificar el resultado
git status

# Salida:
# Changes to be committed:
#   modified:   styles.css
# Untracked files:
#   database.js

Para quitar todos los archivos del staging area:

# Quitar todos los archivos del staging
git reset

# O de forma más explícita
git reset HEAD

Combinando git restore y git reset

En situaciones reales, es común necesitar ambos comandos. Por ejemplo, cuando quieres deshacer completamente cambios que ya están en el staging area:

# Situación: archivo modificado y añadido al staging
git add important.js
git status

# Salida:
# Changes to be committed:
#   modified:   important.js

# Paso 1: Quitar del staging area
git reset important.js

# Paso 2: Descartar las modificaciones
git restore important.js

# Verificar que todo está limpio
git status

# Salida:
# nothing to commit, working tree clean

Casos de uso prácticos

Escenario 1: Experimento fallido

Cuando has estado experimentando con código y quieres volver al estado estable:

# Descartar todos los cambios experimentales
git restore .

Escenario 2: Staging selectivo

Cuando has añadido demasiados archivos al staging y quieres ser más selectivo:

# Quitar todos los archivos del staging
git reset

# Añadir solo los archivos necesarios
git add feature.js tests/feature.test.js

Escenario 3: Corrección de errores de staging

Cuando has añadido archivos por error al staging area:

# Quitar archivo específico que no debería estar
git reset config/secrets.env

# El archivo mantiene sus modificaciones pero no se incluirá en el commit

Es importante recordar que git restore elimina permanentemente los cambios no confirmados, mientras que git reset solo mueve archivos entre el staging area y el directorio de trabajo, preservando las modificaciones.

Corregir y revertir commits

Una vez que los cambios han sido confirmados mediante commits, Git ofrece diferentes estrategias para corregir errores o deshacer modificaciones. La elección del método depende de si los commits han sido compartidos con otros desarrolladores o permanecen únicamente en el repositorio local.

Corregir el último commit con git commit --amend

El comando git commit --amend permite modificar el último commit realizado, siendo útil para corregir mensajes de commit o añadir archivos olvidados.

Corregir el mensaje del último commit:

# Cambiar el mensaje del último commit
git commit --amend -m "Nuevo mensaje corregido"

Añadir archivos al último commit:

# Añadir archivo olvidado al último commit
git add archivo_olvidado.js
git commit --amend --no-edit

# El flag --no-edit mantiene el mensaje original

Ejemplo práctico completo:

# Situación: commit realizado pero falta un archivo
git commit -m "Implementar validación de formularios"

# Nos damos cuenta de que faltó incluir el archivo de estilos
git add styles/form-validation.css
git commit --amend -m "Implementar validación de formularios con estilos"

# El commit original es reemplazado por el nuevo

Deshacer commits locales con git reset

El comando git reset permite deshacer commits que aún no han sido enviados al repositorio remoto. Ofrece tres modos principales que determinan qué sucede con los cambios.

git reset --soft:

Deshace el commit pero mantiene los cambios en el staging area:

# Deshacer el último commit manteniendo cambios en staging
git reset --soft HEAD~1

# Verificar el estado
git status

# Salida:
# Changes to be committed:
#   modified:   feature.js
#   new file:   test.js

git reset --mixed (por defecto):

Deshace el commit y mueve los cambios al directorio de trabajo:

# Deshacer el último commit, cambios van al working directory
git reset HEAD~1

# Equivalente a:
git reset --mixed HEAD~1

git reset --hard:

Deshace el commit y elimina completamente los cambios:

# ⚠️ PELIGROSO: Elimina el commit y todos los cambios
git reset --hard HEAD~1

Ejemplo de uso seguro de reset:

# Situación: últimos 2 commits necesitan ser reorganizados
git log --oneline

# Salida:
# a1b2c3d Fix typo in documentation
# e4f5g6h Add user authentication
# h7i8j9k Initial project setup

# Deshacer los últimos 2 commits manteniendo cambios
git reset --soft HEAD~2

# Los cambios de ambos commits están ahora en staging
git status

# Crear nuevos commits más organizados
git commit -m "Add complete user authentication system"

Revertir commits publicados con git revert

Cuando los commits ya han sido compartidos con otros desarrolladores, usar git reset puede causar problemas. En estos casos, git revert crea un nuevo commit que deshace los cambios de commits anteriores.

Sintaxis básica:

# Revertir un commit específico
git revert <hash-del-commit>

# Revertir el último commit
git revert HEAD

Ejemplo práctico:

# Ver el historial
git log --oneline

# Salida:
# f9e8d7c Add payment processing
# c6b5a4d Update user interface
# 3a2b1c0 Fix database connection

# Revertir el commit de payment processing
git revert f9e8d7c

# Git abre el editor para el mensaje del commit de reversión
# Mensaje por defecto: "Revert 'Add payment processing'"

Revertir múltiples commits:

# Revertir un rango de commits
git revert HEAD~3..HEAD

# Revertir múltiples commits específicos
git revert f9e8d7c c6b5a4d

Diferencia clave: reset vs revert

La diferencia fundamental entre estos comandos radica en cómo manejan el historial:

git reset:

  • Cambia la historia del repositorio
  • Elimina commits del historial
  • Solo debe usarse en commits no publicados
  • Más eficiente pero potencialmente destructivo

git revert:

  • Preserva la historia del repositorio
  • Añade nuevos commits que deshacen cambios
  • Seguro para commits ya publicados
  • Mantiene un registro completo de cambios

Ejemplo comparativo:

# Historial inicial
# A -> B -> C -> D (HEAD)

# Usando git reset --hard HEAD~2
# A -> B (HEAD)
# Los commits C y D desaparecen del historial

# Usando git revert HEAD HEAD~1
# A -> B -> C -> D -> D' -> C' (HEAD)
# Donde D' y C' son commits que revierten D y C respectivamente

Casos de uso recomendados

Usar git commit --amend cuando:

  • El último commit tiene un error menor
  • Necesitas añadir archivos olvidados
  • El commit no ha sido enviado al remoto

Usar git reset cuando:

  • Los commits están solo en tu repositorio local
  • Quieres reorganizar el historial antes de publicar
  • Necesitas deshacer múltiples commits experimentales

Usar git revert cuando:

  • Los commits ya están en el repositorio remoto
  • Trabajas en equipo y otros tienen los commits
  • Quieres mantener un historial completo de cambios

La regla general es: si el commit ha sido compartido, usa git revert; si permanece local, puedes usar git reset con precaución.

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en Git

Documentación oficial de Git
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Git es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Git

Explora más contenido relacionado con Git y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

  • Entender cómo descartar cambios no confirmados en archivos con git restore.
  • Saber cómo quitar archivos del área de staging usando git reset.
  • Aprender a corregir el último commit con git commit --amend.
  • Conocer las diferencias y usos de git reset y git revert para deshacer commits.
  • Identificar cuándo usar cada comando según el estado del commit (local o publicado).