Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

Git sobrescribiría archivos sin seguimiento: conserva y clasifica primero

Trata el rechazo como una barrera de seguridad. Copia las rutas exactas, comprueba qué sigue el árbol entrante y qué se ignora localmente, y elige un movimiento o stash reversible antes de limpiar.

Ilustración original de una puerta de merge que detiene dos rutas en colisión y mantiene una copia protegida fuera de la operación.
Ilustración original: el rechazo es una barrera; copia las rutas locales antes de cambiar el árbol. Watch at Ease

Git detiene merge, pull o checkout cuando una ruta seguida por el árbol entrante sobrescribiría una ruta local que el índice no representa de forma segura. El rechazo protege bytes; no demuestra que el archivo sea desechable ni que una orden universal sea segura.

Crea un registro para cada ruta, conserva los bytes fuera del árbol y clasifica la identidad local y entrante antes de elegir mover, stash, añadir, limpiar de forma dirigida o pedir una decisión de propiedad.

1. Detén la operación y conserva las rutas

Copia el error completo y la lista antes de reset, checkout, clean, pull u otro merge. Registra git status --short --untracked-files=all, rama y HEAD, orden fallida y objetivo de integración.

Copia cada ruta fuera del árbol; guarda modo y suma para archivos importantes. Busca .git anidado, secretos, salidas generadas, configuración local o trabajo irremplazable.

2. Demuestra el estado local y la propiedad entrante

Desde la raíz usa git ls-files --error-unmatch, --others --exclude-standard y --ignored para distinguir seguido, no seguido e ignorado. git check-ignore -v muestra el origen de la regla.

Tras fetch, usa git ls-tree -r --name-only <target> -- path para saber si el commit objetivo posee el nombre. Archivo/directorio, mayúsculas, sparse checkout, submódulos y repositorios anidados son límites separados.

3. Elige una conservación reversible

Si la ruta local vale pero debe seguir local, mueve el original fuera del árbol, deja entrar el archivo seguido y reconcilia después. Si debe versionarse, confirma propietario y secretos antes de commit; no crees uno temporal solo para silenciar el error.

Un stash normal no promete incluir rutas sin seguimiento. --include-untracked las añade; --all incluye también ignored y limpia el árbol. Inspecciona el stash y prefiere apply a pop hasta verificar la restauración.

4. Usa clean solo para rutas desechables demostradas

Empieza con git clean -n y un pathspec exacto. -d entra en directorios sin seguimiento, -x incluye ignored y -X elimina solo ignored. Cambian el alcance y no son atajos intercambiables.

Force y la barrera de repositorios anidados no clasifican datos. No pases a git clean -fdx porque la vista previa parezca familiar; conserva primero los bytes valiosos.

5. Repite la integración original y verifica el límite

Tras mover, guardar o eliminar deliberadamente los nombres, repite una vez merge, pull o checkout original. Comprueba el commit, restaura ruta por ruta y conserva la copia hasta que pasen las pruebas.

Nuestro fixture con Git 2.39.2 reprodujo la colisión; merge se detuvo y la suma local no cambió. No reprodujo sparse checkout, mayúsculas, submódulos, Git LFS, IDE, CI ni gestión de secretos.

Ilustración original que clasifica rutas valiosas, ignoradas o generadas y seguidas por el árbol entrante antes del merge.
Ilustración original: clasifica cada ruta, conserva los bytes y elige una vía reversible antes de limpiar. Watch at Ease