Qué usar en cada caso
| Situación | Comando |
|---|---|
| Descartar los cambios de un archivo sin guardar | git restore archivo |
| Sacar un archivo de staging | git restore --staged archivo |
| Corregir el mensaje del último commit | git commit --amend -m "Nuevo mensaje" |
| Añadir un archivo olvidado al último commit | git add archivo && git commit --amend --no-edit |
| Deshacer el último commit conservando los cambios | git reset --soft HEAD~1 |
| Deshacer un commit que ya se subió | git revert <hash> |
| Guardar cambios a medias para cambiar de rama | git stash |
| Recuperar algo que parecía perdido | git reflog |
git restore archivoygit reset --harddescartan cambios que no están en ningún commit. Eso no se puede recuperar.
Los tres modos de reset
git reset mueve la rama actual a otro commit. El modo decide qué pasa con los cambios:
| Modo | Historial | Staging | Archivos en disco |
|---|---|---|---|
--soft |
Retrocede | Conserva los cambios | No se tocan |
--mixed (por defecto) |
Retrocede | Se vacía | No se tocan |
--hard |
Retrocede | Se vacía | Se pierden los cambios |
git reset --soft HEAD~1 # deshace el commit, los cambios quedan en staging
git reset HEAD~1 # deshace el commit, los cambios quedan sin preparar
git reset --hard HEAD~1 # deshace el commit y borra los cambios
HEAD~1 es “el commit anterior al actual”. HEAD~3 son tres hacia atrás.
Revert: deshacer sin reescribir
git revert <hash>
Crea un commit nuevo que aplica lo contrario del commit indicado. El historial no se reescribe, así que es la forma segura de deshacer algo que ya está en una rama compartida.
reset |
revert |
|
|---|---|---|
| Historial | Lo reescribe | Añade un commit |
| Commits ya subidos | No usar | Seguro |
Amend: corregir el último commit
git commit --amend -m "Mensaje corregido"
git add olvidado.txt && git commit --amend --no-edit
Reemplaza el último commit por uno nuevo, con otro hash. Solo conviene si ese commit todavía no se subió.
Stash: guardar cambios a medias
| Comando | Qué hace |
|---|---|
git stash |
Guarda los cambios sin commitear y limpia el directorio |
git stash -u |
Incluye también los archivos nuevos |
git stash list |
Lista lo guardado |
git stash pop |
Recupera lo último y lo quita de la lista |
git stash apply |
Lo recupera y lo deja en la lista |
git stash drop |
Descarta lo último guardado |
Reflog: la red de seguridad
git reflog
Muestra todos los lugares por los que pasó HEAD, incluidos commits que ya no están en ninguna rama tras un reset o un rebase. Con el hash a la vista se recupera:
git switch -c rescate <hash>
Mientras algo haya llegado a estar en un commit, casi siempre se puede recuperar con el reflog.
Limpiar archivos sin seguimiento
git clean -n # muestra qué borraría, sin borrar nada
git clean -fd # borra archivos y carpetas sin seguimiento