Wie Textvergleich funktioniert
Ein Diff beantwortet eine einzige Frage: Was muss sich ändern, damit aus dem ersten Text der zweite wird? Diese Anleitung erklärt, wie Diff-Werkzeuge die Antwort finden, wie man ihre Ausgabe liest und wie man zwei Fassungen so vorbereitet, dass das Ergebnis die Änderungen zeigt, auf die es ankommt, statt Rauschen.
Was ein Diff zeigt
Die meisten Diff-Werkzeuge, auch der LeedyBox-Textvergleich, vergleichen Texte Zeile für Zeile. Jede Zeile des Ergebnisses gehört zu einer von drei Arten: unverändert (in beiden Fassungen), entfernt (nur im Original) oder hinzugefügt (nur in der neuen Fassung). Eine eigene Art „geändert“ gibt es nicht, deshalb erscheint eine Zeile, in der ein Wort geändert wurde, zweimal, einmal als entfernt und einmal als hinzugefügt:
Dear customer,
- Your order ships on Monday.
+ Your order ships on Tuesday.
Kind regards
Die Markierungen folgen einer alten Konvention: - für entfernt, + für hinzugefügt und ein Leerzeichen für unveränderte Zeilen. Farben, meist Rot und Grün, wiederholen dieselbe Information.
Wie die Zeilen zugeordnet werden
Ein Diff-Werkzeug sucht die längste Folge von Zeilen, die in beiden Texten in derselben Reihenfolge vorkommen, die längste gemeinsame Teilfolge. Diese Zeilen bleiben unverändert; alles andere wird als entfernt oder hinzugefügt markiert. Ist das Original A, B, C, D und der neue Text A, C, B, D, hat die längste gemeinsame Folge drei Zeilen, zum Beispiel A, B, D, sodass C als verschoben erscheint: an einer Stelle entfernt, an einer anderen hinzugefügt.
Oft gibt es mehrere gleich lange Antworten, und Werkzeuge wählen unterschiedlich zwischen ihnen. Deshalb kann dasselbe Dateipaar in zwei Programmen leicht unterschiedliche Diffs ergeben. Git verwendet standardmäßig den Myers-Algorithmus und bietet patience und histogram als Alternativen, die bei Code mit vielen Zeilen, die nur eine schließende Klammer enthalten, oft besser lesbare Ergebnisse liefern.
Die Suche nach der längsten gemeinsamen Folge erfordert Arbeit, die mit der Zeilenzahl des einen Textes mal der des anderen wächst. Das LeedyBox-Werkzeug legt zuerst identische Zeilen am Anfang und Ende beiseite, vergleicht den Rest und hält mit einer Meldung an, wenn dieses Produkt 4.000.000 übersteigt, etwa bei rund 2.000 gegen 2.000 unterschiedlichen Zeilen.
Unified Diffs aus Git und Code-Reviews lesen
Die Versionsverwaltung zeigt nur die geänderten Teile einer Datei, im Unified-Diff-Format:
--- a/config.yml
+++ b/config.yml
@@ -12,4 +12,5 @@
server:
- port: 8080
+ port: 8081
+ timeout: 30
database:
Die Zeilen --- und +++ nennen die alte und die neue Datei. Der Hunk-Header @@ -12,4 +12,5 @@ bedeutet: Dieser Block beginnt in der alten Datei in Zeile 12 und umfasst 4 Zeilen, in der neuen Datei beginnt er in Zeile 12 und umfasst 5 Zeilen. Einige unveränderte Zeilen um jede Änderung, standardmäßig drei, liefern Kontext. Ein Werkzeug, das den ganzen Text zeigt, wie das von LeedyBox, hat keine Hunk-Header, weil jede Zeile sichtbar ist; aus diesem Grund lässt sich seine Ausgabe nicht als Patch anwenden.
Texte für einen brauchbaren Vergleich vorbereiten
Ein Diff vergleicht Zeichen, nicht Bedeutung. Kleine unsichtbare Unterschiede lassen Zeilen abweichen und können die echten Änderungen verdecken:
- Leerzeichen und Tabulatoren am Zeilenende, oder Tabulatoren in der einen Fassung und Leerzeichen in der anderen. Entfernen Sie Leerzeichen am Zeilenende und verwenden Sie in beiden dieselbe Einrückung.
- Unsichtbare Zeichen wie ein geschütztes Leerzeichen oder ein Leerzeichen ohne Breite, häufig in Text, der aus Webseiten und Textverarbeitungen kopiert wurde.
- Unicode-Formen. Ein Buchstabe mit Akzent wie é kann als ein Zeichen gespeichert sein oder als e plus kombinierender Akzent. Text aus macOS-Dateinamen oder manchen PDFs verwendet oft die zweite Form.
- Typografische Anführungszeichen und Gedankenstriche. Textverarbeitungen ersetzen " durch „ “ und - durch –, sodass eine eingefügte Kopie nicht mehr zum schlichten Original passt.
- Zeilenenden. Windows beendet Zeilen mit CR LF, macOS und Linux mit LF. Browser machen aus jedem Zeilenumbruch in einem Textfeld ein LF, deshalb zeigt sich dieser Unterschied im LeedyBox-Werkzeug nicht, wohl aber in Werkzeugen, die Dateien direkt vergleichen.
- Formatierung von Daten und Code. Neu eingerücktes JSON oder Schlüssel in anderer Reihenfolge lassen fast jede Zeile abweichen. Formatieren Sie beide Fassungen zuerst gleich, zum Beispiel mit sortierten Schlüsseln und derselben Einrückung.
Fließtext vergleichen
In gewöhnlichen Dokumenten ist ein ganzer Absatz oft eine einzige lange Zeile, sodass ein einziges geändertes Wort den ganzen Absatz als entfernt und hinzugefügt markiert. Zwei Gewohnheiten helfen. Setzen Sie vor dem Vergleich jeden Satz in eine eigene Zeile, damit nur der geänderte Satz auffällt. Oder verwenden Sie ein Werkzeug, das Wörter innerhalb von Zeilen vergleicht, etwa git diff --word-diff oder den Vergleich mit Änderungsverfolgung in Textverarbeitungen.
Aus einem PDF kopierter Text hat eine eigene Falle: Zeilen brechen dort um, wo das Seitenlayout sie umbrach, und Wörter können am Zeilenende getrennt sein. Fügen Sie die Zeilen jedes Absatzes wieder zusammen, bevor Sie ihn mit einem Quelldokument vergleichen.
Was ein zeilenweiser Diff nicht verrät
- Verschiebungen. Ein an eine andere Stelle verschobener Absatz erscheint an einer Stelle als entfernt und an einer anderen als hinzugefügt. Manche Werkzeuge, etwa git mit
--color-moved, markieren verschobene Blöcke eigens. - Bedeutung. Zwei Texte, die dasselbe mit anderen Worten sagen, unterscheiden sich vollständig, und eine Änderung um ein einziges Zeichen, etwa ein fehlendes „not“, wirkt klein, kann aber einen Satz umkehren.
- Binäre Inhalte. Word-Dokumente, PDFs und Bilder sind kein reiner Text. Extrahieren Sie zuerst ihren Text oder nutzen Sie die Vergleichsfunktion des Programms, das sie erstellt hat.
Datenschutz beim Vergleichen von Dokumenten
Verträge, Konfigurationsdateien und Protokolle enthalten oft Namen, Schlüssel oder Passwörter. Manche Online-Vergleichsdienste speichern eingefügten Text auf ihren Servern, teils unter einem teilbaren Link. Der LeedyBox-Textvergleich läuft in Ihrem Browser und sendet oder speichert den Text nicht; trotzdem lohnt es sich, Geheimnisse zu entfernen, bevor Sie eine Konfigurationsdatei irgendwo einfügen.
Häufig gestellte Fragen
Warum wird ein ganzer Absatz als geändert markiert, obwohl ich nur ein Wort bearbeitet habe?
Der Absatz ist eine einzige Zeile, und zeilenweise Diffs vergleichen ganze Zeilen. Teilen Sie den Text vor dem Vergleich in Sätze oder kürzere Zeilen auf, oder nutzen Sie einen wortweisen Vergleich.
Kann ich Unterschiede bei Leerzeichen ignorieren?
Das LeedyBox-Werkzeug vergleicht Zeilen exakt. Bereinigen Sie beide Texte zuerst, etwa indem Sie Leerzeichen am Zeilenende entfernen und Tabulatoren in Leerzeichen umwandeln; git bietet für Dateien Optionen wie --ignore-space-change.
Wie vergleiche ich zwei Word-Dokumente?
Word hat eine eingebaute Vergleichsfunktion, die auch Formatierungsänderungen zeigt. Um nur den Wortlaut zu vergleichen, kopieren Sie den Text beider Dokumente in ein Textvergleichswerkzeug.
Was ist ein Drei-Wege-Merge (three-way merge)?
Wenn zwei Personen dasselbe Original bearbeiten, vergleicht ein Merge-Werkzeug jede Fassung mit dem gemeinsamen Original. Änderungen an verschiedenen Stellen werden automatisch zusammengeführt; Änderungen an denselben Zeilen werden als Konflikte gemeldet, die ein Mensch lösen muss.