Deutsche Komposita können beliebig lang werden — ändert sich in "Rinderkennzeichnungs- und Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz" auch nur ein einziger Bestandteil, markiert ein zeilenbasierter Diff trotzdem die gesamte Zeile als geändert, weil für ihn das ganze zusammengesetzte Wort ein einziger unteilbarer Textblock ist.
Die längste gemeinsame Teilfolge
Der klassische Diff-Ansatz basiert auf der Suche nach der längsten gemeinsamen Teilfolge (LCS) von Zeilen zwischen zwei Textversionen. Zeilen, die Teil dieser Teilfolge sind, gelten als unverändert; alles andere wird als aus der alten Version entfernt oder zur neuen hinzugefügt markiert. Das Ergebnis ist eine minimale Menge an Änderungen, nicht irgendeine mögliche Abfolge von Löschungen und Einfügungen.
Wie man das Ergebnis liest
Entfernte Zeilen werden meist mit - in Rot markiert, hinzugefügte mit + in Grün. Eine im Alltagssinn „geänderte" Zeile wird technisch als Entfernen der alten Zeile plus Hinzufügen der neuen dargestellt — Diff kennt kein eigenes Konzept des Bearbeitens einer Zeile an Ort und Stelle.
Warum zeilenweiser Vergleich nicht immer intuitiv ist
Fügt man mitten im Text eine einzelne neue Zeile ein, kann ein zeilenweiser Vergleich alle folgenden Zeilen als „geändert" anzeigen, weil der Algorithmus eine Einfügung nicht immer von einem massenhaften Ersatz unterscheiden kann. Bei langen deutschen Komposita verschärft sich das Problem: Ein Diff auf Zeilenebene kann nicht zeigen, dass nur ein Bindungs-S oder ein einziges Fugenelement innerhalb des Wortes ausgetauscht wurde.
Wozu man das braucht
- Genau prüfen, was sich zwischen zwei Versionen einer Konfigurationsdatei oder eines Dokuments geändert hat.
- Einen Code-Review nachvollziehen, indem man die Logik des Unterschied-Algorithmus versteht.
- Die Ausgabe eines Skripts vor und nach einem Refactoring vergleichen, um sicherzustellen, dass es keine Regression gibt.
Diff auf Zeilenebene gegen Zeichenebene
Der Vergleich Zeile für Zeile eignet sich gut für Code und Konfigurationsdateien, aber bei Fließtext oder einem langen Satz, in dem sich nur ein Wort geändert hat, markiert er die gesamte Zeile als entfernt und neu hinzugefügt. Ein Diff auf Wort- oder Zeichenebene innerhalb der Zeile — oder sogar innerhalb eines einzelnen Kompositums — zeigt präziser genau die geänderte Stelle, auf Kosten einer höheren Rechenkomplexität bei großen Texten.