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 --shortSalida esperada:
M README.mdEl 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 --shortNo 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 --shortSalida esperada:
M README.mdAhora 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 --shortSalida esperada:
M README.mdEl 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.mdEste 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 --shortSalida esperada:
R README.md -> GUIA.mdgit 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 --shortSalida esperada:
D GUIA.mdgit 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 --shortNo 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 --ignoredSalida 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.txtIncluye 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 archivopensando que solo “deshace eladd”. Sin--staged, sobrescribe el directorio de trabajo. - Añadir
.enva.gitignoredespués de haberlo confirmado. Git seguirá rastreándolo hasta usargit rm --cached. - Usar
git rmcuando se quería conservar el archivo en disco. En ese caso, usargit rm --cached archivo. - Ignorar todo con
*y descubrir que desaparecen archivos necesarios degit status. Empieza por patrones específicos y compruébalos congit status --ignored.
5. Ejercicio autocorregible
En un repositorio nuevo:
- Crea y confirma
notas.txt. - Modifícalo, prepáralo y déjalo de nuevo solo modificado, sin perder el texto.
- Renómbralo a
apuntes.txty confirma el cambio. - Elimínalo con
git rm, recupéralo antes de confirmar y verifica que el repositorio quede limpio. - Crea
.env,debug.logycache/datos.tmp. - Escribe un
.gitignorepara excluirlos, confirma solo.gitignorey comprueba los ignorados.
Criterios de revisión:
- Tras el paso 2,
git status --shortmuestraM notas.txt. - Tras el paso 4,
git status --shortno muestra cambios. .env,debug.logycache/aparecen como ignorados, mientras.gitignorequeda versionado.- No se ha usado
reset --hardni 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 restoreygit restore --stagedsin confundir sus efectos; - renombrar con
git mv, eliminar congit rmy recuperar una eliminación preparada; - diseñar y comprobar un
.gitignore; - reconocer que
.gitignoreno protege secretos ya rastreados o publicados.
Estado editorial: listo.