El comando git restore ha llegado para facilitarnos la vida a la hora de deshacer cambios en nuestros archivos modificados o en el área de staging. Tradicionalmente, para revertir modificaciones en un archivo habíamos usado git checkout -- archivo, pero este comando puede resultar confuso porque originalmente está pensado para cambiar de ramas o mover el HEAD. Con git restore tenemos una herramienta más clara y específica para restaurar archivos a su estado original.
Imaginemos que modificamos el archivo readme.md y añadimos una línea como hola mundo. Si ejecutamos git status, veremos que el archivo aparece como modificado. Para ver exactamente qué hemos cambiado, usamos git diff. Hasta ahora, para deshacer esos cambios, habríamos usado:
git checkout -- readme.md
Este comando lo que hace es traer la versión del archivo que está en el commit actual de la rama en la que estamos, por ejemplo, main, y reemplazar el archivo modificado en nuestro directorio de trabajo. Así, el archivo vuelve a su estado original y desaparecen los cambios.
Sin embargo, con git restore podemos hacer esto de forma más intuitiva y directa. Simplemente ejecutamos:
git restore readme.md
Y el archivo vuelve a su estado original, sin necesidad de entender que realmente estamos trayendo la versión del commit actual. Esto hace que el comando sea más fácil de recordar y usar, especialmente para quienes empiezan con Git.
Pero git restore no solo funciona para el directorio de trabajo, también nos permite manipular el área de staging. Por defecto, cuando ejecutamos git restore archivo, solo afecta al directorio de trabajo, es decir, deshace los cambios que aún no hemos añadido al staging. Si el archivo ya está en staging, git restore no lo tocará.
Para retirar un archivo del área de staging, usamos la opción --staged:
git restore --staged readme.md
Esto mueve el archivo del área de staging de vuelta al directorio de trabajo, como si dijéramos espera, no quiero incluir este archivo en el próximo commit todavía. Es muy útil si nos hemos equivocado y queremos dividir un commit en varios o simplemente no queremos incluir ciertos cambios por ahora.
Si queremos eliminar los cambios tanto del área de staging como del directorio de trabajo, podemos combinar las opciones --staged y --worktree:
git restore --staged --worktree readme.md
Esto es equivalente a ejecutar primero git restore --staged readme.md y luego git restore readme.md, pero en un solo paso. Así, el archivo vuelve completamente a su estado original, como si nunca hubiéramos hecho cambios.
Además, git restore nos permite recuperar versiones específicas de archivos desde otros commits, ramas o tags usando la opción --source. Por ejemplo, para traer el archivo readme.md desde el tag v4.0.0 al directorio de trabajo, haríamos:
git restore --source v4.0.0 readme.md
Esto reemplaza el archivo en nuestro directorio de trabajo con la versión que había en ese tag, pero no lo añade al área de staging, lo que nos da control para revisar los cambios antes de decidir si los incluimos en un commit.
Aunque git checkout sigue estando disponible y no va a desaparecer pronto, git restore nos ofrece una forma más clara y específica para deshacer cambios y manejar el área de staging, con comandos más fáciles de entender y recordar. Para explorar todas las opciones que ofrece, podemos consultar la ayuda con:
git restore -h
y descubrir todos los flags disponibles, como el modo silencioso y otros parámetros útiles.
En definitiva, git restore es una herramienta que nos ayuda a mantener nuestro directorio de trabajo y staging limpios y controlados, simplificando tareas que antes podían resultar confusas con git checkout.