Un compañero respondía “git reset —hard” a toda pregunta de deshacer, como otros responden “apágalo y enciéndelo”. Funcionó dos veces. La tercera costó un viernes por la tarde y una lección de reflog que nadie recuerda con cariño. El hub Undo Anything in Git de este sitio nació de esa semana — y hoy estrena herramienta propia.
El generador de git undo está en línea: tres preguntas entran, un comando exacto sale. Sin cuenta, sin subidas — todo corre en tu navegador. Dices si el commit estaba publicado, si conservas los cambios y si alguien más hace pull de la rama; te imprime el git reset, git revert o rescate por reflog correcto, con aviso donde el comando muerde.
¿Para qué una herramienta de cuatro comandos?
Porque los datos de búsqueda dicen que la gente quiere la respuesta, no el ensayo. Google Search Console muestra este sitio en la posición 12,3 para “git reset last commit keep changes” — 27 impresiones en una semana, cero clics. La consulta pide un comando a gritos, y quien busca pasa de largo todo lo que lo obliga a leer. Un generador responde en una pantalla.
El patrón se repite en cada variante: “and keep changes”, “but keep changes”, “keep the file”. Nadie está investigando teoría de control de versiones. Tienen un lío, ahora mismo, y quieren la salida más corta.
Cómo decide el generador
Tres preguntas, sacadas de la guía revert-vs-reset:
- ¿Dónde está el commit? Sin publicar, publicado, o perdido del todo.
- ¿Qué pasa con los cambios? Conservarlos staged, conservarlos unstaged, o descartarlos.
- ¿Quién más hace pull de esta rama? La pregunta que separa un rewrite limpio de un incidente de equipo.
La pregunta de la rama compartida es toda la herramienta. Lo demás es comodidad; eso es control de daños.
Sus respuestas, completas:
| Comando | Historial | Árbol de trabajo | ¿Rama compartida? |
|---|---|---|---|
git reset --soft HEAD~1 | retrocede 1 | cambios conservados, staged | no — rewrite |
git reset HEAD~1 | retrocede 1 | cambios conservados, unstaged | no — rewrite |
git reset --hard HEAD~1 | retrocede 1 | cambios descartados | no — destructivo |
git revert HEAD | añade un commit inverso | intacto | sí — el movimiento seguro |
git reflog + git switch -c recovery <sha> | nada se pierde | restaurado desde el reflog | rescate tras cualquier cosa |
Los comandos que imprime
Todos los casos que cubre el generador, listos para pegar:
# con commit, sin publicar, conservar los cambios staged
git reset --soft HEAD~1
# con commit, sin publicar, conservar los cambios unstaged
git reset HEAD~1
# publicado, otros hacen pull de la rama — el único deshacer educado
git revert --no-edit HEAD~1..HEAD
git push
# con commit y perdido — el reflog sabe durante ~90 días
git reflog
git switch -c recovery <sha-de-la-lista> La forma de rango HEAD~1..HEAD revierte exactamente los commits que nombras sin recrearlos uno por uno — conviene saberla aunque la herramienta la escriba por ti.
Bajo el capó
La lógica es una tabla de decisión, no magia. Tres preguntas dan dieciocho combinaciones; casi todas colapsan en el mismo puñado de comandos, porque “sin publicar + descartar” y “publicado + rama mía + descartar” solo difieren en la cola de force-with-lease. La página es una ruta estática — sin servidor, sin analíticas, sin cookies — así que carga en un teléfono dentro de una sala de servidores, que es donde pasan la mayoría de emergencias de git, y el botón de copiar te entrega el bloque exacto con sus comentarios de aviso.
Lo que deliberadamente no hace
Nada de ayuda con rebase interactivo — si estás reordenando commits, ya sabes más de lo que la herramienta enseña. Nada de cirugía de stash; eso tiene su propia guía. Y se niega a adivinar: cuando la situación es “publicado en una rama compartida”, el único comando que ofrece es revert, porque las alternativas queman equipos. La guía extensa para deshacer un commit explica qué le hace cada flag al reflog; la herramienta simplemente te impide elegir el equivocado con prisa.
El código está en github.com/mrsaynothing/git-undo — HTML y JavaScript puros, sin build, sin dependencias. Haz fork, cámbiale el estilo, quédate con mis palabras. La versión de este sitio corre la misma lógica como página estática de SvelteKit.
Si te ahorra una sesión de reflog este año, ya pagó la tarde que costó. Si da la respuesta equivocada en un caso que te toca, para eso están los issues del repositorio.
FAQ
¿Qué hace el generador de git undo?
Hace tres preguntas — ¿el commit estaba publicado?, ¿conservas los cambios?, ¿alguien más hace pull de la rama? — e imprime el comando exacto: reset, revert o un rescate por reflog.
¿Es seguro git reset --hard?
En commits que nunca publicaste, sí — el trabajo descartado sigue accesible por git reflog durante unos 90 días. En una rama compartida, nunca: usa revert.
¿Necesito cuenta para la herramienta?
No. Es una página estática que corre por completo en tu navegador — nada se sube, nada se registra.
— mrsaynothing
— mrsaynothing
Builds, roturas y lo que de verdad se publicó.
Comenta esta entrada en dev.to dev.to ↗
Recibe el próximo build log por email
Un email por post. Con pruebas y errores incluidos.
¿qué es esto?Mi agente publicó un post que había bloqueado. Estuvo en línea un día.
¿Te gustan estos artículos? Hago esto para vivir. recibir la newsletter