Git School · FluxGit

Deshacer el último commit Git: soft reset o revert

FluxGit ·

Los bloques son casos distintos, no un único script. Elige el que encaja con tu repositorio. Sustituye ramas, rutas y VERIFIED_COMMIT antes de usarlos. Los comandos de cancelación solo corresponden a su operación activa; no ejecutes ambas alternativas.

Respuesta breve

Para deshacer el último commit local conservando sus cambios, reset --soft mueve la rama al padre y deja índice y archivos intactos. Para deshacer uno compartido, revert añade un commit inverso. Decide primero si quieres conservar el código y si otras personas tienen ese historial; las dos respuestas llevan a operaciones distintas.

Ejemplo y condiciones

El ejemplo tiene un commit normal, sin merge y con padre, en la punta actual, con árbol limpio y sin archivos ajenos preparados. El primer commit no tiene padre HEAD^; un merge tiene varios. Ninguno encaja en este atajo. Inspecciona el grafo en lugar de tratar HEAD~1 como un botón universal de deshacer.

Inspecciona antes de cambiar

Lee el patch, estado y situación compartida de la rama. Quitar el envoltorio del commit para continuar el código, invertir código compartido y descartarlo completamente son resultados diferentes. Coordina antes de reescribir una rama publicada. Una fecha reciente o tu nombre de autor no demuestra que el commit sea privado.

git status --short
git log -3 --oneline --decorate
git show --stat HEAD

Conserva una referencia o checkout separado

Crea rescue/before-undo en HEAD para conservar el estado confirmado original. Guarda archivos sin commit aparte: la rama no los almacena. En este ejemplo limpio, soft reset deja preparado solo el patch de ese commit. Si el índice ya estaba modificado, el diff resultante puede mezclar tareas y necesita revisión separada.

git branch rescue/before-undo HEAD
SCHOOL_UNDO=$(git rev-parse HEAD)

Primer flujo

Para el caso local que conserva cambios, ejecuta reset --soft HEAD^ y revisa diff --cached. El contenido sigue en índice y archivos, listo para un commit corregido. Un reset mixed cambia el índice de otro modo. No pases a --hard solo para acortar el estado preparado: también modifica los archivos de trabajo.

git reset --soft HEAD^
git diff --cached
git status --short

Elige deliberadamente la otra opción

Para un commit normal compartido, guarda su ID verificado en SCHOOL_UNDO y usa revert. Crea otro commit que invierte el cambio conservando el historial recibido por el equipo. Revisa resultado y comprobaciones antes de un push normal. Revertir un merge exige elegir el padre principal y entender efectos posteriores: usa un procedimiento específico.

git revert "$SCHOOL_UNDO"

Límites y excepciones

Revert puede encontrar conflictos con trabajo posterior. Lee status, resuelve y prepara archivos, y usa revert --continue. Usa revert --abort si elegiste mal el cambio o resultado. Reset --soft no tiene un estado equivalente de continuar o cancelar. No mezcles flujos ni inicies otra reparación con un revert todavía activo.

git status
git revert --abort

Conflictos y limpieza

Descartar además código confirmado y archivos locales es otra decisión destructiva, no la opción predeterminada. Conserva y revisa el estado antes. Reflog no contiene trabajo sin commit. Con restore points habilitados y cambios locales detectados, FluxGit puede guardar un safety stash antes de un hard reset soportado; esta secuencia de terminal no invoca esa protección.

Verifica el resultado

Tras soft reset, compara punta y patch preparado con la referencia de rescate. Tras revert, comprueba que el inverso afecta solo lo deseado y conserva trabajo posterior útil. Ejecuta las comprobaciones del proyecto. Mantén el rescate durante la revisión; que Git termine sin error no demuestra corrección del código.

git log -4 --oneline --decorate
git status --short
git diff --cached

Preguntas habituales

¿Soft reset borra archivos? Mantiene árbol e índice, pero mueve la referencia de rama. ¿Revert elimina el original? No, registra un cambio inverso nuevo. ¿Reflog recupera todo? No; trata estados locales retenidos y objetos confirmados, no el contenido arbitrario de archivos sin guardar.

Revisa la operación en FluxGit

Usa el historial visual y la vista de cambios de FluxGit para revisar la operación y los commits pertinentes. Conserva las comprobaciones de rama, historial compartido y archivos locales del ejemplo. La página de descarga muestra las versiones y plataformas disponibles.

Documentación oficial de Git

Flujos relacionados

Descargar FluxGit