git undo keep changes — la FAQ para todas las grafías asustadas
La FAQ para cada grafía de "deshacer mi commit pero conservar el trabajo" — un comando responde a toda la familia, y la única bandera que borra trabajo nunca es necesaria.
■ space · carril de prosa · preguntas frecuentes
Un comando responde a toda la familia — git reset --soft HEAD~1 retrocede la etiqueta de rama un commit y te devuelve el trabajo ya preparado.
Undo, cancel, revert no son tres funciones de git. Dos de ellos son el mismo reset con acentos distintos; revert es el raro porque añade historial en vez de rebobinarlo.
¿Ya lo enviaste? Revert, nunca reescribir — cualquiera que hiciera pull tiene los commits viejos.
git reset --soft HEAD~1 es la respuesta a cada grafía de keep-changes: la etiqueta de rama retrocede un commit y tu trabajo vuelve preparado, listo para re-commitear. ¿Ya enviaste el commit? Usa git revert HEAD en su lugar — añade un commit inverso y no reescribe nada.LA TABLA DE VERBOS
Cada palabra que la gente teclea, lo que git realmente hace, y si el trabajo sobrevive:
| Verbo que la gente teclea | Lo que git realmente hace | ¿Conserva el trabajo? | El comando |
|---|---|---|---|
| "undo" | La etiqueta de rama retrocede un commit; los cambios vuelven preparados | Sí — en el índice | git reset --soft HEAD~1 |
| "cancel" | Reset por defecto: la etiqueta retrocede, los cambios vuelven pero sin preparar | Sí — en el árbol de trabajo | git reset HEAD~1 |
| "revert" | Se añade un commit nuevo que deshace el viejo; el historial nunca se reescribe | Sí — como un diff inverso | git revert HEAD |
| "unstage" | Las rutas salen del índice; el contenido de los archivos no se toca | Sí — nada salió del árbol de trabajo | git restore --staged file.txt |
| "apártalo por ahora" | El trabajo se encaja y se pone en un estante que puedes recuperar luego | Sí — en la pila de stash | git stash push -m "wip" |
La única decisión que importa: ¿alguien hizo pull?
No — todavía es tuyo: git reset --soft HEAD~1. La etiqueta retrocede, tu trabajo vuelve preparado. Sí — alguien lo trajo: git revert HEAD. El historial crece con un commit inverso; nada de lo que alguien trajera se reescribe. En cualquier caso el trabajo sobrevive — la elección es solo sobre qué copia del historial queda verdadera. Y si la bandera que te asusta es --hard: es el único miembro de la familia que borra trabajo, y nunca es necesario para conservar cambios. Encontraste esta página precisamente para no tener que teclearla nunca.
¿Qué conserva realmente --soft?
Todo, preparado. El commit deja la rama, el diff vuelve al índice exactamente como se envió, y git status lee "changes to be committed". Arregla lo querías arreglar y re-commitea — o incorpora más trabajo primero. Está a un paso de --amend: amend reescribe el último commit en sitio; soft lo deshace y te espera.
¿Es amend un undo?
Un undo pequeño, solo para el último commit. git commit --amend --no-edit pliega los cambios preparados en el commit que acabas de hacer — perfecto para el archivo olvidado. La regla de la sección de commits enviados sigue vigente: amendar un commit enviado reescribe el historial, así que en una rama compartida, mejor revert.
¿Cuándo es --hard realmente la respuesta correcta?
Cuando quieres que el árbol de trabajo coincida exactamente con un commit, y ya miraste qué se perderá. git reset --hard HEAD~1 descarta el commit y las ediciones sin commitear en un solo movimiento — git no pregunta dos veces. El ritual de seguridad es una línea: git branch backup-before-reset primero; las ramas son gratis. Y si ya lo ejecutaste, git reflog recuerda dónde estaba HEAD unos 90 días — git reset --hard HEAD@{1} lo regresa.
¿Cómo tiro las ediciones de un solo archivo?
git restore file.txt — la grafía moderna del viejo git checkout -- file. Descarta las ediciones del árbol de trabajo de esa única ruta y no toca nada más: ningún movimiento de rama, ningún cambio de preparado. Para devolver un archivo a un commit concreto: git restore --source <sha> file.txt.
¿Dónde encaja stash en la familia?
Stash es el único verbo que guarda el trabajo en una caja en vez de reposicionarlo. git stash push -m "wip" pone tus ediciones en el estante y te entrega un árbol limpio; git stash pop las devuelve. Es la herramienta correcta cuando necesitas cambiar de rama a media tarea — y acepta un pathspec, así que un archivo puede guardarse mientras el resto sigue sucio.
Ya ejecuté el comando equivocado. ¿El trabajo se fue?
Casi nunca. Reset mueve una etiqueta; revert añade un commit; ninguno borra objetos. git reflog lista cada lugar donde estuvo HEAD durante ~90 días — encuentra la entrada previa al error y git reset --hard HEAD@{n} te regresa ahí. El conjunto genuinamente irrecuperable es angosto: archivos no rastreados borrados por git clean -f, y entradas de reflog pasadas su reloj.
fin de la familia de verbos · nada descargado · todo en local