Todavía no hiciste git add
Este es el escenario más común y también el más fácil de arreglar. Editaste un archivo, te arrepentiste, y quieres que vuelva a como estaba en tu último commit. Para eso existe git restore:
git restore nombre-del-archivo.js
Si quieres descartar todos los cambios sin confirmar en tu proyecto, no solo los de un archivo, usa un punto en vez del nombre:
git restore .
Si has usado Git desde hace un tiempo, quizás recuerdes git checkout -- archivo para esto mismo. Sigue funcionando, pero git restore es el comando más nuevo y menos confuso — checkout también se usa para cambiar de rama, así que tenía demasiados trabajos a la vez.
Ya hiciste git add, pero no commit
Preparaste un archivo para el commit (lo "agregaste al staging") y te diste cuenta de que no debería ir en ese commit todavía. No necesitas descartar el cambio, solo sacarlo del área de staging:
git restore --staged nombre-del-archivo.js
Esto no borra nada de tu archivo — solo lo regresa al estado "modificado, pero no listo para el commit". Si después de eso también quieres descartar el cambio en sí, aplica el comando del paso anterior.
Quieres deshacer el último commit (que no has subido)
Aquí es donde empieza a importar qué tanto quieres deshacer. git reset tiene tres modos, y la diferencia entre ellos es justo qué tan destructivos son:
git reset --soft HEAD~1
Con --soft, el commit desaparece pero tus cambios se quedan en el área de staging, listos para volver a comitear con un mejor mensaje. Es el modo que más vas a usar.
git reset --mixed HEAD~1
--mixed es el valor por defecto si no escribes ninguno: deshace el commit y también saca los archivos del staging, pero los cambios siguen en tus archivos.
git reset --hard HEAD~1
Ya le hiciste push a ese commit
Este es el caso distinto: si ya subiste el commit a GitHub y alguien más pudo haberlo descargado, no uses reset — reescribe el historial, y eso genera conflictos para cualquiera que ya tenía esa versión. En vez de borrar el commit, Git te deja crear uno nuevo que deshace exactamente lo que hizo el anterior:
git revert HEAD
Esto te va a abrir un editor de texto para confirmar el mensaje del nuevo commit — guarda y cierra para continuar. El historial queda intacto (se puede ver que hubo un error y que se corrigió), lo cual además es útil para que tu equipo entienda qué pasó.
Si necesitas revertir un commit específico que no es el más reciente, usa su identificador (los primeros 7 caracteres son suficientes):
git revert a1b2c3d
Puedes encontrar ese identificador revisando el historial:
git log --oneline