Back

Deshaciendo Commits de Git Después de un Push: Revirtiendo Cambios de Manera Segura en Repositorios Remotos

Deshaciendo Commits de Git Después de un Push: Revirtiendo Cambios de Manera Segura en Repositorios Remotos

Como desarrolladores, todos hemos estado ahí - haces un commit, lo haces push a un repositorio remoto, y luego te das cuenta de que necesitas deshacer esos cambios. No te preocupes, Git proporciona herramientas poderosas para ayudarte a revertir commits de manera segura, incluso después de que hayan sido pushed. En este artículo, exploraremos varios escenarios y técnicas para deshacer commits de Git y recuperarnos de errores, asegurando la integridad del historial de tu proyecto.

Puntos Clave

  • Usa git reset para deshacer commits locales antes de hacer push.
  • Usa git revert para deshacer de manera segura commits pusheados creando un nuevo commit que invierte los cambios.
  • Evita hacer force push a repositorios remotos, ya que puede causar problemas para los colaboradores.
  • Usa git reflog para recuperar commits perdidos después de un hard reset.

Entendiendo los Commits de Git

Antes de sumergirnos en deshacer commits, repasemos rápidamente cómo funcionan los commits en Git:

  • Un commit representa una instantánea de tu repositorio en un punto específico en el tiempo.
  • Cada commit tiene un identificador único (hash SHA-1) y una referencia a su(s) commit(s) padre.
  • El puntero HEAD se refiere al commit actual en el que te encuentras en tu repositorio local.

Deshaciendo el Último Commit Local

Si aún no has hecho push de tu último commit y quieres deshacerlo, tienes algunas opciones:

Usando git reset

  1. git reset --soft HEAD~1: Este comando mueve el puntero HEAD un commit hacia atrás, manteniendo los cambios del último commit en el stage.
  2. git reset --mixed HEAD~1 (o git reset HEAD~1): Este es el comportamiento predeterminado de git reset. Mueve el puntero HEAD un commit hacia atrás y quita los cambios del stage, pero los mantiene en tu directorio de trabajo.
  3. git reset --hard HEAD~1: Este comando descarta todos los cambios del último commit, eliminándolo efectivamente de tu repositorio. Usa esto con precaución, ya que elimina permanentemente los cambios.

Usando git commit --amend

Si quieres modificar el último commit sin cambiar el historial de commits, puedes usar git commit --amend. Esto te permite actualizar el mensaje del commit o agregar/eliminar cambios al último commit.

# Realiza los cambios necesarios
git add .
git commit --amend

Deshaciendo Commits Que Han Sido Pusheados

Cuando necesites deshacer commits que ya han sido pusheados a un repositorio remoto, deberías usar git revert para crear un nuevo commit que deshaga los cambios.

Usando git revert

  1. Identifica el commit que quieres revertir usando git log.
  2. Usa git revert <commit-hash> para crear un nuevo commit que deshaga el commit especificado.
git revert 1a2b3c4d
  1. Haz push del nuevo commit al repositorio remoto.
git push origin main

Advertencias Sobre Force Pushing

Evita usar git push --force para sobrescribir el historial del repositorio remoto, ya que puede causar problemas para otros colaboradores. En su lugar, usa git revert para mantener un historial de commits limpio y transparente.

Deshaciendo Múltiples Commits

Para deshacer múltiples commits, puedes usar git revert con un rango de commits o realizar un rebase interactivo.

Revirtiendo un Rango de Commits

git revert <oldest-commit-hash>..<latest-commit-hash>

Rebase Interactivo

  1. Usa git rebase -i <commit-before-the-one-you-want-to-change> para iniciar un rebase interactivo.
  2. En el editor, cambia pick a drop para los commits que quieres eliminar.
  3. Guarda y sal del editor para completar el rebase.

Recuperando Trabajo Perdido

Si accidentalmente realizaste un hard reset y perdiste commits, puedes usar git reflog para recuperarlos.

  1. Ejecuta git reflog para ver el registro de todas las acciones realizadas en el repositorio.
  2. Identifica el commit que quieres restaurar y anota su hash SHA-1.
  3. Usa git checkout <commit-hash> para cambiar a ese commit.
  4. Crea una nueva rama para guardar los cambios recuperados: git checkout -b recovered-branch.

Mejores Prácticas

  • Usa git revert en lugar de git reset cuando deshagas commits pusheados para mantener un historial limpio.
  • Ten cuidado al usar git reset --hard, ya que elimina permanentemente los cambios.
  • Comunícate regularmente con tu equipo para evitar conflictos al deshacer commits en ramas compartidas.

Preguntas Frecuentes

Usa `git revert -m 1 <merge-commit-hash>` para revertir un commit de merge, especificando el número de padre (`-m 1`) a mantener.

Resuelve los conflictos manualmente, haz stage de los cambios y luego ejecuta `git revert --continue` para completar la operación de revert.

Conclusión

Deshacer commits de Git, ya sean locales o pusheados, es un requerimiento común en el flujo de trabajo de cualquier desarrollador. Al comprender los diferentes enfoques, como git reset, git revert y git reflog, puedes manejar con confianza varios escenarios y mantener un historial de proyecto limpio y preciso. Recuerda seguir las mejores prácticas, comunicarte con tu equipo y siempre priorizar la integridad de tu repositorio.

Recursos Adicionales

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers