
Diff
Ein Diff ist eine Darstellung der Unterschiede zwischen zwei Versionen einer Datei, meist Zeile für Zeile mit Plus und Minus markiert. Programmierer nutzen Diffs, um Änderungen zu prüfen, und auch KI-Assistenten geben ihre Code-Vorschläge oft in dieser Form aus.
Wenn man an einem Text arbeitet, gibt es davon irgendwann zwei Fassungen: die alte und die neue. Ein Diff zeigt nur, was sich zwischen diesen beiden Fassungen geändert hat. Der Name kommt vom englischen Wort « difference », also Unterschied. Üblicherweise steht vor jeder entfernten Zeile ein Minuszeichen und vor jeder neu hinzugekommenen ein Pluszeichen. Alles, was gleich geblieben ist, wird weggelassen oder nur als grauer Rahmen mitgezeigt. So sieht man bei einer Datei mit 2.000 Zeilen auf einen Blick, dass sich genau drei davon verändert haben.
Warum Programmierer nichts ohne Diff freigeben
Software wird selten von einer Person allein geschrieben. In einem Team schickt jeder seine Änderungen ein, und andere schauen sie vorher durch. Dieses Durchschauen nennt man Code-Review. Ohne Diff müsste man dafür zwei komplette Dateien nebeneinanderlegen und selbst suchen. Mit Diff dauert die Prüfung Minuten statt Stunden.
Der zweite Grund ist die Fehlersuche. Wenn ein Programm heute abstürzt und letzte Woche noch lief, liegt der Fehler fast immer in einer der Änderungen dazwischen. Die Diffs der letzten Tage sind dann die Liste aller Verdächtigen. Man arbeitet sie durch, bis die Ursache gefunden ist.
Drittens sind Diffs kompakt. Ein ganzes Programm kann hunderte Megabyte groß sein, eine einzelne Änderung daran nur wenige Kilobyte. Deshalb speichern Versionsverwaltungen nicht jede Fassung komplett, sondern vor allem die Unterschiede. Das spart enorm viel Platz.
Wie ein Diff berechnet und gelesen wird
Ein Diff wird nicht von Hand geschrieben, sondern von einem Programm errechnet. Es vergleicht die beiden Fassungen und sucht die längste Folge von Zeilen, die in beiden identisch vorkommt. Alles außerhalb dieser gemeinsamen Folge gilt als Änderung. Dieses Vorgehen liefert meist die kürzeste sinnvolle Erklärung dafür, wie aus der alten die neue Fassung wird.
Das gängige Ausgabeformat heißt Unified Diff. Es besteht aus Blöcken, im Fachjargon Hunks genannt. Jeder Block beginnt mit einer Zeile wie « @@ -14,6 +14,7 @@ ». Sie bedeutet: ab Zeile 14 waren es vorher 6 Zeilen, nachher sind es 7. Darunter stehen die betroffenen Zeilen mit Minus, Plus oder Leerzeichen davor. Die Zeilen mit Leerzeichen sind unverändert und dienen nur der Orientierung.
Ein Diff kann auch angewendet werden. Man gibt einer Datei die Änderungsliste, und ein Werkzeug baut die neue Fassung daraus. In dieser Rolle nennt man den Diff auch Patch, also Flicken. Das funktioniert nur, wenn die Umgebung noch passt. Hat jemand anderes dieselben Zeilen inzwischen umgeschrieben, findet der Patch seinen Platz nicht mehr. Man spricht dann von einem Konflikt und muss selbst entscheiden, welche Version gilt.
Diffs in KI-Assistenten und auf GitHub
Wer Software online anschaut, sieht ständig Diffs, ohne dass sie so heißen. Auf Plattformen wie GitHub oder GitLab ist jede eingereichte Änderung als grün-rote Gegenüberstellung dargestellt. Grün ist neu, rot ist entfernt. Auch Wikipedia zeigt beim Versionsvergleich genau dieses Prinzip.
In der KI-Welt sind Diffs zum Standardformat für Code-Vorschläge geworden. Ein Programmierassistent schreibt nicht die ganze Datei neu, sondern liefert nur die geänderten Zeilen als Diff. Das hat zwei Vorteile: Der Mensch sieht sofort, was der Assistent anfassen will, und die Antwort bleibt kurz. Kurze Antworten sind bei KI-Modellen direkt billiger, weil pro ausgegebenem Textstück bezahlt wird.
Ein typischer Irrtum ist, einen Diff für die Änderung selbst zu halten. Er ist nur eine Beschreibung davon, und zwar eine von mehreren möglichen. Verschiebt man einen Absatz, kann ein Werkzeug das als « verschoben » erkennen, ein anderes als Löschen plus Einfügen. Beides ist korrekt, aber unterschiedlich gut lesbar. Genau daran arbeiten moderne Diff-Werkzeuge: nicht nur richtig zu sein, sondern verständlich.