Layer 8Ehrlicher Tech-Support
SoftwareSchweregrad: Lästigwarning: LF will be replaced by CRLF

Git zeigt die ganze Datei als geändert – obwohl du nichts geändert hast

Der Diff markiert jede Zeile als geändert, obwohl nur ein Wort angepasst wurde? Zeilenenden. Windows und Unix streiten sich um ein unsichtbares Zeichen.

Aufwand:
ca. 30 Min.
Voraussetzung:
Terminal

Das Symptom

Du änderst ein einziges Wort. git diff zeigt 400 geänderte Zeilen. Oder du klonst ein Repository, rührst nichts an – und git status behauptet, du hättest die halbe Codebasis umgeschrieben. Der Diff sieht aus, als sei etwas fürchterlich schiefgegangen.

Die „Layer 8“-Wahrheit

Es ist tatsächlich alles geändert. Nur nicht von dir, und nicht sichtbar.

Am Ende jeder Zeile steht ein unsichtbares Zeichen, und die Computerwelt hat sich nie darauf einigen können, welches. Unix beendet eine Zeile mit einem Zeichen: LF. Windows verwendet zwei: CR und LF, ein Erbe der Fernschreiber, bei denen der Druckkopf erst zurückfahren und dann eine Zeile vorrücken musste. Diese Mechanik gibt es seit Jahrzehnten nicht mehr. Das Zeichen ist geblieben.

Git vergleicht Bytes, nicht Absichten. Wenn eine Datei mit LF eingecheckt und auf einem Windows-Rechner mit CRLF gespeichert wird, hat sich jede einzelne Zeile geändert – und Git meldet das völlig korrekt. Der Diff lügt nicht. Er zeigt Ihnen eine Wahrheit, die Sie nicht sehen können, weil Ihr Editor die Zeichen versteckt.

Der eigentliche Fehler liegt anderswo: Die meisten lösen das mit core.autocrlf auf ihrem eigenen Rechner. Das funktioniert – für sie. Der nächste Kollege mit anderer Konfiguration bringt das Problem umgehend zurück, und niemand versteht mehr, warum. Ein Problem, das das gesamte Repository betrifft, gehört auch dort gelöst: in einer .gitattributes, die für jeden gilt, der klont, egal auf welchem System er sitzt.

Die echte, verifizierte Lösung

1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:

  1. 1.

    Das Symptom erkennen

    Sie ändern ein Wort, und git diff markiert 400 Zeilen als geändert. Oder git status meldet Dateien als verändert, die Sie nie angefasst haben. Beides sind klassische Anzeichen für einen Streit um die Zeilenenden – nicht für ein kaputtes Repository.

  2. 2.

    Die Ursache verstehen

    Windows beendet eine Zeile mit zwei Zeichen (CRLF), Unix mit einem (LF). Wechselt eine Datei zwischen beiden Welten, ändert sich damit jede einzelne Zeile – zumindest aus Sicht von Git, das Bytes vergleicht und keine Absichten kennt.

  3. 3.

    Eine .gitattributes anlegen

    Die einzige Lösung, die für alle im Team gilt, liegt im Repository selbst. Diese Datei legt fest, dass Textdateien im Repository einheitlich mit LF gespeichert werden – unabhängig davon, welches Betriebssystem der Einzelne benutzt.

    * text=auto eol=lf
  4. 4.

    Binärdateien ausnehmen

    Bilder, Archive und andere Binärdateien dürfen unter keinen Umständen umgeschrieben werden – das zerstört sie. Markieren Sie diese Typen ausdrücklich, damit Git die Finger von ihnen lässt.

    *.png binary
    *.jpg binary
    *.pdf binary
  5. 5.

    Den Bestand einmalig normalisieren

    Die neue Regel gilt zunächst nur für neu geschriebene Dateien. Der vorhandene Bestand muss einmalig umgestellt werden. Dieser Commit sollte nichts anderes enthalten – sonst geht die eigentliche Änderung in tausenden Zeilen unter.

    git add --renormalize . && git commit -m "Zeilenenden normalisiert"
  6. 6.

    Nicht mit core.autocrlf herumdoktern

    Diese Einstellung gilt nur auf Ihrem Rechner. Sie behebt das Problem für Sie und lässt es für alle anderen bestehen – und beim nächsten Kollegen mit anderer Konfiguration ist es wieder da. Ein Problem des Repositorys gehört im Repository gelöst.

Häufige Fragen (FAQ)

?Warum sind Zeilenenden überhaupt ein Problem?

Weil Windows eine Zeile mit zwei Zeichen beendet (CR und LF), Linux und macOS dagegen mit einem einzigen (LF). Für Git ist das ein Unterschied im Dateiinhalt – und damit eine Änderung in jeder einzelnen Zeile. Der Diff hat vollkommen recht, er meint nur etwas, das Sie nicht sehen können.

?Was ist der Unterschied zwischen .gitattributes und core.autocrlf?

core.autocrlf ist eine Einstellung Ihres Rechners – sie gilt nur für Sie. .gitattributes liegt im Repository und gilt für alle, die es klonen, unabhängig von deren Betriebssystem und Konfiguration. Deshalb ist .gitattributes die richtige Lösung und core.autocrlf nur ein persönliches Pflaster.

?Ich habe .gitattributes angelegt, und trotzdem bleibt alles geändert. Warum?

Weil die Dateien im Repository noch die alten Zeilenenden tragen. Die neue Regel gilt erst für neu geschriebene Dateien. Sie müssen den Bestand einmalig normalisieren – mit git add --renormalize . und einem eigenen Commit, der genau das und nichts anderes tut.

Belege

Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.

Zuletzt geprüft am . Dokumentation altert – ein Datum daneben ist der einzige ehrliche Umgang damit.

Auch zu finden unter

Verwandte Fehler

SWLästigdetached HEAD

Git: detached HEAD state

Git meldet „detached HEAD“? Du stehst nicht auf einem Branch, sondern direkt auf einem Commit — Änderungen hier gehen ohne Gegenmaßnahme leicht verloren.

SWLästiggpg failed to sign the data

Git-Commit scheitert an der GPG-Signatur

git commit bricht mit „gpg failed to sign the data“ ab? Meist fehlt der passende Schlüssel, oder GPG kann im Terminal nicht nach der Passphrase fragen.

SWLästigCONFLICT

Git: Merge-Konflikt (CONFLICT)

Git meldet einen Konflikt beim Zusammenführen? Beide Seiten haben dieselbe Stelle geändert. Git kann nicht raten, welche gilt — das entscheidest du.