El historial
1. 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 #
-
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.
-
-
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").
-
-
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 restore: Descartar y desmarcar cambios con precisión #
En Git moderno, git restore es el comando específico y seguro para restaurar archivos a versiones anteriores o sacarlos del área de preparación (unstage), evitando el uso sobrecargado de git checkout -- o git reset HEAD.
Descartar cambios en el Working Directory (limpiar cambios locales no preparados): #
1git restore archivo.txt
(Elimina las modificaciones locales del archivo y lo devuelve al estado del último commit).
Sacar archivos del Staging Area (Unstage, deshacer git add): #
1git restore --staged archivo.txt
(Mueve el archivo de vuelta al estado modificado sin preparar, manteniendo intactas tus ediciones en disco).
Restaurar un archivo desde un commit o rama anterior: #
1git restore --source=HEAD~2 archivo.txt 2# O desde otra rama: 3git restore --source=main archivo.txt
Descartar cambios simultáneamente en Staging y Working Directory: #
1git restore --staged --worktree archivo.txt
git stash: Guardar y recuperar cambios temporales #
El comando git stash permite almacenar provisionalmente los cambios no confirmados (sin hacer un commit), dejando el directorio de trabajo completamente limpio para que puedas cambiar de rama con git switch o atender una urgencia.
Guardar cambios en el stash con mensaje descriptivo (recomendado) #
- Uso moderno:
(También puedes incluir archivos no rastreados con1git stash push -m "WIP: formulario de login a medias"git stash push -u -m "mensaje").
Ver los cambios guardados en el stash #
-
Listar entradas guardadas:
1git stash list -
Inspeccionar el diff contenido en un stash:
1git stash show -p stash@{0}
Recuperar cambios guardados en el stash #
-
git stash pop: Aplica los cambios guardados y los elimina del almacén de stash.1git stash pop -
git stash apply: Aplica los cambios pero los conserva en la lista de stash para poder reutilizarlos.1git stash apply stash@{0} -
Crear una rama directamente a partir de un stash:
1git stash branch feature/desde-stash stash@{0}
Eliminar un stash #
-
Eliminar el más reciente o uno específico:
1git stash drop stash@{0} -
Limpiar todos los stashes:
1git stash clear
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~nDonde
nes el número de commits que quieres reescribir. -
Qué hace:
- Abre un editor donde puedes ver una lista de los últimos
ncommits. - Te permite modificar esos commits, cambiar su orden, fusionar (
squash) commits, o eliminar (drop) commits.
- Abre un editor donde puedes ver una lista de los últimos
Opciones en git rebase -i #
- pick: Deja el commit tal como está.
- reword: Edita el mensaje del commit.
- edit: Modifica el commit, permitiéndote cambiar los archivos confirmados.
- squash: Fusiona el commit con el commit anterior.
- 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.
Cambiar el último commit 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 --amendEsto agregará
archivo_olvidado.txtal último commit, actualizando su contenido sin crear un nuevo commit.
Resumen del tema
Conceptos clave #
- Modos de
git reset(Reescribe historial local):--soft: retrocede el puntero HEAD manteniendo los cambios en el Staging Area.--mixed(por defecto): retrocede HEAD y saca los cambios a Working Directory sin stage.--hard: destruye irrevocablemente los cambios tanto de stage como de Working Directory.
git revert(Deshacer seguro en ramas compartidas): genera un commit nuevo inverso sin alterar el historial pasado.- Restauración y Almacén Temporal:
git restore <archivo>: descarta modificaciones no preparadas.git stash/git stash pop: guarda y recupera el trabajo en progreso para limpiar el directorio de trabajo temporalmente.
- Reescritura del Historial:
git commit --amend: rectifica el último commit (mensaje o archivos olvidados).git rebase -i HEAD~n: reordena, combina (squash), edita (reword/edit) o elimina (drop) commits interactivos.
Qué debes recordar #
Usa git reset o rebase -i exclusivamente en ramas locales privadas; para ramas públicas y compartidas, utiliza siempre git revert para no romper el historial de tus compañeros.