Diff (Textvergleich)
Kurz: Ein Diff zeigt, welche Zeilen zwischen zwei Textfassungen hinzugekommen, weggefallen oder gleich geblieben sind.
Genauer: Das Programm diff stammt aus den 1970er-Jahren von Unix. Heute steckt das Prinzip in Git, in Code-Reviews auf GitHub, in Editoren und in Online-Werkzeugen. Grundlage ist fast immer die längste gemeinsame Teilfolge (LCS) der Zeilen: Was in beiden Fassungen in gleicher Reihenfolge vorkommt, bleibt stehen, der Rest ist die Änderung.
Im Detail
Wie die Berechnung funktioniert
Man vergleicht Zeile für Zeile und sucht die längste Folge von Zeilen, die in beiden Texten in derselben Reihenfolge vorkommt. Alles, was nur im alten Text steht, gilt als gelöscht (-), alles, was nur im neuen Text steht, als hinzugefügt (+). Einfache Verfahren bauen eine Tabelle der Größe Zeilenzahl × Zeilenzahl auf. Schnellere, wie der Myers-Algorithmus in Git, finden die kürzeste Änderungsfolge und sind bei kleinen Unterschieden sehr schnell.
Das übliche Ausgabeformat
--- alt.txt
+++ neu.txt
@@ -1,3 +1,3 @@
Hallo
-Welt
+Emzett
EndeZeilen mit Leerzeichen am Anfang sind unverändert, - steht für entfernt, + für neu. Die Zeile mit @@ nennt die Position (Startzeile und Länge im alten und im neuen Text). Genau dieses „Unified Diff“-Format liest patch ein, um Änderungen auf eine andere Kopie anzuwenden.
Nützliche Optionen
- Leerzeichen ignorieren (
diff -w): vermeidet Treffer, wenn nur eingerückt wurde. - Groß- und Kleinschreibung ignorieren (
diff -i). - Kontext (
-U3): wie viele unveränderte Zeilen um eine Änderung herum angezeigt werden. - Wort-Diff (
git diff --word-diff): markiert Änderungen innerhalb einer Zeile.
Typische Einsatzfälle
Konfigurationsdateien vergleichen („Was ist anders zwischen Test und Produktion?“), zwei Fassungen eines Vertrags oder einer Hausarbeit prüfen, Code-Änderungen vor einem Commit kontrollieren oder Merge-Konflikte verstehen. Bei Merge-Konflikten zeigt Git beide Fassungen, du entscheidest, welche bleibt.
Grenzen
Ein Zeilen-Diff erkennt keine verschobenen Absätze als „verschoben“, sondern als gelöscht und neu eingefügt. Bei sehr langen Zeilen (minimierter Code, einzeilige JSON-Dateien) ist ein Zeilenvergleich wenig hilfreich, dann vorher formatieren.