Guía

LF y CRLF en Git: cómo evitar cambios en todas las líneas

Entiende por qué Git puede marcar un archivo completo como modificado y fija finales de línea coherentes con .gitattributes.

por Tools in a Tab · Publicado el · Revisado el

Respuesta breve

LF y CRLF representan el final de una línea con bytes distintos. Si un editor o Git convierte todo el archivo de un formato al otro, el diff puede mostrar cada línea como cambiada aunque el texto visible sea igual. Define la política en .gitattributes, renormaliza una vez y revisa ese cambio por separado de las modificaciones funcionales.

Qué cambia realmente

  • LF usa el byte 0A.
  • CRLF usa los bytes 0D 0A.

Por eso dos archivos que se ven iguales pueden producir hashes SHA-256 diferentes. También explica por qué un diff de bajo nivel encuentra cambios que un comparador configurado para normalizar finales de línea puede ignorar. El comparador de textos de Tools in a Tab normaliza CRLF y CR a LF para centrarse en el contenido de cada línea.

Fijar una política en el repositorio

Una base habitual para proyectos multiplataforma es:

* text=auto
*.sh text eol=lf
*.bat text eol=crlf

El atributo text permite que Git normalice texto a LF en el índice. eol=lf o eol=crlf determina el formato solicitado en el directorio de trabajo. La documentación oficial de gitattributes define estos comportamientos y debe ser la referencia para casos especiales.

No marques indiscriminadamente archivos binarios como texto. Si un formato no debe transformarse, decláralo como binario, por ejemplo:

*.png binary
*.zip binary

Aplicar la norma a archivos existentes

Después de guardar .gitattributes, Git puede necesitar recalcular cómo guarda los archivos ya seguidos. Haz la renormalización en una rama limpia y en un commit dedicado:

git add --renormalize .
git diff --cached

Revisa el diff antes de confirmar. Si también contiene cambios de código, sepáralos para que la revisión pueda distinguir la conversión mecánica de una modificación real.

Evitar que vuelva a ocurrir

Configura el editor para respetar .gitattributes, conserva una política versionada y no dependas únicamente de la preferencia global de cada persona. Si un hash no coincide, comprueba el final de línea y la presencia de una línea final antes de asumir corrupción.

La regla práctica es sencilla: Git decide la representación compartida; el editor decide cómo mostrarla. Cuando ambos siguen una norma explícita, los diffs vuelven a mostrar solo cambios significativos.