La tabla que quiero que te lleves
Antes de nada, esto:
| Quiero | Comando | ¿Destruye? |
|---|---|---|
| Tirar lo que edité y no guardé | git restore archivo | Sí, eso |
| Sacar algo de la foto | git restore --staged archivo | No |
| Anular un commit ya compartido | git revert hash | No |
| Deshacer el último commit y quedarme los cambios | git reset --soft HEAD~1 | No |
| Borrar el último commit y todo lo que traía | git reset --hard HEAD~1 | Sí, todo |
Guárdala. Yo la tuve pegada en la pantalla meses 📌
Preparo el terreno
mkdir tienda cd tienda git init -q printf 'ciudad,monto\nLima,1200\n' > ventas.csv git add ventas.csv git commit -q -m "Primeras ventas de Lima" printf 'Arequipa,890\n' >> ventas.csv git add ventas.csv git commit -q -m "Se agregan las ventas de Arequipa" git log --oneline
571877b Se agregan las ventas de Arequipa 54da6e2 Primeras ventas de Lima
Revert, el que se puede usar sin miedo
revert no borra el commit: crea uno nuevo que hace justo lo
contrario. La historia crece en vez de encogerse.
git revert --no-edit HEAD git log --oneline
[main 42cbe91] Revert "Se agregan las ventas de Arequipa" Date: Thu Jan 15 09:00:00 2026 -0500 1 file changed, 1 deletion(-) 42cbe91 Revert "Se agregan las ventas de Arequipa" 571877b Se agregan las ventas de Arequipa 54da6e2 Primeras ventas de Lima
Tres commits, no uno. El de Arequipa sigue ahí y encima hay otro que lo deshace. Y el archivo quedó como estaba antes:
cat ventas.csv
ciudad,monto Lima,1200
Este es el único que se puede usar cuando el commit ya lo tiene otra persona, porque no cambia nada de lo que ya estaba. Los demás reescriben, y eso se cuenta en el capítulo 10.
Reset soft, deshacer el commit y quedarte lo hecho
git reset --soft HEAD~1
git log --oneline
git status --short
571877b Se agregan las ventas de Arequipa 54da6e2 Primeras ventas de Lima M ventas.csv
El commit del revert desapareció de la historia, pero su contenido se quedó en la foto, listo para volver a guardarse. Es lo que uso cuando hice un commit antes de tiempo o con el mensaje mal.
Reset hard, el que sí borra
git reset --hard HEAD
printf 'Cusco,760\n' >> ventas.csv
git reset --hard HEAD
cat ventas.csv
HEAD is now at 571877b Se agregan las ventas de Arequipa HEAD is now at 571877b Se agregan las ventas de Arequipa ciudad,monto Lima,1200 Arequipa,890
Cusco no está. No se fue a ningún sitio recuperable: nunca llegó a un commit, así que Git no tiene de dónde sacarlo.
Este es el único comando de todo el libro que destruye trabajo de verdad, y por eso el capítulo 8 existe: hay una forma de guardar lo que llevas antes de limpiar.
El error de anular un commit que no existe
git revert --no-edit abc1234
fatal: bad revision 'abc1234'
Bad revision: ese hash no está en esta historia. Suele pasar cuando copias un hash de otra rama o de un mensaje viejo.
La trampa
Llevas dos horas con el análisis de las ventas por canal, se te enreda todo y decides empezar de nuevo desde el último commit.
$ git reset --hard HEAD
HEAD is now at 8a2b19c Ventas por canal de Lima
Qué está mal
Esas dos horas ya no existen 💀reset --hard es el único comando de este libro que borra trabajo sin posibilidad de recuperarlo. Lo que nunca llegó a un commit no está en ningún lado, así que Git tampoco lo puede devolver.
Lo peligroso es que se parece a los otros: restore, revert y reset suenan igual de inocentes y hacen cosas muy distintas. Por eso este capítulo trae la tabla de cuál usar cuándo, y por eso conviene leerla antes de necesitarla.
La red de seguridad se pone en un segundo: git stash guarda lo que llevas antes de limpiar. Después decides si lo recuperas o no.
Comprueba que se entendió
Comprueba que lo tienes
Subiste un commit que ya se llevaron dos compañeras y hay que anularlo. ¿Qué usas?
git reset --hardgit revertgit restore- Borrar el archivo y hacer un commit nuevo
Ejercicios
1. Tira un cambio que no querías
Escribe un monto mal en el CSV y descártalo.
printf 'Piura,99999999\n' >> ventas.csv
git restore ventas.csv
cat ventas.csv
ciudad,monto Lima,1200 Arequipa,890
El archivo volvió a lo último guardado. Es lo que quieres nueve de cada diez veces que dices "deshacer" 🔙
2. Saca algo de la foto sin perderlo
Agrega un archivo de clientes, mételo en la foto y después sácalo.
printf 'bodega,ciudad\nBodega Sol,Lima\n' > clientes.csv
git add clientes.csv
git restore --staged clientes.csv
git status --short
?? clientes.csv
Las dos interrogaciones dicen que Git volvió a no conocerlo, y el archivo
sigue en tu carpeta. Ese --staged es la diferencia entre sacar de
la foto y borrar 🙌
3. Un commit y su anulación
Guarda el archivo de clientes y después anúlalo con revert.
git add clientes.csv
git commit -q -m "Se agrega el catalogo de clientes"
git revert --no-edit HEAD
git log --oneline
[main 5972d6a] Revert "Se agrega el catalogo de clientes" Date: Thu Jan 15 09:00:00 2026 -0500 1 file changed, 2 deletions(-) delete mode 100644 clientes.csv 5972d6a Revert "Se agrega el catalogo de clientes" e4eb86b Se agrega el catalogo de clientes 571877b Se agregan las ventas de Arequipa 54da6e2 Primeras ventas de Lima
Los dos commits en la historia: el que puso el archivo y el que lo quitó. Nadie borró nada y se puede reconstruir todo.
4. Comprueba que el archivo se fue
Mira qué hay en la carpeta después del revert.
ls
ventas.csv
clientes.csv ya no está, porque el revert deshizo lo que el
commit había hecho. Y sigue estando en la historia, a un git show
de distancia.
5. Deshaz el commit pero quédate lo hecho
Usa --soft sobre el revert y mira dónde quedan
las cosas.
git reset --soft HEAD~1
git log --oneline
git status --short
e4eb86b Se agrega el catalogo de clientes 571877b Se agregan las ventas de Arequipa 54da6e2 Primeras ventas de Lima D clientes.csv
La D en la primera columna significa que el borrado está en la
foto, listo para guardarse otra vez. El commit se fue; su contenido no.
6. Vuelve al último commit y limpia
Descarta todo lo que hay pendiente con un reset duro.
git reset --hard HEAD git status --short ls
HEAD is now at e4eb86b Se agrega el catalogo de clientes clientes.csv ventas.csv
Estado limpio y el archivo de clientes de vuelta, porque el commit que lo
creaba volvió a ser el último. Aquí --hard no destruyó nada
porque no había nada sin guardar ✅
7. Un hash inventado
Intenta anular un commit que no existe.
git revert --no-edit 0000000
fatal: bad revision '0000000'
Antes de pelearte con un comando, comprueba que el hash existe con
git log --oneline. La mitad de los errores raros de Git son un
hash mal copiado 📋
Lo que te llevas
revert nunca destruye, reset --hard siempre puede. Si dudas, usa revert.