Curso git nivel medio

8. Deshacer y modificar el historial

Git proporciona herramientas flexibles para deshacer cambios, revertir commits, y modificar el historial. Estas herramientas te permiten corregir errores, recuperar cambios temporales, y reescribir el historial de commits. Aquí veremos algunos de los comandos más importantes para manejar estas tareas.


git reset: Deshacer cambios

El comando git reset se utiliza para deshacer cambios en el historial de commits y modificar el área de staging o el directorio de trabajo. Este comando permite "deshacer" commits recientes o cambios en el área de preparación (staging area).

Modos de git reset:
  1. git reset --soft: Conserva los cambios realizados en los archivos y solo mueve el puntero del commit hacia atrás.

    • Uso:

      1git reset --soft HEAD^
    • Qué hace: Deshace el último commit pero deja los cambios en el área de staging, listos para ser commiteados de nuevo.

  2. git reset --mixed (por defecto): Mueve el puntero del commit hacia atrás y saca los archivos del área de staging, pero deja los cambios en el directorio de trabajo.

    • Uso:

      1git reset --mixed HEAD^
    • Qué hace: Elimina el último commit y mueve los cambios al directorio de trabajo (quedan como "modificados").

  3. git reset --hard: Mueve el puntero del commit hacia atrás y elimina los cambios tanto del área de staging como del directorio de trabajo.

    • Uso:

      1git reset --hard HEAD^
    • Qué hace: Elimina el último commit y descarta todos los cambios no confirmados, tanto en el área de staging como en el directorio de trabajo. ¡Este comando es irreversible!


git revert: Revertir commits

El comando git revert se utiliza para deshacer los cambios introducidos por un commit anterior, creando un nuevo commit que invierte esos cambios. A diferencia de git reset, no modifica el historial existente, lo que lo convierte en una opción segura para deshacer commits en un entorno colaborativo.

  • Uso:

    1git revert <commit>
  • Qué hace:

    • Crea un nuevo commit que revierte los cambios realizados en el commit especificado.
    • No elimina el commit original; simplemente aplica un commit inverso, lo que es útil para mantener un historial claro.
  • Ejemplo: Si quieres revertir el commit abc123:

    1git revert abc123

Esto creará un nuevo commit que deshace los cambios del commit abc123.


git checkout para revertir cambios en archivos

El comando git checkout se puede utilizar para descartar cambios no confirmados en archivos específicos y restaurarlos a su última versión confirmada o a una versión de un commit específico.

  • Uso para revertir un archivo modificado:

    1git checkout -- <archivo>
  • Qué hace:

    • Restaura el archivo especificado a su última versión confirmada (elimina los cambios no confirmados).
    • Importante: Este comando eliminará cualquier cambio no commitido en ese archivo.
  • Ejemplo: Si has modificado archivo.txt pero quieres descartar esos cambios:

    1git checkout -- archivo.txt

Esto restaurará archivo.txt a su estado en el último commit.

  • Uso para recuperar un archivo de un commit anterior:

    1git checkout <commit> -- <archivo>

    Esto te permitirá restaurar un archivo desde un commit anterior.


git stash: Guardar y recuperar cambios temporales

El comando git stash permite guardar temporalmente los cambios no commiteados (sin hacer un commit), dejando el directorio de trabajo limpio para que puedas cambiar de rama o hacer otras operaciones sin perder esos cambios.

Guardar cambios en el stash
  • Uso:

    1git stash
  • Qué hace:

    • Guarda los cambios no confirmados (tanto del área de staging como del directorio de trabajo) en un "stash" temporal.
    • Limpia el directorio de trabajo y el área de staging, dejándolos como si hubieras hecho un git checkout.
Ver los cambios guardados en el stash
  • Uso:

    1git stash list

    Muestra una lista de todos los stash almacenados.

Recuperar cambios guardados en el stash
  • Uso:

    1git stash apply

    Aplica los cambios guardados en el stash más reciente al directorio de trabajo.

Recuperar y eliminar el stash
  • Uso:

    1git stash pop

    Aplica los cambios guardados y elimina ese stash de la lista.

Eliminar el stash
  • Uso:

    1git stash drop

    Elimina el stash más reciente sin aplicarlo.


Reescribir el historial con git rebase interactivo

El comando git rebase te permite reescribir el historial de commits, lo que puede ser útil para limpiar el historial antes de compartir tus cambios o para fusionar varias ramas en una sola.

git rebase -i (rebase interactivo)

El rebase interactivo (git rebase -i) te permite modificar commits, cambiar el orden, fusionar commits o eliminar commits anteriores.

  • Uso:

    1git rebase -i HEAD~n

    Donde n es el número de commits que quieres reescribir.

  • Qué hace:

    • Abre un editor donde puedes ver una lista de los últimos n commits.
    • Te permite modificar esos commits, cambiar su orden, fusionar (squash) commits, o eliminar (drop) commits.
Opciones en git rebase -i:
  1. pick: Deja el commit tal como está.
  2. reword: Edita el mensaje del commit.
  3. edit: Modifica el commit, permitiéndote cambiar los archivos confirmados.
  4. squash: Fusiona el commit con el commit anterior.
  5. drop: Elimina el commit.
Ejemplo:

Si quieres reescribir los últimos 3 commits:

1git rebase -i HEAD~3

Esto abrirá un editor donde podrás elegir qué hacer con cada commit. Puedes, por ejemplo, fusionar dos commits o cambiar el mensaje de uno de ellos.


Borrar y cambiar commits con git commit --amend

El comando git commit --amend te permite modificar el commit más reciente. Es útil si te das cuenta de que olvidaste agregar algo al commit o si necesitas cambiar el mensaje del commit.

Modificar el mensaje de un commit
  • Uso:

    1git commit --amend
  • Qué hace:

    • Abre el editor de texto donde puedes modificar el mensaje del commit más reciente.
    • No crea un nuevo commit, sino que reemplaza el commit existente con el nuevo.
Añadir archivos al commit más reciente

Si olvidaste incluir algunos archivos en el commit más reciente, puedes añadirlos al commit en lugar de crear uno nuevo.

  • Uso:

    1git add archivo_olvidado.txt
    2git commit --amend

    Esto agregará archivo_olvidado.txt al último commit, actualizando su contenido sin crear un nuevo commit.


Resumen

Git ofrece varias formas de deshacer y modificar el historial de commits. git reset es útil para mover el puntero del historial y deshacer cambios en el área de staging y el directorio de trabajo. git revert permite deshacer un commit creando un commit inverso, mientras que git commit --amend es ideal para modificar el commit más reciente. Además, git stash permite guardar y recuperar cambios temporales, y el rebase interactivo (git rebase -i) te permite reescribir el historial de commits de manera controlada. Con estas herramientas, puedes gestionar tu historial de manera flexible y corregir errores sin comprometer la integridad de tu proyecto.

  • Loading...
  • Te has equivocado y deseas deshacer el último commit. Elimina el último commit y descarta todos los cambios no confirmados, tanto en el área de staging como en el directorio de trabajo.

    Loading...
  • Tu jefe te ha pedido que deshagas los cambios que hiciste en el último commit, pero que los guardes temporalmente para poder trabajar en ellos más tarde. Guardar temporalmente los cambios no commiteados.

    Loading...
  • El mensaje que le has puesto a tu último commit no es el adecuado. Debes cambiarlo. Cambia ese mensaje sin crear un nuevo commit.

    Loading...