diff`diff` ist ein Shell- Befehl , der den Inhalt von Dateien vergleicht und Unterschiede meldet. Der Begriff ` diff` wird auch verwendet, um die Ausgabe des Befehls zu bezeichnen und dient als Verb für dessen Ausführung. Um Dateien zu vergleichen, führt man `diff` aus, um eine Differenz zu erstellen. [ 1 ]
Der Befehl wird üblicherweise zum Vergleichen von Textdateien verwendet , unterstützt aber auch den Vergleich von Binärdateien . Enthält eine der Eingabedateien nicht-textuelle Daten, arbeitet der Befehl standardmäßig im Kurzmodus und gibt lediglich eine kurze Zusammenfassung der Unterschiede zwischen den Dateien aus. Mit der --textOption werden die Unterschiede stets zeilenweise ausgegeben; die Ausgabe kann jedoch schwer verständlich sein, da Binärdaten im Allgemeinen nicht wie Text zeilenweise strukturiert sind. [ 2 ]
Obwohl der Befehl hauptsächlich ad hoc zur Analyse von Änderungen zwischen zwei Dateien verwendet wird, besteht eine spezielle Anwendung darin, eine Patch-Datei für die Verwendung mit dem patchBefehl zu erstellen – dieser wurde speziell dafür entwickelt, einen Diff-Ausgabebericht als Patch-Datei zu verwenden. POSIX standardisierte die Befehle diffund patcheinschließlich ihres gemeinsamen Dateiformats. [ 3 ]
Geschichte
Das ursprüngliche diff- Dienstprogramm wurde Anfang der 1970er Jahre für das Unix-Betriebssystem in den Bell Labs in Murray Hill, New Jersey, entwickelt. Es war Bestandteil der 1974 veröffentlichten fünften Unix-Edition [ 4 ] und wurde von Douglas McIlroy und James Hunt geschrieben . Die Forschungsergebnisse wurden 1976 in einer gemeinsam mit James W. Hunt verfassten Arbeit veröffentlicht, der einen ersten Prototyp von diff entwickelt hatte . [ 5 ] Der in dieser Arbeit beschriebene Algorithmus wurde als Hunt-Szymanski-Algorithmus bekannt .
McIlroys Arbeit wurde von Steve Johnsons Vergleichsprogramm auf GECOS und Mike Lesks Beweisprogramm beeinflusst und vorweggenommen . Auch das Beweisprogramm entstand unter Unix und erzeugte, ähnlich wie `diff` , zeilenweise Änderungen. Es verwendete sogar spitze Klammern („>“ und „<“), um Zeileneinfügungen und -löschungen in der Programmausgabe anzuzeigen. Die in diesen frühen Anwendungen verwendeten Heuristiken galten jedoch als unzuverlässig. Das Potenzial eines Diff-Tools veranlasste McIlroy, ein robusteres Tool für verschiedene Aufgaben zu erforschen und zu entwickeln, das trotz der begrenzten Rechenleistung und Speicherkapazität der PDP-11 -Hardware gut funktionieren sollte. Sein Lösungsansatz entstand in Zusammenarbeit mit Mitarbeitern der Bell Labs, darunter Alfred Aho , Elliot Pinson, Jeffrey Ullman und Harold S. Stone.
Im Unix-Kontext ermöglichte der Zeileneditor `ed` dem Befehl `diff` die Erstellung maschinenlesbarer „Bearbeitungsskripte“. Diese Bearbeitungsskripte konnten, nachdem sie in einer Datei gespeichert worden waren, zusammen mit der Originaldatei von `ed` vollständig in die geänderte Datei wiederhergestellt werden. Dadurch wurde der benötigte Speicherplatz für die Verwaltung mehrerer Dateiversionen erheblich reduziert. McIlroy erwog die Entwicklung eines Postprozessors für ` diff` , der verschiedene Ausgabeformate ermöglichen sollte. Er fand es jedoch sparsamer und einfacher, `diff` die Syntax und die umgekehrte Eingabereihenfolge für den Befehl `ed` generieren zu lassen .
Im Jahr 1984 entwickelte Larry Wall das Hilfsprogramm patch (dessen Quellcode in den Newsgroups mod.sources und net.sources veröffentlicht wurde [ 6 ] [ 7 ] [ 8 ] ), um Textdateien zu patchen. Dabei wird die Ausgabe von diff zusammen mit der diff-Eingabedatei und dem Inhalt vor den Änderungen verwendet, um eine Datei mit dem Inhalt nach den Änderungen zu erstellen.
Der X/Open Portability Guide, Ausgabe 2 von 1987, enthält Unterschiede. Der Kontextmodus wurde in POSIX.1-2001 (Ausgabe 6) hinzugefügt. Der einheitliche Modus wurde in POSIX.1-2008 (Ausgabe 7) hinzugefügt. [ 9 ]
In den Anfangsjahren von diff wurden häufig Änderungen im Quellcode und in der Auszeichnungssprache technischer Dokumente verglichen, die Ausgabe von Programm-Debugging-Befehlen überprüft, Dateisystemlisten verglichen und Assembler-Code analysiert. Die Ausgabe von ed war darauf ausgelegt, eine Abfolge von Änderungen an einer Datei zu komprimieren. [ 10 ] Das Source Code Control System (SCCS) und seine Fähigkeit, Revisionen zu archivieren, entstanden Ende der 1970er Jahre als Folge der Speicherung von Bearbeitungsskripten von diff .
Algorithmus
Im Gegensatz zu Editierdistanzbegriffen , die für andere Zwecke verwendet werden, diffist sie zeilenorientiert und nicht zeichenorientiert, aber sie ähnelt der Levenshtein-Distanz insofern, als sie versucht, die kleinste Menge an Löschungen und Einfügungen zu bestimmen, um aus einer Datei eine andere zu erstellen.
Die Operation diff basiert auf der Lösung des Problems der längsten gemeinsamen Teilfolge . [ 5 ] Gegeben sind dabei zwei Folgen von Elementen:
a b c d f g h j q z
a b c d e f g i j krxy z
Wir suchen die längste Sequenz von Elementen, die in beiden ursprünglichen Sequenzen in derselben Reihenfolge vorkommt. Das heißt, wir suchen eine neue Sequenz, die sich aus der ersten ursprünglichen Sequenz durch Löschen einiger Elemente und aus der zweiten ursprünglichen Sequenz durch Löschen anderer Elemente gewinnen lässt. Diese Sequenz soll außerdem so lang wie möglich sein. In diesem Fall ist sie
abcdfgjz
Ausgehend von der längsten gemeinsamen Teilsequenz ist es nur ein kleiner Schritt, eine diff -ähnliche Ausgabe zu erhalten: Fehlt ein Element in der Teilsequenz, ist aber in der ersten ursprünglichen Sequenz vorhanden, wurde es gelöscht (wie durch die Minuszeichen unten angezeigt). Fehlt es in der Teilsequenz, ist aber in der zweiten ursprünglichen Sequenz vorhanden, wurde es eingefügt (wie durch die Pluszeichen angezeigt).
ehiqkrxy + - + - + + + +
Verwenden
Der diffBefehl akzeptiert zwei Argumente, z. B.: . Üblicherweise bezeichnen die Argumente jeweils normale Dateien; bezeichnen sie jedoch Verzeichnisse, vergleicht der Befehl die entsprechenden Dateien in den Verzeichnissen. Mit der Option durchsucht er rekursiv übereinstimmende Unterverzeichnisse, um Dateien mit entsprechenden relativen Pfaden zu vergleichen. diff originalnew-r
Standardausgabeformat
Das folgende Beispiel zeigt den ursprünglichen und den neuen Dateiinhalt sowie die resultierende diffAusgabe im Standardformat. Die Ausgabe ist zur besseren Lesbarkeit farbig dargestellt. GNU diff kann die Ausgabe farbig gestalten, wenn die --colorentsprechende Option verwendet wird; ohne --colorAngabe einer Option ist die Farbausgabe standardmäßig deaktiviert. [ 11 ]
Original : Dieser Teil des Das Dokument ist geblieben. gleich von Version zu Version. Das sollte nicht der Fall sein. wird angezeigt, wenn es nicht Änderung. Andernfalls, dass würde nicht helfen die Größe des Änderungen. Dieser Absatz enthält veralteter Text. Es wird gelöscht im nahe Zukunft. Es ist wichtig, richtig zu schreiben Schauen Sie sich dieses Dokument an. andererseits Das falsch geschriebene Wort ist nicht das Ende der Welt. Nichts im Rest von Dieser Absatz muss Dinge können sich ändern. sollte danach hinzugefügt werden. | neu : Dies ist ein wichtiges Achtung! Es sollte daher befindet sich bei der Anfang davon dokumentieren! Dieser Teil des Das Dokument ist geblieben. gleich von Version zu Version. Das sollte nicht der Fall sein. wird angezeigt, wenn es nicht Änderung. Andernfalls, dass würde nicht helfen die Größe des Änderungen. Es ist wichtig, richtig zu schreiben Lesen Sie dieses Dokument. andererseits Das falsch geschriebene Wort ist nicht das Ende der Welt. Nichts im Rest von Dieser Absatz muss Dinge können sich ändern. sollte danach hinzugefügt werden. Dieser Absatz enthält wichtige Neuerungen zu diesem Dokument. | Ausgabe: 0a1,6 > Dies ist ein wichtiges Achtung! Es sollte daher sollte sich dort befinden > der Anfang davon > Dokument! > 11,15d16 Dieser Absatz enthält < Text, der veraltet ist. Es wird im < nahe Zukunft. < 17c18 < Überprüfen Sie dieses Dokument. Am --- > Prüfen Sie dieses Dokument. Am 24a26,29 > Dieser Absatz enthält wichtige Neuerungen > zu diesem Dokument. |
In diesem Standardformat abedeutet ☐ hinzugefügt, d☐ gelöscht und c☐ geändert. Die Zeilennummer der Originaldatei steht vor dem Einbuchstabencode, die der neuen Datei danach. Die Kleiner-als- und Größer-als- Zeichen (am Anfang hinzugefügter, gelöschter oder geänderter Zeilen) geben an, in welcher Datei die Zeilen erscheinen. Hinzugefügte Zeilen werden der Originaldatei hinzugefügt und sind in der neuen Datei vorhanden. Gelöschte Zeilen werden aus der Originaldatei entfernt und fehlen in der neuen Datei.
Standardmäßig werden Zeilen, die in beiden Dateien vorhanden sind, nicht angezeigt. Verschobene Zeilen werden an ihrer neuen Position als hinzugefügt und an ihrer alten Position als gelöscht angezeigt. [ 12 ] Einige Diff-Tools heben jedoch verschobene Zeilen hervor.
Skript bearbeiten
Ein Bearbeitungsskript kann mit modernen Versionen von diff mithilfe der entsprechenden Option generiert werden -e. Das resultierende Bearbeitungsskript für dieses Beispiel sieht wie folgt aus:
24 aDieser Absatz enthält wichtige neue Ergänzungen zu diesem Dokument. Die 17 c Überprüfen Sie dieses Dokument. Am Die 11,15 d 0 a Dies ist ein wichtiger Hinweis! Er sollte daher am Anfang dieses Dokuments stehen ! Die
Um den Inhalt der Originaldatei mithilfe von `ed` in eine neue Datei zu übertragen , fügt man der Diff-Datei zwei Zeilen hinzu: eine Zeile mit einem Schreibbefehl und eine mit einem Beenden-Befehl (z. B. mit `\n` ). In diesem Beispiel nennen wir die Diff-Datei ` mydiff` , und die Transformation erfolgt beim Ausführen von `ed` . wqprintf"w\nq\n">>mydiffed-soriginal<mydiff
Kontextformat
Die Berkeley-Distribution von Unix legte Wert darauf, das Kontextformat ( -c) und die Möglichkeit zur rekursiven Suche in Dateisystemverzeichnisstrukturen ( -r) hinzuzufügen; diese Funktionen wurden in Version 2.8 BSD eingeführt, die im Juli 1981 veröffentlicht wurde. Das in Berkeley eingeführte Kontextformat von diff erleichterte die Verteilung von Patches für Quellcode, der möglicherweise nur minimal verändert worden war.
Im Kontextformat werden alle geänderten Zeilen zusammen mit den unveränderten Zeilen davor und danach angezeigt. Die Einbeziehung beliebig vieler unveränderter Zeilen liefert den Kontext für den Patch. Der Kontext besteht aus Zeilen, die sich zwischen den beiden Dateien nicht geändert haben, und dient als Referenz, um die Zeilen in der geänderten Datei zu finden und die gewünschte Stelle für eine Änderung zu ermitteln, unabhängig davon, ob die Zeilennummern noch übereinstimmen. Das Kontextformat verbessert die Lesbarkeit für Menschen und die Zuverlässigkeit beim Anwenden des Patches und liefert eine Ausgabe, die als Eingabe für das Patch- Programm akzeptiert wird. Dieses intelligente Verhalten ist mit der herkömmlichen Diff-Ausgabe nicht möglich.
Die Anzahl der unveränderten Zeilen, die ober- und unterhalb eines Änderungsabschnitts angezeigt werden , kann vom Benutzer festgelegt werden, sogar null. Standardmäßig werden jedoch drei Zeilen verwendet. Überschneidet sich der Kontext unveränderter Zeilen in einem Abschnitt mit einem angrenzenden Abschnitt, vermeidet `diff` die Duplizierung der unveränderten Zeilen und führt die Abschnitte zu einem einzigen zusammen.
Ein Leerzeichen (" !) steht für eine Änderung zwischen Zeilen, die in den beiden Dateien übereinstimmen, ein doppeltes Leerzeichen (" +) für das Hinzufügen einer Zeile und ein doppeltes Leerzeichen (" -) für das Entfernen einer Zeile. Ein Leerzeichen kennzeichnet eine unveränderte Zeile. Am Anfang des Patches befinden sich die Dateiinformationen, einschließlich des vollständigen Pfads und eines durch ein Tabulatorzeichen getrennten Zeitstempels . Am Anfang jedes Abschnitts (Hunk) stehen die Zeilennummern, die der jeweiligen Änderung in den Dateien zugeordnet sind. Ein Zahlenbereich zwischen drei Sternchen bezieht sich auf die Originaldatei, drei Bindestriche auf die neue Datei. Die Abschnitte geben die Start- und Endzeilennummern in der jeweiligen Datei an.
Der Befehl diff -c original newerzeugt folgende Ausgabe:
*** /Pfad/zum/ursprünglichen Zeitstempel --- /Pfad/zum/neuen Zeitstempel *************** *** 1,3 **** --- 1,9 ---- + Dies ist ein wichtiger Hinweis! Er sollte daher am Anfang dieses Dokuments stehen ! Dieser Teil des Dokuments ist von Version zu Version unverändert geblieben . *************** *** 8,20 **** Die Größe der Änderungen komprimieren. Dieser Absatz enthält veralteten Text und wird in Kürze gelöscht.Rechtschreibung ist wichtig ! Überprüfen Sie dieses Dokument. Andererseits ist ein Rechtschreibfehler nicht das Ende der Welt. --- 14,21 ---- Verkleinern Sie die Änderungen. Rechtschreibung ist wichtig ! Überprüfen Sie dieses Dokument. Andererseits ist ein Rechtschreibfehler nicht das Ende der Welt. *************** *** 22,24 **** --- 23,29 ---- Dieser Absatz muss geändert werden. Im Anschluss können weitere Informationen hinzugefügt werden. + + Dieser Absatz enthält + wichtige neue Ergänzungen + zu diesem Dokument.Einheitliches Format
Das Unified Format (oder Unidiff ) [ 13 ] [ 14 ] übernimmt die technischen Verbesserungen des Kontextformats, erzeugt aber einen kleineren Diff, bei dem alter und neuer Text direkt nebeneinander angezeigt werden. Das Unified Format wird üblicherweise mit der Kommandozeilenoption-u „-- “ aufgerufen . Diese Ausgabe dient oft als Eingabe für das Patch -Programm. Viele Projekte fordern explizit die Übermittlung von Diffs im Unified Format, wodurch dieses Format zum gängigsten Format für den Austausch zwischen Softwareentwicklern geworden ist.
Die einheitliche Kontext-Diff-Funktion wurde ursprünglich im August 1990 von Wayne Davison entwickelt (in unidiff , erschienen in Band 14 von comp.sources.misc). Richard Stallman fügte einen Monat später die Unterstützung für einheitliche Diffs zum GNU-Projekt diff hinzu. Die Funktion wurde in GNU diff 1.15 eingeführt , das im Januar 1991 veröffentlicht wurde. Seitdem hat GNU diff das Kontextformat verallgemeinert, um beliebige Formatierungen von Diffs zu ermöglichen.
Das Format beginnt mit demselben zweizeiligen Header wie das Kontextformat, mit der Ausnahme, dass der Originaldatei ein " vorangestellt ist.---" und der neuen Datei geht " voraus+++Im Anschluss daran folgen ein oder mehrere Änderungsblöcke , die die Zeilenunterschiede in der Datei enthalten. Ein Leerzeichen leitet die unveränderten, kontextbezogenen Zeilen ein, ein Pluszeichen die Hinzufügungszeilen und ein Minuszeichen die Löschungszeilen.
Ein Hunk beginnt mit Bereichsinformationen ; diese stehen unmittelbar vor den Zeileneinfügungen, Zeilenlöschungen und beliebig vielen Kontextzeilen. Die Bereichsinformationen sind von doppelten @-Zeichen umschlossen und fassen in einer Zeile zusammen, was im Kontextformat ( siehe oben ) auf zwei Zeilen verteilt ist. Das Format der Bereichsinformationszeile ist wie folgt:
@@ -l,s +l,s @@ optionale Abschnittsüberschrift
Die Bereichsinformationen enthalten zwei Bereichsangaben. Ein Minuszeichen leitet den Bereich für den Bereich der Originaldatei ein, ein Pluszeichen den Bereich für den Bereich der neuen Datei. Jeder Bereich hat das Format l,s, wobei l die Startzeilennummer und s die Anzahl der Zeilen angibt, auf die sich die Änderung in der jeweiligen Datei bezieht. In vielen Versionen von GNU diff können Komma und nachfolgendes s weggelassen werden ; in diesem Fall ist s standardmäßig 1. Der einzige wirklich relevante Wert ist die Zeilennummer l des ersten Bereichs; alle anderen Werte lassen sich aus den Unterschieden berechnen.
Der Bereich der Hunks im Original sollte die Summe aller Kontext- und Lösch-Hunkzeilen (einschließlich geänderter Zeilen) sein. Der Bereich der Hunks in der neuen Datei sollte die Summe aller Kontext- und Hinzufügungs-Hunkzeilen (einschließlich geänderter Zeilen) sein. Stimmen die Größenangaben der Hunks nicht mit der Anzahl der Zeilen im Hunk überein, kann der Diff als ungültig betrachtet und abgelehnt werden.
Optional kann dem Hunk-Bereich die Überschrift des Abschnitts oder der Funktion folgen, zu der der Hunk gehört. Dies dient hauptsächlich der besseren Lesbarkeit des Diffs. Bei der Erstellung eines Diffs mit GNU diff wird die Überschrift durch reguläre Ausdrücke ermittelt . [ 15 ]
Wird eine Zeile geändert, wird dies als Löschung und Hinzufügung dargestellt. Da die Abschnitte der Original- und der neuen Datei im selben Abschnitt liegen, erscheinen solche Änderungen nebeneinander. [ 16 ] Ein Beispiel hierfür ist:
-prüfen Sie dieses Dokument. Am +prüfen Sie dieses Dokument. Am
Der Befehl diff -u original newerzeugt folgende Ausgabe:
--- /Pfad/zum/ursprünglichen Zeitstempel +++ /Pfad/zum/neuen Zeitstempel @@ -1,3 +1,9 @@ +Dies ist ein wichtiger +Hinweis! Er sollte +daher am +Anfang dieses +Dokuments stehen ! + Dieser Teil des Dokuments ist von Version zu Version @@ -8,13 +14,8 gleich geblieben . @@ Komprimieren Sie die Größe der Änderungen.Dieser Absatz enthält veralteten Text. Er wird in Kürze gelöscht . Es ist wichtig, dieses Dokument auf Rechtschreibung zu prüfen . Ein Rechtschreibfehler ist aber nicht weiter schlimm. Dieser Absatz muss geändert werden. Im Anschluss können weitere Informationen hinzugefügt werden. Dieser Absatz enthält wichtige neue Ergänzungen zu diesem Dokument.Um die Dateinamen von den Zeitstempeln zu trennen, dient ein Tabulatorzeichen als Trennzeichen. Dieses ist auf dem Bildschirm nicht sichtbar und kann beim Kopieren und Einfügen von Änderungen aus der Konsole/dem Terminal verloren gehen.
Erweiterungen
Es gibt einige Modifikationen und Erweiterungen der Diff-Formate, die von bestimmten Programmen und in bestimmten Kontexten verwendet und verstanden werden. Beispielsweise geben manche Versionskontrollsysteme – wie etwa Subversion – anstelle oder zusätzlich zum Zeitstempel im Header des Diffs eine Versionsnummer, eine „Arbeitskopie“ oder einen anderen Kommentar an.
Manche Tools ermöglichen es, die Unterschiede mehrerer verschiedener Dateien zu einer einzigen Datei zusammenzuführen, indem für jede geänderte Datei ein Header verwendet wird, der etwa so aussehen könnte:
Index: Pfad/zur/Datei.cpp
Der Sonderfall von Dateien, die nicht mit einem Zeilenumbruch enden, wird nicht behandelt. Weder der Standard unidiffnoch die POSIX- Richtlinien definieren eine Methode zur Behandlung dieser Dateitypen. (Tatsächlich sind solche Dateien nach strenger POSIX-Definition keine „Textdateien“. [ 17 ] ) GNU diff und git geben als Diagnose „\ Kein Zeilenumbruch am Dateiende“ (oder eine entsprechende Übersetzung) aus, dieses Verhalten ist jedoch nicht portabel. [ 18 ] GNU patch scheint diesen Fall nicht zu behandeln, git-apply hingegen schon. [ 19 ]diff
Das Patch- Programm erkennt nicht unbedingt implementierungsspezifische Diff-Ausgaben. GNU patch erkennt jedoch Git-Patches und verhält sich etwas anders. [ 20 ]
Implementierungen und zugehörige Programme
Zu den Änderungen seit 1975 gehören Verbesserungen des Kernalgorithmus, die Hinzufügung nützlicher Funktionen zum Befehl und die Entwicklung neuer Ausgabeformate. Der Basisalgorithmus wird in den Artikeln „ An O(ND) Difference Algorithm and its Variations“ von Eugene W. Myers [ 21 ] und in „A File Comparison Program“ von Webb Miller und Myers [ 22 ] beschrieben. Der Algorithmus wurde unabhängig davon entdeckt und in „Algorithms for Approximate String Matching “ von Esko Ukkonen [ 23 ] beschrieben . Die ersten Versionen des diff-Programms waren für den Zeilenvergleich von Textdateien konzipiert und erwarteten, dass das Zeilenumbruchzeichen die Zeilen trennt. In den 1980er-Jahren führte die Unterstützung von Binärdateien zu einer Änderung des Designs und der Implementierung der Anwendung.
GNU diff und diff3 sind zusammen mit anderen diff- und patchbezogenen Hilfsprogrammen im diffutils- Paket enthalten . [ 24 ]
Formatierer und Frontends
Die Postprozessoren sdiff und diffmk erzeugen nebeneinander angeordnete Differenzlisten bzw. fügen Änderungsmarkierungen zu gedruckten Dokumenten hinzu. Beide wurden 1981 oder früher an anderer Stelle in den Bell Labs entwickelt.
Diff3 vergleicht eine Datei mit zwei anderen Dateien, indem es zwei Diffs zusammenführt. Es wurde ursprünglich von Paul Jensen entwickelt, um Änderungen abzugleichen, die von zwei Personen an einem gemeinsamen Quellcode vorgenommen wurden. Es wird auch von Versionskontrollsystemen wie RCS zum Zusammenführen von Dateien verwendet . [ 25 ]
Emacs verfügt über Ediff , das die Änderungen, die ein Patch mit sich bringen würde, in einer Benutzeroberfläche anzeigt, die interaktive Bearbeitungs- und Zusammenführungsfunktionen für Patch-Dateien kombiniert.
Vim bietet vimdiff zum Vergleichen von zwei bis acht Dateien, wobei Unterschiede farblich hervorgehoben werden. [ 26 ] Während früher das diff-Programm aufgerufen wurde, verwendet das moderne Vim den von Git entwickelten Fork der xdiff-Bibliothek (LibXDiff), was eine höhere Geschwindigkeit und einen größeren Funktionsumfang ermöglicht. [ 27 ]
GNU Wdiff [ 28 ] ist ein Frontend für diff, das die Wörter oder Phrasen anzeigt, die sich in einem Textdokument in geschriebener Sprache geändert haben, selbst bei Vorhandensein von Zeilenumbrüchen oder unterschiedlichen Spaltenbreiten.
colordiff is a Perl wrapper for 'diff' that produces the same output, but with colorization for added and deleted bits.[29] diff-so-fancy and diff-highlight are newer analogues.[30] "delta" is a Rust rewrite that highlights changes and the underlying code at the same time.[31]
Patchutils contains tools that combine, rearrange, compare, and fix context diffs and unified diffs.[32]
Algorithmic derivatives
Utilities that compare source files by their syntactic structure have been built mostly as research tools for some programming languages;[33][34][35] some are available as commercial tools.[36][37] In addition, free tools that perform syntax-aware diff include:
- C++: zograscope, AST-based.[38]
- HTML: Daisydiff,[39] html-differ.
- XML: xmldiffpatch by Microsoft and xmldiffmerge for IBM.[40][41]
- JavaScript: astii (AST-based).
- Multi-language: Pretty Diff (format code and then diff)[42]
spiff is a variant of diff that ignores differences in floating point calculations with roundoff errors and whitespace, both of which are generally irrelevant to source code comparison. Bellcore wrote the original version.[43][44] An HPUX port is the most current public release. spiff does not support binary files. spiff outputs to the standard output in standard diff format and accepts inputs in the C, Bourne shell, Fortran, Modula-2 and Lispprogramming languages.[45][46][43][47][44]
LibXDiff ist eine LGPL- Bibliothek , die seit 1998 eine Schnittstelle zu zahlreichen Algorithmen bietet. Ursprünglich wurde (in der finalen Version von 2008) ein verbesserter Myers-Algorithmus mit Rabin - Fingerprint implementiert [ 48 ] . Git und der libgit2 -Fork haben das Repository seither um viele eigene Algorithmen erweitert. Ein Algorithmus namens „Histogramm“ gilt allgemein als schneller und qualitativ besser als der ursprüngliche Myers-Algorithmus [ 49 ] [ 50 ] . Dies ist die moderne Version von LibXDiff , die von Vim verwendet wird [ 27 ] .
Siehe auch
- cmp – Befehl zum Dateivergleich
- Vergleich von Dateivergleichstools
- Delta-Codierung – Art der Datenübertragungsmethode
- Differenzoperator – Muster, das eine unendliche Zahlenfolge definiert
- Dateivergleich – Kommandozeilenprogramm zum Vergleichen mehrerer Dateien
- Geschichte des Softwarekonfigurationsmanagements
- Versionskontrolle – Verwaltung von Quellcode- oder Datenversionen
- Softwarekonfigurationsmanagement – Nachverfolgung und Steuerung von Softwareänderungen
- WinDiff – Dateivergleichsprogramm von Microsoft
- Ramseyer-Regel – Standardformat für die Änderung von Rechtstexten
Referenzen
- ^ Eric S. Raymond (Hrsg.), „diff“, archiviert am 31.01.2014 in der Wayback Machine , The Jargon File , Version 4.4.7
- ^ MacKenzie et al. „Binary Files and Forcing Text Comparison“ in Comparing and Merging Files with GNU Diff and Patch . Heruntergeladen am 28. April 2007. [1] Archiviert am 19. Dezember 2017 im Internet Archive.
- ^ IEEE Computer Society ; The Open Group (26. September 2008). Standard für Informationstechnologie – Portable Operating System Interface (POSIX) Basisspezifikationen, Ausgabe 7. S. 2599–2607 .IEEE Std. 1003.1-2001 spezifiziert die Ausgabeformate „traditionell“, „ed script“ und „Context Diff“; IEEE Std. 1003.1-2008 fügte das (inzwischen gebräuchlichere) einheitliche Format hinzu.
- ^ „diff – differentieller Dateivergleich“ . minnie.tuhs.org . Abgerufen am 25.03.2026 .
- ^ a b James W. Hunt; M. Douglas McIlroy (Juni 1976). „Ein Algorithmus für den differentiellen Dateivergleich“ ( PDF) . Technischer Bericht Informatik, Bell Laboratories . 41. Archiviert (PDF) vom Original am 26.12.2014 . Abgerufen am 06.05.2015 .
- ^ Larry Wall (9. November 1984). „Ein Patch-Applikator – DAS BRAUCHST DU!!!“ . Newsgroup : net.sources . Usenet: 1457@sdcrdcf.UUCP . Archiviert vom Original am 19. Februar 2022. Abgerufen am 11. Mai 2015 .
- ^ Larry Wall (29. November 1984). „Patch Version 1.2 – DAS WOLLEN SIE“ . Newsgroup : net.sources . Usenet: 1508@sdcrdcf.UUCP . Archiviert vom Original am 21. März 2020. Abgerufen am 11. Mai 2015 .
- ^ Larry Wall (8. Mai 1985). „Patch Version 1.3“ . Newsgroup : net.sources . Usenet: 813@genrad.UUCP . Archiviert vom Original am 19. Februar 2022. Abgerufen am 11. Mai 2015 .
- ^ – Shell- und Dienstprogrammreferenz, Die einheitliche UNIX-Spezifikation , Version 5 von The Open Group
- ^ Ritchie, Dennis M.; Thompson, Ken (1974-07-01). „Das UNIX-Time-Sharing-System“ . Commun. ACM . 17 (7): 365–375 . doi : 10.1145/361011.361061 . ISSN 0001-0782 .
- ^ „diff Options“ . GNU Diffutils Manual . Free Software Foundation . Abgerufen am 11. Juni 2026 .
- ^ David MacKenzie; Paul Eggert; Richard Stallman (1997). Vergleichen und Zusammenführen von Dateien mit GNU Diff und Patch . Bristol: Network Theory. ISBN 978-0-9541617-5-0Archiviert vom Original am 31.03.2015 . Abgerufen am 17.03.2015 .
- ^ „Detaillierte Beschreibung des einheitlichen Formats“ . GNU Diffutils (Version 3.7, 7. Januar 2018) . Archiviert vom Original am 18. Januar 2020. Abgerufen am 29. Januar 2020 .
- ^ van Rossum, Guido. „Unified Diff Format“ . All Things Pythonic . Archiviert vom Original am 25.12.2019 . Abgerufen am 29.01.2020 .
- ^ 2.2.3 Anzeigen der Abschnitte mit Unterschieden (GNU diffutils-Handbuch)
- ^ Einheitliches Diff-Format von Guido van Rossum , 14. Juni 2006
- ^ http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403 Archiviert am 29.04.2013 in der Wayback Machine, Abschnitt 3.206
- ^ „Unvollständige Zeilen (Vergleichen und Zusammenführen von Dateien)“ . www.gnu.org . Archiviert vom Original am 8. Mai 2023. Abgerufen am 15. Juni 2023 .
- ^ "git: apply.c" . Git. 8. Mai 2023. Archiviert vom Original am 13. Mai 2023 . Abgerufen am 15. Juni 2023 .
- ^ "patch.c\src - patch.git - GNU patch" . git.savannah.gnu.org . Archiviert vom Original am 08.05.2023 . Abgerufen am 15.06.2023 .
In Git-Diffs bezieht sich der "vorher"-Zustand jedes Patches auf den Ausgangszustand vor der Änderung von Dateien,..
- ^ E. Myers (1986). „Ein O(ND)-Differenzalgorithmus und seine Variationen“. Algorithmica . 1 (2): 251–266 . CiteSeerX 10.1.1.4.6927 . doi : 10.1007/BF01840446 . S2CID 6996809 .
- ^ Webb Miller; Eugene W. Myers (1985). „Ein Dateivergleichsprogramm“. Software: Praxis und Erfahrung . 15 (11): 1025–1040 . CiteSeerX 10.1.1.189.70 . doi : 10.1002/spe.4380151102 . S2CID 15489614 .
- ^ Esko Ukkonen (1985). „Algorithmen für approximatives String-Matching“ . Information and Control . 64 ( 1–3 ): 100–118 . doi : 10.1016/S0019-9958(85)80046-2 .
- ^ GNU Diff-Dienstprogramme, archiviert am 16.03.2015 im Internet Archive . Bereitgestellt von der Free Software Foundation . Kostenlose Dokumentation. Kostenloser Quellcode.
- ^ "merge (GNU RCS 5.10.0)" . gnu.org . Archiviert vom Original am 18. September 2019 . Abgerufen am 22. Januar 2021 .
- ^ Moolenaar, Bram . „ Vim-Dokumentation: diff“ . vimdoc.sourceforge.net . Archiviert vom Original am 16. Februar 2020. Abgerufen am 1. Mai 2020.
Der einfachste Weg, den Diff-Modus zu starten, ist der Befehl „vimdiff“. Dieser startet Vim wie gewohnt und ermöglicht gleichzeitig die Anzeige der Unterschiede zwischen den Argumenten.
Dies entspricht:
vimdiff file1 file2 [file3] [file4] [...file8]vim -d file1 file2 [file3] [file4] [...file8] - ^ a b Brabandt, Christian (1. Dezember 2018). „Die Macht der Differenz“ . Vimways . Archiviert vom Original am 2. Dezember 2018. Abgerufen am 1. Mai 2020 .
- ^ "gnu.org" . gnu.org . Archiviert vom Original am 11.08.2020 . Abgerufen am 12.09.2020 .
- ^ "colordiff" . www.colordiff.org . Archiviert vom Original am 14.06.2018 . Abgerufen am 14.06.2018 .
- ^ „diff-so-fancy“ . So Fancy. 6. Mai 2023. Archiviert vom Original am 8. Mai 2023. Abgerufen am 8. Mai 2023 .
- ^ Davison, Dan (8. Mai 2023). "dandavison/delta" . GitHub . Archiviert vom Original am 8. Mai 2023. Abgerufen am 8. Mai 2023 .
- ^ Waugh, Tim (12. Juni 2020). "twaugh/patchutils" . GitHub . Archiviert vom Original am 1. Oktober 2020. Abgerufen am 28. Juni 2020 .
- ^ Horwitz, Susan (Juni 1990). „Identifizierung der semantischen und textuellen Unterschiede zwischen zwei Versionen eines Programms“ . ACM SIGPLAN Notices . 25 (6): 234–245 . CiteSeerX 10.1.1.49.3377 . doi : 10.1145/93548.93574 . Archiviert vom Original am 12.06.2010 . Abgerufen am 01.11.2017 .
- ^ Yang, Wuu (Juli 1991). „Identifizierung syntaktischer Unterschiede zwischen zwei Programmen“. Software: Practice and Experience . 21 (7): 739–755 . CiteSeerX 10.1.1.13.9377 . doi : 10.1002/spe.4380210706 . S2CID 10853673 .
- ^ Grass. Cdiff: Ein syntaxgesteuerter Diff für C++-Programme. Proceedings USENIX C++ Conf., S. 181–193, 1992.
- ^ Compare++, http://www.coodesoft.com/ (Archiviert am 29.11.2011 im Internet Archive)
- ^ SmartDifferencer, http://www.semanticdesigns.com/Products/SmartDifferencer (Archiviert am 14.10.2009 im Internet Archive) .
- ^ "xaizek/zograscope" . GitHub . 26. Mai 2020. Archiviert vom Original am 21. Dezember 2020. Abgerufen am 27. Juni 2020 .
- ^ DaisyDiff , https://code.google.com/p/daisydiff/ Archiviert am 19.03.2015 im Internet Archive
- ^ xmldiffpatch , http://msdn.microsoft.com/en-us/library/aa302294.aspx Archiviert am 27.10.2009 im Internet Archive
- ^ xmldiffmerge , http://www.alphaworks.ibm.com/tech/xmldiffmerge (Archiviert am 24.09.2009 im Internet Archive)
- ^ Cheney, Austin. Pretty Diff – Dokumentation . http://prettydiff.com/documentation.php (Archiviert am 31.07.2012 im Internet Archive).
- ^ a b dontcallmedotcom. "spiff" . GitHub . Archiviert vom Original am 26.03.2015 . Abgerufen am 16.06.2013 .
- ^ a b Nachbar, Daniel W (1999-12-01). „HP-UX Portierung und Archivierung“ . Vereinigtes Königreich. Archiviert vom Original am 2012-09-05 . Abgerufen am 2013-06-13 .
- ^ „SPIFF 1“ . 02.02.1988. Archiviert vom Original am 02.10.2016 . Abgerufen am 16.06.2013 .
- ^ Nachbar, Daniel W (02.02.1988). „Man page“ . Vereinigtes Königreich. Archiviert vom Original am 10.09.2012 . Abgerufen am 16.06.2013 .
- ^ Davide (28.09.2009). „stackoverflow“ . Archiviert vom Original am 19.02.2022 . Abgerufen am 16.06.2013 .
- ^ Libenzi, Davide. „LibXDiff“ . SourceForge FreshMeat . Archiviert vom Original am 1. Juli 2020. Abgerufen am 28. Juni 2020 .
- ^ Nugroho, Yusuf Sulistyo; Hata, Hideaki; Matsumoto, Kenichi (Januar 2020). „Wie unterschiedlich sind verschiedene Diff-Algorithmen in Git?: Verwendung von --histogram für Codeänderungen“ . Empirical Software Engineering : 790–823 . arXiv : 1902.02467 . doi : 10.1007/s10664-019-09772-z . S2CID 59608676 .
- ^ „Algorithmus – Was ist der Unterschied zwischen ‚git diff --patience‘ und ‚git diff --histogram‘?“ Stack Overflow . Archiviert vom Original am 19.02.2022 . Abgerufen am 28.06.2020 . Dies zeigt tatsächlich ,
dass der Histogramm-Diff Myers leicht schlägt, während die Geduld deutlich langsamer ist als die anderen.
Weiterführende Literatur
- Paul Heckel (April 1978). „Eine Technik zur Isolierung von Unterschieden zwischen Dateien“ . Communications of the ACM . 21 (4): 264–268 . doi : 10.1145/359460.359467 . S2CID 207683976 .Eine Technik zur Isolierung von Unterschieden zwischen Dateien
- Eine generische Implementierung des Myers SES/LCS-Algorithmus mit Hirschberg-Linearraumverfeinerung (C-Quellcode)
Externe Links
- Vergleich zweier Dateien – Shell and Utilities Reference, The Single UNIX Specification , Version 5 von The Open Group
- – Plan 9 Programmierhandbuch, Band 1
- – Inferno General Befehlshandbuch
- Archivierte JavaScript-Implementierung