Saltar al contenido
GitTree

guías de git

Deshacer git reset, rebase y commits: cómo recuperar (casi) cualquier cosa en Git

Git rara vez desecha el trabajo para siempre. Aquí se explica cómo deshacer la última confirmación, una modificación, git reset --hard, un rebase, una rama eliminada o un empuje forzado con git reflog, y cómo Deshacer de GitTree maneja la mayor parte con un solo clic.

Escrito por KodmoraActualizado 14 minutos de lectura
GitTree menú de confirmación con acciones de selección, reversión, creación de rama, etiqueta y comparación

Para deshacer git reset, una rebase o una confirmación, ejecute git reflog, busque la entrada justo antes del error y apunte su rama hacia ella, por ejemplo con git reset --hard HEAD@{1}. Git registra cada movimiento de HEAD y de cada rama en el reflog y, de forma predeterminada, mantiene incluso la entrada de una confirmación perdida durante 30 días (90 para las confirmaciones que aún están en una rama), por lo que el trabajo comprometido casi nunca desaparece. La única excepción real es el trabajo que nunca comprometió.

A continuación se muestra la receta para cada error común. Cada comando es simple de Git y funciona igual en macOS, Windows y Linux. En Windows, ejecútelos en Git Bash, que viene con Git for Windows: PowerShell necesita nombres de registro como HEAD@{1} entre comillas y no tiene grep. Al final, verá cómo GitTree, un cliente Git de escritorio, mantiene una instantánea de recuperación para 19 tipos de operaciones, de modo que la mayoría de los errores se solucionan con un solo clic.

Git deshacer hoja de trucos: el comando para cada error

Encuentre su situación, luego lea su sección antes de ejecutar cualquier cosa. HEAD@{1} significa “donde estaba HEAD hace un movimiento”; Si ha ejecutado otros comandos desde entonces, busque primero el número correcto con git reflog.

Deshacer comandos para errores comunes de Git
errorComandocuidado con
Última confirmación, mantenga los cambios.git reset --soft HEAD~1Sólo para confirmaciones que no has presionado
Última confirmación, ya enviadagit revert HEADAgrega un compromiso que cancela el anterior.
Un mal git commit --amendgit reset --soft HEAD@{1}Ejecútelo antes de que HEAD se mueva nuevamente.
git reset --hardgit reset --hard HEAD@{1}Los cambios no confirmados no están en el reflog
Una rebase terminadagit reset --hard ORIG_HEADEl próximo reinicio, fusión o cambio de base sobrescribe ORIG_HEAD
Una fusión localgit reset --hard ORIG_HEADUna vez presionado, use git revert -m 1 <merge>
Una rama eliminadagit branch <name> <hash>El hash está en el mensaje de eliminación o en el reflog.
Un alijo caídogit stash apply <hash>El hash está en el mensaje desplegable.
Un empujón de fuerzagit push --force-with-lease origin <hash>:mainAdvertir a cualquiera que se detuviera en el medio

Git reflog explicado: la red de seguridad bajo cada comando

El reflog (registro de referencia) es un diario privado de hacia dónde han apuntado HEAD y los consejos de su sucursal. Cada confirmación, pago, restablecimiento, fusión, cambio de base, modificación y extracción agrega una línea, y las ramas de seguimiento remoto como origin/main también obtienen una. Vive solo en su carpeta local .git: nunca se inserta y un clon nuevo comienza con uno vacío.

git reflog
git reflog show main
git reflog --date=relative

Un git reflog típico después de una rebase se ve así, con la entrada más reciente primero:

6c55495 HEAD@{0}: rebase (finish): returning to refs/heads/feature-login
6c55495 HEAD@{1}: rebase (pick): Validate the email field
cb6e15e HEAD@{2}: rebase (pick): Add the login form
2c44bc3 HEAD@{3}: rebase (start): checkout main
595b83d HEAD@{4}: commit: Validate the email field

Lea hasta la línea más reciente antes del error: aquí HEAD@{4}, la confirmación realizada antes de rebase (start). Utilice su hash o ese nombre en cualquier lugar donde Git espere una confirmación; main@{2.hours.ago} también funciona. Las entradas caducan después de 90 días, o 30 para confirmaciones que ninguna rama puede alcanzar, y mientras exista una entrada, git gc mantiene su confirmación.

Recuperar un compromiso perdido con git reflog en cuatro pasos

  1. Listar el reflog

    Ejecute git reflog o git reflog show <branch> para una rama y anote la entrada más reciente antes del error.

  2. Inspeccionar el compromiso

    Ejecute git log --oneline -5 HEAD@{4} para comprobar que este es el estado que desea recuperar. Nada cambia todavía.

  3. Guárdalo en una sucursal de rescate.

    Ejecute git branch rescue HEAD@{4}. Sus archivos permanecen como están y la confirmación ya no puede caducar.

  4. Mueve tu sucursal hacia atrás

    Confirme o guarde todo lo que aún necesite, ejecute git reset --hard rescue en la rama rota y luego elimine el asistente con git branch -d rescue.

Git deshacer la última confirmación: reinicio suave, mixto o completo

Si la confirmación todavía está solo en su computadora, git reset retrocede la rama una confirmación. El modo decide qué sucede con sus cambios:

git reset --soft HEAD~1
git reset HEAD~1
git reset --hard HEAD~1
  • --soft mantiene los cambios preparados, listos para confirmarse nuevamente: ideal para corregir el mensaje o agregar un archivo olvidado.
  • --mixed, el valor predeterminado, mantiene los cambios en su carpeta de trabajo, sin preparar, para que pueda dividir la confirmación.
  • --hard descarta los cambios con la confirmación, junto con cualquier edición no confirmada. El reflog mantiene el compromiso por un tiempo, pero piénselo dos veces.

Si ya lo enviaste, no lo reescribas: git revert HEAD registra una nueva confirmación que lo cancela. La lección gratuita Recuperar errores después de presionar cubre la reversión y otras formas seguras de regresar.

Deshacer git commit --amend

Una enmienda reemplaza la confirmación por una nueva; el original permanece en el reflog. Inmediatamente después de la enmienda, git reset --soft HEAD@{1} vuelve a colocar la rama en el original y deja lo que agregó la enmienda en etapa. Más adelante, busque la línea commit (amend) en git reflog y use la entrada debajo de ella.

git reset --soft HEAD@{1}

Cómo deshacer git reset --hard

Un restablecimiento completo mueve la rama y sobrescribe sus archivos, pero las confirmaciones que eliminó todavía están en la base de datos de objetos de Git. El reflog muestra el movimiento como reset: moving to HEAD~2 y la línea debajo es donde estabas. Si el reinicio fue su último comando, esto recupera todo:

git reflog
git reset --hard HEAD@{1}
git fsck --lost-found

Cómo deshacer una rebase de git

Si la rebase se detuvo debido a un conflicto, git rebase --abort devuelve la rama, el índice y sus archivos a donde estaban. Si terminó, tienes dos caminos de regreso. Git señala ORIG_HEAD en el consejo anterior cuando comienza una rebase, por lo que inmediatamente después git reset --hard ORIG_HEAD lo deshace. Más resistente aún es el propio reflog de la rama: una rebase mueve la rama solo una vez, en rebase (finish), por lo que feature-login@{1} es la rama exactamente como estaba. Cuando se detiene una rebase o una selección, la lección Continuar, omitir o cancelar una operación activa explica cada salida.

git rebase --abort
git reset --hard ORIG_HEAD
git reset --hard feature-login@{1}

Si había impulsado la rama rebasada, restaurarla necesita un impulso forzado (ver más abajo). Para reescribir el historial a propósito, lea nuestra guía para rebase interactivo en una GUI de Git.

Deshacer una fusión de git

Una combinación también deja la sugerencia anterior en ORIG_HEAD, por lo que git reset --hard ORIG_HEAD deshace la que no has presionado. En medio de un conflicto, git merge --abort lo saca, o siga nuestra guía para resolver conflictos de fusión de Git. Una fusión empujada se revierte con git revert -m 1 <merge-commit>; fusionar esa rama nuevamente más tarde no recuperará esos cambios a menos que revierta la reversión.

git merge --abort
git reset --hard ORIG_HEAD
git revert -m 1 <merge-commit>

Recuperar una rama de Git eliminada (y un alijo caído)

Al eliminar una rama, se elimina un nombre, no las confirmaciones. git branch -D imprime la punta a la que apuntaba la rama y, al crear la rama nuevamente a partir de ese hash, la restaura:

git branch feature-login 1a2b3c4
git reflog | grep "moving from feature-login"

¿Perdiste esa salida? El reflog de HEAD todavía lo recuerda. El segundo comando encuentra checkout: moving from feature-login to main; la entrada un número mayor (HEAD@{6} si la coincidencia es HEAD@{5}) es la última confirmación de la rama. Si la rama todavía está en el control remoto, git branch feature-login origin/feature-login es más rápido. Para recuperar una confirmación en lugar de toda la rama, aplíquela con selección.

Recuperar un alijo caído

git stash drop y git stash pop imprimen el hash del alijo que eliminaron y git stash apply <hash> lo devuelve. Sin el hash, la documentación de Git sugiere esta búsqueda de confirmaciones de alijo inalcanzables; encuentra escondites guardados con el mensaje predeterminado "WIP on...":

git stash apply 9d668e5
git fsck --unreachable | grep commit | cut -d' ' -f3 | xargs git log --merges --no-walk --grep=WIP --oneline

Cómo deshacer un empujón forzado

Un empuje forzado reemplaza la rama remota con la suya, por lo que las confirmaciones que solo estaban en la rama remota la abandonan. Su rama de seguimiento remoto también mantiene un registro nuevo: origin/main@{1} es donde estaba la rama remota antes de su envío, como la vio por última vez, y la salida del envío imprimió el mismo hash que la primera mitad de old...new.

git reflog show origin/main
git push --force-with-lease origin 1a2b3c4:main

--force-with-lease rechaza el envío si el control remoto se movió desde la última vez que lo recuperaste, por lo que no puedes sobrescribir la corrección de un compañero de equipo por accidente. Las confirmaciones que nunca recuperaste nunca estuvieron en tu computadora; Quien los empujó puede volver a empujarlos. Luego dígaselo a cualquiera que se haya detenido en el medio. El vídeo sobre cómo recuperar errores enviados muestra la reparación completa.

Deshacer con un clic en GitTree: una instantánea de recuperación para 19 tipos de operaciones

Todo lo anterior también funciona en GitTree: ejecuta su Git instalado (2.39 o posterior) y su terminal incorporada abre su propio shell debajo del gráfico de confirmación. Qué agrega: GitTree mantiene una instantánea de recuperación en refs/ogt/trash para 19 tipos de operación, guardando cualquier paso destructivo que eliminaría antes de ejecutarse, y el botón Deshacer en la barra de herramientas invierte el último paso.

Deshacer cubre confirmaciones y modificaciones, desprotecciones, restablecimientos, rebases (también interactivos), archivos descartados, fragmentos y líneas, ramas y etiquetas eliminadas, archivos limpios sin seguimiento y más. Para una ejecución de restablecimiento completo desde GitTree, la instantánea también contiene los cambios no confirmados, que git reset --hard simple no puede recuperar.

Deshacer y Rehacer se encuentran en la barra de herramientas GitTree y el menú de confirmación en el gráfico ofrece Restablecer, Revertir y Rebase interactivo para cualquier confirmación.
Deshacer y Rehacer se encuentran en la barra de herramientas GitTree y el menú de confirmación en el gráfico ofrece Restablecer, Revertir y Rebase interactivo para cualquier confirmación.

Dos de los 19 se mantienen en lugar de revertirse. Un empujón forzado cambia un control remoto, que solo otro empujón puede volver a cambiar, por lo que GitTree conserva la punta que reemplazó y le deja ese empujón a usted (siempre empuja con fuerza con --force-with-lease). Se toma una instantánea de un alijo eliminado, pero Deshacer no lo restaura todavía. GitTree también rechaza deshacer que sobrescribiría el trabajo posterior y explica por qué. Un envío normal no se puede deshacer desde la aplicación; revertir en su lugar.

Restablecer nombra sus tres modos: Suave mantiene todos los cambios preparados, Mixto los mantiene en la carpeta de trabajo y Duro los descarta después de una instantánea que Deshacer puede restaurar.
Restablecer nombra sus tres modos: Suave mantiene todos los cambios preparados, Mixto los mantiene en la carpeta de trabajo y Duro los descarta después de una instantánea que Deshacer puede restaurar.

Cómo deshacer un reinicio, un cambio de base o una rama eliminada en GitTree

  1. Trabaja como siempre

    Restablezca, cambie la base, descarte o elimine una rama como lo haría normalmente. GitTree toma la instantánea primero; el cuadro de diálogo de restablecimiento completo lo dice.

  2. Haga clic en Deshacer

    Haga clic en Deshacer en la barra de herramientas o ejecútelo desde la paleta de comandos (Ctrl/⌘+Shift+P). Su información sobre herramientas nombra el paso, como “Deshacer: eliminar el inicio de sesión de función de rama”; un paso que no se puede deshacer muestra por qué.

  3. Ir más atrás con el reflog

    Deshacer cubre lo que GitTree ejecutó por sí solo. Para un comando escrito en una terminal, ejecute Ver Reflog... desde la paleta, elija una entrada y elija Restaurar como rama.

  4. Consulta el gráfico antes de presionar.

    El gráfico de confirmación muestra la rama donde estaba, para que puedas confirmar el resultado antes de que algo salga de tu computadora.

Hábitos que hacen que cada error de Git sea reversible

  • Comprométete temprano, incluso de manera desordenada. Solo el trabajo comprometido llega al reflog; ordénalo más tarde con una rebase interactiva.
  • Bifurcación antes de ediciones riesgosas. git branch backup/before-rebase no cuesta nada y nunca caduca.
  • Nunca uses un `--force` simple. --force-with-lease no sobrescribirá las confirmaciones que no hayas visto.
  • Revertir el historial compartido, restablecer el historial privado. Una vez que otros hayan realizado una confirmación, revertirla.
  • Mantenga Git actualizado. GitTree necesita Git 2.39 o más reciente, y Ubuntu 22.04 envía 2.34; consulte cómo actualizar Git en Ubuntu.

¿Sigues eligiendo entre escribir y hacer clic? Lea GIT GUI vs línea de comando, o comience con Git para principiantes, con una GUI.

GitTree tiene un plan gratuito que cubre todas las funciones de Git, incluidos los repositorios privados, en macOS 13 o posterior, Windows 10 y 11 (x64) y 64 bits Linux (x86_64: Ubuntu 22.04+, Debian 12+), y Nour, el asistente de IA, viene con GitTree Pro (ver precios). Necesita Git 2.39 o más reciente y una cuenta GitTree para iniciar sesión. Consígala en la página de descarga o vea cómo se ejecuta en Linux.

Preguntas frecuentes

¿Cómo deshago git reset --hard?

Ejecute git reflog y busque la línea justo debajo de reset: moving to …; Ahí es donde estaba tu sucursal. Si el reinicio fue su último comando, git reset --hard HEAD@{1} recupera las confirmaciones eliminadas. Los cambios que nunca cometió no están en el reflog, por lo que Git no puede restaurarlos; Si ejecutó el restablecimiento completo en GitTree, Deshacer los restaura desde la instantánea tomada primero.

¿Cómo deshago la última confirmación pero conservo mis cambios?

Ejecute git reset --soft HEAD~1 para mantener los cambios preparados o git reset HEAD~1 para mantenerlos sin preparar en su carpeta de trabajo. Ambos reescriben solo su sucursal local, así que úselos para confirmaciones que no haya enviado. Para una confirmación enviada, ejecute git revert HEAD, que agrega una confirmación que la cancela.

¿Cómo deshago una rebase de git una vez finalizada?

Inmediatamente después de la rebase, git reset --hard ORIG_HEAD devuelve la rama a su punta anterior. Si ha ejecutado otros comandos desde entonces, use git reset --hard <branch>@{1}: una rebase mueve la rama solo una vez, cuando finaliza. Si había presionado la rama rebasada, presione la restaurada con --force-with-lease.

¿Cuánto tiempo mantiene git reflog las confirmaciones perdidas?

Una confirmación perdida, una a la que ya no llega ninguna rama, mantiene su entrada de reflog durante 30 días de forma predeterminada; las entradas para confirmaciones aún en una sucursal duran 90 días. Mientras existe una entrada, la recolección de basura mantiene su confirmación. Para mantener una confirmación indefinidamente, colóquele una rama o etiqueta, por ejemplo git branch rescue <hash>, porque Git nunca elimina las confirmaciones a las que apunta una rama.

¿Puedo recuperar cambios no confirmados después de git reset --hard?

Por lo general, no solo con Git. El reflog registra confirmaciones, no ediciones en su carpeta de trabajo, así que verifique el historial local de su editor. Los archivos preparados pueden sobrevivir como objetos colgantes que git fsck --lost-found escribe en .git/lost-found/other/, sin nombres de archivo. GitTree capturas instantáneas de los cambios no confirmados antes de su propio restablecimiento completo.

¿Cómo deshago un empujón forzado?

Busque la punta remota que reemplazó: git reflog show origin/main la enumera como origin/main@{1} y la salida push la mostró como el primer hash en old...new. Luego ejecuta git push --force-with-lease origin <hash>:main. Si el envío sobrescribió los compromisos que nunca recuperó, pídale a quien lo empujó que lo haga nuevamente.

¿Puede GitTree deshacer un git push?

No. Un envío normal no se puede deshacer desde GitTree; en su lugar, revierta la confirmación. Para un impulso forzado, GitTree mantiene la punta remota que reemplazó en una instantánea de recuperación, por lo que no se pierde nada, pero restaurar el control remoto requiere otro impulso. Deshacer cubre operaciones locales como confirmaciones, restablecimientos, cambios de base, retiradas y eliminaciones de sucursales.

¿Se comparte git reflog con mi equipo?

No. El reflog se encuentra solo en su carpeta local .git. Nunca se empuja, la búsqueda no trae la de nadie más y un nuevo clon comienza con uno vacío. Por lo tanto, la confirmación perdida de un compañero de equipo solo se puede recuperar en su máquina, y su reflog mantiene sus confirmaciones incluso si alguien sobrescribe la rama remota.

Fuentes

Las afirmaciones sobre otros productos se compararon con sus páginas oficiales el 23 de octubre de 2026. Los precios y las características cambian; Las páginas de los proveedores son la fuente de la verdad.