Cómo deshacer un commit de Git pero conservar los cambios

GitGitBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En esta guía integral, aprenderá cómo deshacer un commit de Git manteniendo intactos sus cambios. Ya sea que haya cometido un error en su commit o necesite reorganizar su historial de commits, este tutorial le proporcionará las herramientas y técnicas necesarias para administrar su repositorio de Git de manera efectiva. Desde deshacer el commit más reciente hasta revertir commits específicos, adquirirá una comprensión profunda de cómo deshacer un commit de Git pero mantener los cambios.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/DataManagementGroup(["Data Management"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/BasicOperationsGroup -.-> git/commit("Create Commit") git/DataManagementGroup -.-> git/reset("Undo Changes") git/DataManagementGroup -.-> git/restore("Revert Files") git/BranchManagementGroup -.-> git/merge("Merge Histories") git/BranchManagementGroup -.-> git/log("Show Commits") git/BranchManagementGroup -.-> git/reflog("Log Ref Changes") git/BranchManagementGroup -.-> git/cherry_pick("Cherry Pick") git/BranchManagementGroup -.-> git/rebase("Reapply Commits") subgraph Lab Skills git/commit -.-> lab-392512{{"Cómo deshacer un commit de Git pero conservar los cambios"}} git/reset -.-> lab-392512{{"Cómo deshacer un commit de Git pero conservar los cambios"}} git/restore -.-> lab-392512{{"Cómo deshacer un commit de Git pero conservar los cambios"}} git/merge -.-> lab-392512{{"Cómo deshacer un commit de Git pero conservar los cambios"}} git/log -.-> lab-392512{{"Cómo deshacer un commit de Git pero conservar los cambios"}} git/reflog -.-> lab-392512{{"Cómo deshacer un commit de Git pero conservar los cambios"}} git/cherry_pick -.-> lab-392512{{"Cómo deshacer un commit de Git pero conservar los cambios"}} git/rebase -.-> lab-392512{{"Cómo deshacer un commit de Git pero conservar los cambios"}} end

Comprender los commits de Git

Git es un sistema de control de versiones distribuido que permite a los desarrolladores realizar un seguimiento de los cambios en su base de código a lo largo del tiempo. En el núcleo de Git está el concepto de commit, que representa una instantánea del proyecto en un momento específico. Comprender cómo funcionan los commits de Git es esencial para administrar de manera efectiva el historial de su proyecto y deshacer cambios cuando sea necesario.

¿Qué es un commit de Git?

Un commit de Git es un registro de los cambios realizados en los archivos de su repositorio. Cuando realiza cambios en sus archivos y decide guardar esos cambios, crea un nuevo commit. Cada commit contiene la siguiente información:

  1. Identificador único: A cada commit se le asigna un hash SHA-1 único, que sirve como su identificador.
  2. Autor: La persona que realizó los cambios y creó el commit.
  3. Marca de tiempo: La fecha y hora en que se creó el commit.
  4. Mensaje del commit: Una breve descripción de los cambios realizados en el commit.
  5. Instantánea de los archivos: El estado completo de todos los archivos en su repositorio en el momento del commit.

Historial de commits y ramificación

A medida que continúe trabajando en su proyecto, creará múltiples commits, formando un historial lineal de cambios. Git también le permite crear ramas (branches), que son líneas de desarrollo independientes que pueden divergir de la base de código principal. Cada rama tiene su propio historial de commits, que se puede fusionar de nuevo en la rama principal u otras ramas según sea necesario.

graph LR A[Initial Commit] --> B[Commit 2] B --> C[Commit 3] C --> D[Commit 4] A --> E[Feature Branch] E --> F[Commit 5] F --> G[Commit 6]

Comprender el historial de commits y la estructura de ramificación de su repositorio de Git es fundamental para navegar y administrar la evolución de su proyecto.

Mejores prácticas para los commits

Para trabajar de manera efectiva con los commits de Git, es importante seguir algunas mejores prácticas:

  1. Escribir mensajes de commit significativos: Proporcione mensajes de commit claros y concisos que describan los cambios realizados en el commit.
  2. Mantener los commits pequeños y enfocados: Realice commits de cambios que estén lógicamente relacionados y que se puedan entender y revertir fácilmente si es necesario.
  3. Evitar el commit de información sensible: Asegúrese de no cometer accidentalmente ningún dato sensible, como contraseñas o claves de API, en su repositorio.
  4. Enviar regularmente cambios a un repositorio remoto: Envíe regularmente sus commits locales a un repositorio remoto, como GitHub o GitLab, para garantizar que su trabajo esté respaldado y sea accesible para su equipo.

Al comprender los fundamentos de los commits de Git, estará mejor preparado para administrar el historial de su proyecto, colaborar con otros y deshacer cambios cuando sea necesario.

Identificar problemas y errores en los commits

A medida que trabajes con Git, es posible que encuentres diversos problemas y errores relacionados con tus commits. Comprender cómo identificar estos problemas es el primer paso para resolverlos.

Problemas comunes en los commits

Algunos de los problemas más comunes relacionados con los commits que es posible que encuentres incluyen:

  1. Commits accidentales: Es posible que hayas realizado un commit de cambios que no pretendías, o que hayas olvidado incluir cambios importantes en un commit.
  2. Mensajes de commit incorrectos: El mensaje del commit puede no reflejar con precisión los cambios realizados en el commit, lo que dificulta entender el propósito del commit.
  3. Información sensible en los commits: Es posible que hayas cometido accidentalmente información sensible, como contraseñas o claves de API, que no debería almacenarse en tu repositorio.
  4. Conflictos de fusión (merge conflicts): Al fusionar ramas, es posible que encuentres conflictos en los que Git no puede resolver automáticamente las diferencias entre los cambios realizados en las diferentes ramas.
  5. Autoría de commit incorrecta: El commit puede haber sido realizado por el autor incorrecto, o la información del autor puede ser incorrecta.

Identificar problemas en los commits

Para identificar los problemas relacionados con los commits, puedes utilizar los siguientes comandos de Git:

  1. git status: Este comando muestra el estado actual de tu directorio de trabajo y el área de preparación (staging area), lo que te ayuda a identificar cualquier cambio no confirmado.
  2. git log: Este comando muestra el historial de commits, incluyendo los mensajes de commit, los autores y las marcas de tiempo, lo que te permite revisar tu historial de commits.
  3. git diff: Este comando muestra las diferencias entre tu directorio de trabajo, el área de preparación y el último commit, lo que te ayuda a identificar los cambios que no se han confirmado.
  4. git show <commit_hash>: Este comando muestra los cambios introducidos por un commit específico, lo que puede ser útil para investigar el contenido de un commit.

Al utilizar estos comandos, puedes identificar y resolver rápidamente cualquier problema o error relacionado con tus commits de Git.

Deshacer el commit más reciente

Si has realizado un commit que deseas deshacer, hay varias formas diferentes de abordar esta tarea. El método que elijas dependerá de si quieres descartar completamente el commit o mantener los cambios en tu directorio de trabajo.

Descartar el commit más reciente

Para descartar completamente el commit más reciente y eliminarlo de tu historial de commits, puedes utilizar el comando git reset con la opción --hard:

git reset --hard HEAD~1

Este comando hará lo siguiente:

  1. Moverá el puntero de la rama actual un commit hacia atrás, deshaciendo efectivamente el commit más reciente.
  2. Descartará todos los cambios realizados en el commit deshecho, restableciendo tu directorio de trabajo para que coincida con el estado del commit anterior.

Después de ejecutar este comando, el commit más reciente se eliminará de tu historial de commits y tu directorio de trabajo se actualizará para coincidir con el commit anterior.

Mantener los cambios del commit más reciente

Si quieres deshacer el commit pero mantener los cambios en tu directorio de trabajo, puedes utilizar el comando git reset con la opción --soft:

git reset --soft HEAD~1

Este comando hará lo siguiente:

  1. Moverá el puntero de la rama actual un commit hacia atrás, deshaciendo efectivamente el commit más reciente.
  2. Mantendrá los cambios del commit deshecho en tu directorio de trabajo, lo que te permitirá realizar cambios adicionales o crear un nuevo commit.

Después de ejecutar este comando, el commit más reciente se eliminará de tu historial de commits, pero los cambios seguirán estando presentes en tu directorio de trabajo, listos para que realices más modificaciones.

Recuerda, deshacer un commit es una operación poderosa, por lo que es importante ser cauteloso y asegurarte de no descartar accidentalmente trabajo importante. Siempre verifica dos veces el estado de tu repositorio antes y después de ejecutar estos comandos.

Restaurar cambios no confirmados

A veces, es posible que hayas realizado cambios en tus archivos pero aún no los hayas confirmado en tu repositorio de Git. Si necesitas descartar estos cambios no confirmados, puedes utilizar el comando git checkout para restaurar tu directorio de trabajo al estado del último commit.

Descartar todos los cambios no confirmados

Para descartar todos los cambios no confirmados en tu directorio de trabajo, utiliza el siguiente comando:

git checkout .

Este comando hará lo siguiente:

  1. Revertirá todos los archivos modificados en tu directorio de trabajo al estado en el que se encontraban en el último commit.
  2. Eliminará cualquier archivo no rastreado (archivos que no forman parte de tu repositorio de Git) de tu directorio de trabajo.

Después de ejecutar este comando, tu directorio de trabajo se restaurará al estado del último commit y cualquier cambio no confirmado se descartará.

Descartar cambios en archivos específicos

Si solo quieres descartar los cambios en archivos específicos, puedes utilizar el siguiente comando:

git checkout -- <file1> <file2> ... <fileN>

Reemplaza <file1>, <file2>, etc. con las rutas de los archivos para los que deseas descartar los cambios. Este comando revertirá los archivos especificados al estado en el que se encontraban en el último commit, mientras deja el resto de tu directorio de trabajo sin cambios.

Restaurar archivos eliminados

Si has eliminado accidentalmente un archivo de tu directorio de trabajo, puedes restaurarlo utilizando el comando git checkout:

git checkout -- <deleted_file>

Este comando restaurará el archivo eliminado desde el último commit y lo devolverá a tu directorio de trabajo.

Recuerda, el comando git checkout es una herramienta poderosa para restaurar tu directorio de trabajo a un estado conocido. Sin embargo, es importante usarlo con cuidado, ya que puede descartar potencialmente cambios importantes si se usa incorrectamente.

Revertir un commit específico

En algunos casos, es posible que necesites deshacer los cambios introducidos por un commit específico, mientras se preserva el resto de tu historial de commits. Esto se puede lograr utilizando el comando git revert.

Comprender git revert

El comando git revert crea un nuevo commit que deshace los cambios introducidos por el commit especificado. Esto es diferente de git reset, que simplemente elimina el commit del historial.

Cuando ejecutas git revert, Git hará lo siguiente:

  1. Creará un nuevo commit que deshace los cambios realizados en el commit especificado.
  2. Agregará el nuevo commit de "reversión" a tu historial de commits.

Este enfoque es útil cuando quieres deshacer un commit, pero aún preservar el resto de tu historial de commits.

Revertir un commit específico

Para revertir un commit específico, puedes utilizar el siguiente comando:

git revert <commit_hash>

Reemplaza <commit_hash> con el hash SHA-1 del commit que deseas revertir. Por ejemplo:

git revert 1234567890abcdef

Este comando hará lo siguiente:

  1. Creará un nuevo commit que deshace los cambios realizados en el commit especificado.
  2. Agregará el nuevo commit de "reversión" a tu historial de commits.

Después de ejecutar este comando, tu historial de commits se verá así:

graph LR A[Initial Commit] --> B[Commit 2] B --> C[Commit 3] C --> D[Commit 4] D --> E[Revert Commit 4]

En este ejemplo, el commit "Revert Commit 4" deshace los cambios realizados en el Commit 4, mientras se preserva el resto del historial de commits.

Manejar conflictos de fusión

Si los cambios introducidos por el commit revertido entran en conflicto con otros cambios en tu repositorio, Git te pedirá que resuelvas el conflicto de fusión. Luego puedes utilizar las técnicas estándar de resolución de conflictos de Git para abordar el conflicto y completar la operación de reversión.

Al utilizar git revert, puedes deshacer los cambios introducidos por un commit específico mientras se mantiene un historial de commits limpio y comprensible.

Modificar el último commit

A veces, es posible que necesites realizar cambios en el commit más reciente, como corregir el mensaje del commit o agregar cambios olvidados. Git proporciona el comando git commit --amend para permitirte modificar el commit más reciente.

Modificar el mensaje del commit

Para cambiar el mensaje del commit más reciente, puedes utilizar el siguiente comando:

git commit --amend -m "New commit message"

Este comando hará lo siguiente:

  1. Abrirá tu editor de texto predeterminado, lo que te permitirá editar el mensaje del commit.
  2. Creará un nuevo commit con el mensaje actualizado, reemplazando el commit anterior.

Después de ejecutar este comando, el historial de commits se actualizará con el nuevo mensaje del commit y el commit anterior se reemplazará.

Modificar el contenido del commit

Si has olvidado incluir algunos cambios en tu commit más reciente, puedes modificar el commit para incluir esos cambios:

  1. Realiza los cambios adicionales que deseas incluir en el commit.

  2. Prepara los cambios utilizando git add.

  3. Ejecuta el siguiente comando para modificar el commit:

    git commit --amend

    Este comando hará lo siguiente:

    • Abrirá tu editor de texto predeterminado, lo que te permitirá editar el mensaje del commit (si lo deseas).
    • Incluirá los nuevos cambios en el commit modificado, reemplazando el commit anterior.

Después de ejecutar este comando, el historial de commits se actualizará con el commit modificado, que ahora incluye los cambios adicionales.

Consideraciones al modificar commits

Es importante tener en cuenta que modificar un commit puede tener implicaciones, especialmente si el commit ya se ha enviado a un repositorio remoto. Modificar un commit efectivamente crea un nuevo commit, lo que significa que el hash SHA - 1 del commit cambiará. Esto puede causar problemas si otros miembros del equipo ya han basado su trabajo en el commit original.

Por lo tanto, generalmente se recomienda modificar solo los commits que no se han enviado a un repositorio remoto o comunicarse con tu equipo antes de modificar un commit que ya se ha compartido.

Al utilizar el comando git commit --amend, puedes corregir fácilmente errores o agregar cambios olvidados a tu commit más reciente, lo que te ayudará a mantener un historial de commits limpio y preciso.

Restablecer a un commit anterior

En algunos casos, es posible que necesites descartar múltiples commits y restablecer tu repositorio a un estado anterior. Git proporciona el comando git reset para ayudarte a lograr esto.

Comprender git reset

El comando git reset te permite mover el puntero de la rama actual a un commit especificado, deshaciendo efectivamente todos los commits que se producen después de ese punto. Sin embargo, es importante entender los diferentes modos de git reset, ya que pueden tener diferentes efectos en tu directorio de trabajo y en el historial de commits.

Restablecimiento suave (Soft Reset)

La opción --soft de git reset mueve el puntero de la rama al commit especificado, pero deja tu directorio de trabajo y el área de preparación (staging area) sin cambios. Esto significa que los cambios introducidos por los commits deshechos todavía están presentes en tu directorio de trabajo, y puedes elegir crear un nuevo commit o continuar trabajando en ellos.

git reset --soft <commit_hash>

Restablecimiento mixto (Mixed Reset, predeterminado)

El modo predeterminado de git reset es la opción --mixed, que mueve el puntero de la rama al commit especificado y también desprepara (unstages) cualquier cambio que se haya preparado para el siguiente commit. Sin embargo, los cambios todavía están presentes en tu directorio de trabajo, lo que te permite revisarlos y prepararlos de nuevo según sea necesario.

git reset <commit_hash>

Restablecimiento fuerte (Hard Reset)

La opción --hard de git reset mueve el puntero de la rama al commit especificado y también descarta todos los cambios en tu directorio de trabajo y en el área de preparación. Esto restablece efectivamente tu repositorio al estado del commit especificado, descartando todos los cambios posteriores.

git reset --hard <commit_hash>

Restablecer a un commit específico

Para restablecer tu repositorio a un commit anterior, puedes utilizar el comando git reset con la opción adecuada:

  1. Restablecimiento suave:
    git reset --soft <commit_hash>
  2. Restablecimiento mixto (predeterminado):
    git reset <commit_hash>
  3. Restablecimiento fuerte:
    git reset --hard <commit_hash>

Reemplaza <commit_hash> con el hash SHA - 1 del commit al que deseas restablecer.

Es importante ser cauteloso al utilizar git reset, ya que puede descartar potencialmente trabajo importante si se utiliza incorrectamente. Siempre revisa el estado de tu repositorio antes y después de ejecutar estos comandos para asegurarte de no perder ningún cambio valioso.

Resolver conflictos de fusión

Cuando fusionas ramas en Git, puede haber casos en los que las mismas líneas de código se hayan modificado en ambas ramas, lo que resulta en un conflicto de fusión. Resolver estos conflictos es una habilidad esencial para cualquier usuario de Git.

Comprender los conflictos de fusión

Un conflicto de fusión ocurre cuando Git no puede reconciliar automáticamente los cambios realizados en las dos ramas que se están fusionando. Esto suele suceder cuando las mismas líneas de código se han modificado en ambas ramas y Git no puede determinar qué cambios deben tener prioridad.

Cuando ocurre un conflicto de fusión, Git marcará las secciones conflictivas en tus archivos y tendrás que resolver manualmente los conflictos eligiendo qué cambios mantener.

Identificar conflictos de fusión

Puedes identificar los conflictos de fusión ejecutando el comando git status después de intentar fusionar dos ramas. Git listará los archivos con conflictos de fusión y luego puedes abrir estos archivos para resolver los conflictos.

git status

Esto mostrará algo como:

Unmerged files:
  (use "git add <file>..." to mark resolution)
    modified:   file1.txt
    modified:   file2.txt

Resolver conflictos de fusión

Para resolver un conflicto de fusión, sigue estos pasos:

  1. Abre los archivos conflictivos en un editor de texto.

  2. Encuentra los marcadores de conflicto agregados por Git, que se ven así:

    <<<<<<< HEAD
    ## Your changes
    =======
    ## Changes from the other branch
    >>>>>>> other-branch
  3. Decide qué cambios quieres mantener y elimina los marcadores de conflicto y los cambios que no quieres.

  4. Guarda el archivo.

  5. Agrega el archivo resuelto al área de preparación (staging area) utilizando git add.

  6. Repite los pasos 1 - 5 para todos los archivos conflictivos.

  7. Una vez que se hayan resuelto todos los conflictos, ejecuta git commit para completar la fusión.

Resolver conflictos con las herramientas de LabEx

LabEx ofrece un conjunto de herramientas que pueden ayudarte a resolver los conflictos de fusión de manera más eficiente. Por ejemplo, la Herramienta de Fusión de LabEx te permite comparar visualmente los cambios conflictivos y seleccionar fácilmente los cambios que deseas mantener.

Al entender cómo identificar y resolver los conflictos de fusión, estarás mejor preparado para gestionar la naturaleza colaborativa de los proyectos basados en Git y mantener un historial de commits limpio y coherente.

Mejores prácticas para deshacer commits

Deshacer commits es una función poderosa en Git, pero es importante usarla con cuidado para evitar consecuencias no deseadas. Aquí hay algunas mejores prácticas a tener en cuenta cuando se deshacen commits:

Comprender las implicaciones

Antes de deshacer un commit, asegúrate de entender las implicaciones de la acción que estás a punto de realizar. Deshacer un commit puede tener diferentes efectos dependiendo del método que uses (por ejemplo, git reset, git revert, git commit --amend), y es importante elegir el enfoque adecuado para tu caso de uso específico.

Comunicarse con tu equipo

Si estás trabajando en un proyecto colaborativo, es esencial comunicarte con tu equipo antes de deshacer un commit que ya se haya enviado a un repositorio remoto. Deshacer un commit puede interrumpir el flujo de trabajo de otros miembros del equipo, por lo que es importante coordinar tus acciones para evitar conflictos y confusión.

Mantener un historial de commits limpio

Al deshacer commits, intenta mantener tu historial de commits limpio y fácil de entender. Evita crear commits de "reversión" innecesarios o dejar tu repositorio en un estado inestable. Utiliza los comandos adecuados (git revert, git reset, etc.) para asegurarte de que tu historial de commits siga siendo claro y conciso.

Probar los cambios antes de enviar

Antes de enviar tus cambios a un repositorio remoto, asegúrate de probar tu trabajo exhaustivamente para asegurarte de que no has introducido ninguna regresión o efectos secundarios no deseados. Esto es especialmente importante cuando se deshacen commits, ya que quieres estar seguro de que los cambios que estás introduciendo son correctos y no causarán problemas para tu equipo.

Utilizar alias de Git para mayor eficiencia

Para hacer que deshacer commits sea más eficiente, considera crear alias de Git para los comandos que utilizas con más frecuencia. Por ejemplo, podrías crear un alias para git reset --soft HEAD~1 para deshacer rápidamente el commit más reciente sin descartar tus cambios.

Hacer copias de seguridad de tu repositorio

Como una buena práctica general, siempre es una buena idea hacer copias de seguridad periódicas de tu repositorio Git, ya sea enviándolo a un servidor remoto o creando copias de seguridad locales. Esto puede ayudarte a recuperarte de la pérdida accidental de datos o de errores al deshacer commits.

Si sigues estas mejores prácticas, podrás gestionar eficazmente tu historial de commits de Git y deshacer cambios sin causar interrupciones a tu equipo o introducir nuevos problemas en tu código.

Conclusión y recursos adicionales

En esta guía, hemos explorado los conceptos fundamentales y las mejores prácticas para trabajar con commits de Git. Al entender cómo identificar, deshacer y gestionar tu historial de commits, puedes colaborar eficazmente con tu equipo, mantener una base de código limpia y organizada y recuperarte de los errores cuando sea necesario.

Puntos clave

  • Los commits de Git son los bloques de construcción de la historia de tu proyecto, ya que representan instantáneas de tu base de código en puntos específicos del tiempo.
  • Identificar y resolver problemas relacionados con los commits, como commits accidentales o información sensible, es crucial para mantener un repositorio saludable.
  • Deshacer commits, ya sea el más reciente o un commit específico del pasado, se puede lograr utilizando varios comandos de Git como git reset, git revert y git commit --amend.
  • Resolver los conflictos de fusión que surgen durante la fusión de ramas es una habilidad esencial para colaborar con tu equipo.
  • Seguir las mejores prácticas, como comunicarte con tu equipo y mantener un historial de commits limpio, puede ayudarte a gestionar eficazmente tu repositorio de Git.

Recursos adicionales

Si estás buscando profundizar en tu comprensión de Git y el control de versiones, aquí tienes algunos recursos adicionales que pueden resultarte útiles:

Recuerda, dominar Git es un proceso continuo, y cuanto más practiques, más cómodo y competente te sentirás. ¡Feliz codificación!

Resumen

Al final de este tutorial, tendrás un sólido conocimiento de varios métodos para deshacer un commit de Git mientras se preservan tus cambios. Serás capaz de identificar y resolver problemas de commits, restaurar cambios no confirmados, revertir commits específicos, corregir el último commit y restablecer tu repositorio a un estado anterior. Además, aprenderás las mejores prácticas para deshacer commits y mantener un historial de Git limpio y organizado. Con este conocimiento, podrás tomar el control de tu flujo de trabajo de Git y garantizar una experiencia de desarrollo sin problemas.