Módulo 4: Archivos, restore y .gitignore

Unidad: GIT-05
Nivel: inicial · Itinerario troncal
Público: alumnado de DAW, DAM, ASIR y grados de informática.
Dependencias: GIT-03 y GIT-04. Precede a ramas y recuperación avanzada.
Prerrequisitos: saber usar status, add, commit y distinguir directorio de trabajo, área de preparación e historial.
Objetivo observable: gestionar renombres y eliminaciones, recuperar un archivo según su estado y excluir archivos no versionables correctamente.
Fuente técnica: documentación oficial de git restore, gitignore, git mv y git rm.

1. Idea clave

Un archivo puede cambiar en dos lugares:

Acción Directorio de trabajo Área de preparación Historial (HEAD)
Editar un archivo Cambia No cambia No cambia
git add No cambia Cambia No cambia
git restore archivo Se reemplaza con la versión preparada No cambia No cambia
git restore --staged archivo No cambia Vuelve a HEAD No cambia
git commit No cambia No cambia Crea un commit

git restore puede descartar contenido local. Antes de usarlo, consulta git status y git diff.

.gitignore solo afecta a archivos no rastreados. No deja de rastrear automáticamente un archivo que ya está en un commit.

2. Demostración práctica

Partimos de un repositorio vacío:

mkdir git05-practica
cd git05-practica
git init
git config user.name "Alumna Git"
git config user.email "alumna@example.test"

printf '# Mi proyecto\n' > README.md
git add README.md
git commit -m "docs: añade README inicial"

Descartar un cambio aún no preparado

printf '\nPendiente: practicar restore.\n' >> README.md
git status --short

Salida esperada:

 M README.md

El espacio inicial indica que el área de preparación no ha cambiado; M indica una modificación solo en el directorio de trabajo.

git restore README.md
git status --short

No habrá salida: el directorio de trabajo vuelve a coincidir con el área de preparación. El cambio escrito se ha descartado y no se ha creado ningún commit.

Deshacer un git add

printf '\nPendiente: practicar restore.\n' >> README.md
git add README.md
git status --short

Salida esperada:

M  README.md

Ahora la modificación está preparada. Para quitarla del área de preparación sin perder el contenido del archivo:

git restore --staged README.md
git status --short

Salida esperada:

 M README.md

El archivo sigue modificado en el directorio de trabajo, pero ya no está preparado. Por defecto, git restore --staged toma como origen HEAD; sin --staged, git restore toma como origen el área de preparación.

Si se quiere descartar tanto lo preparado como lo editado, se puede usar:

git restore --source=HEAD --staged --worktree README.md

Este comando sobrescribe ambos estados con la versión del último commit. Úsalo solo cuando estés seguro de no necesitar esos cambios.

Renombrar y eliminar archivos

git mv README.md GUIA.md
git status --short

Salida esperada:

R  README.md -> GUIA.md

git mv mueve el archivo en el directorio de trabajo y prepara el cambio. Confirma el renombre:

git commit -m "docs: renombra README como guía"

Para eliminar un archivo rastreado:

git rm GUIA.md
git status --short

Salida esperada:

D  GUIA.md

git rm elimina el archivo del directorio de trabajo y prepara su eliminación. Si fue un error, recupéralo antes del commit:

git restore --staged GUIA.md
git restore GUIA.md
git status --short

No habrá salida: el archivo vuelve al área de preparación y al directorio de trabajo desde HEAD.

Ignorar archivos locales

Crea archivos que no deben formar parte del proyecto:

mkdir node_modules
printf 'TOKEN=demo\n' > .env
printf 'arranque\n' > app.log

printf 'node_modules/\n.env\n*.log\n' > .gitignore
git status --short --ignored

Salida esperada:

?? .gitignore
!! .env
!! app.log
!! node_modules/

!! identifica archivos ignorados. Se versiona el archivo .gitignore, no los archivos excluidos:

git add .gitignore
git commit -m "chore: ignora archivos locales"

3. Patrones básicos de .gitignore

# Dependencias instaladas
node_modules/

# Secretos o configuración local
.env
.env.local

# Registros
*.log

# Solo el archivo temporal de la raíz
/temp.txt

Incluye en .gitignore las exclusiones que debe compartir todo el equipo. Para exclusiones personales que no se deben compartir, usa .git/info/exclude o la configuración global de Git.

Si .env ya estaba rastreado, añade la regla y deja de prepararlo para futuros commits:

git rm --cached .env
git commit -m "chore: deja de versionar configuración local"

El archivo permanece en el equipo. Si contenía una contraseña o token que ya se publicó, ignorarlo no lo borra del historial ni revoca el secreto: hay que rotarlo de inmediato.

4. Errores frecuentes

  • Ejecutar git restore archivo pensando que solo “deshace el add”. Sin --staged, sobrescribe el directorio de trabajo.
  • Añadir .env a .gitignore después de haberlo confirmado. Git seguirá rastreándolo hasta usar git rm --cached.
  • Usar git rm cuando se quería conservar el archivo en disco. En ese caso, usar git rm --cached archivo.
  • Ignorar todo con * y descubrir que desaparecen archivos necesarios de git status. Empieza por patrones específicos y compruébalos con git status --ignored.

5. Ejercicio autocorregible

En un repositorio nuevo:

  1. Crea y confirma notas.txt.
  2. Modifícalo, prepáralo y déjalo de nuevo solo modificado, sin perder el texto.
  3. Renómbralo a apuntes.txt y confirma el cambio.
  4. Elimínalo con git rm, recupéralo antes de confirmar y verifica que el repositorio quede limpio.
  5. Crea .env, debug.log y cache/datos.tmp.
  6. Escribe un .gitignore para excluirlos, confirma solo .gitignore y comprueba los ignorados.

Criterios de revisión:

  • Tras el paso 2, git status --short muestra M notas.txt.
  • Tras el paso 4, git status --short no muestra cambios.
  • .env, debug.log y cache/ aparecen como ignorados, mientras .gitignore queda versionado.
  • No se ha usado reset --hard ni se ha creado ningún remoto.

6. Resumen final

Al terminar, el alumnado debe saber:

  • decidir si un cambio está en el directorio de trabajo, el área de preparación o ambos;
  • usar git restore y git restore --staged sin confundir sus efectos;
  • renombrar con git mv, eliminar con git rm y recuperar una eliminación preparada;
  • diseñar y comprobar un .gitignore;
  • reconocer que .gitignore no protege secretos ya rastreados o publicados.

Estado editorial: listo.