Sehen Sie sich die kleinsten Zeilenänderungen an und nehmen Sie dann den Patch mit
Vergleichen Sie zwei kurze Texte nach kompletter Zeile, überprüfen Sie ein deterministisches Minimalbearbeitungsskript und laden Sie einen einheitlichen Patch mit genauen Bereichen, ausgewähltem Kontext und expliziten Markierungen für fehlende letzte Zeilenumbrüche herunter.
Einheitlicher Diff-Patch
Ein Standard-Patch --- / +++ mit @@-Bereichen, ausgewähltem Kontext und expliziten Markierungen für fehlende letzte Zeilen.
Das komplette Zeilenbearbeitungsskript
| Unchanged | 1 | 1 | alpha |
| Removed | 2 | beta | |
| Added | 2 | beta revised | |
| Unchanged | 3 | 3 | line 03 |
| Unchanged | 4 | 4 | line 04 |
| Unchanged | 5 | 5 | line 05 |
| Unchanged | 6 | 6 | line 06 |
| Unchanged | 7 | 7 | line 07 |
| Unchanged | 8 | 8 | line 08 |
| Unchanged | 9 | 9 | line 09 |
| Unchanged | 10 | 10 | line 10 |
| Unchanged | 11 | 11 | line 11 |
| Removed | 12 | delta | |
| Added | 12 | epsilon |
So funktioniert es
Das Bearbeitungsmodell
Jedes Dokument wird zu einer geordneten Folge logischer Zeilen. CRLF-, CR- und LF-Trennzeichen im alten Stil werden als dieselbe Grenze behandelt, das Vorhandensein der letzten neuen Zeile bleibt jedoch erhalten. Aufgrund dieser Unterscheidung kann das Hinzufügen einer letzten neuen Zeile auch dann dargestellt werden, wenn sich die sichtbaren Zeichen in der Zeile nicht ändern.
Eine Matrix mit der längsten gemeinsamen Teilsequenz findet die größte geordnete Menge vollständiger Zeilen, die von beiden Seiten gemeinsam genutzt werden. Alles außerhalb dieser gemeinsamen Sequenz ist eine Löschung aus dem Original oder eine Einfügung in die Revision. Durch die Auswahl einer längsten gemeinsamen Teilsequenz wird die Gesamtzahl dieser Bearbeitungsvorgänge minimiert.
Wiederholte identische Zeilen können mehrere gleich kurze Antworten ermöglichen. Das Tool löst solche Verknüpfungen in einer dokumentierten Richtung – Löschen vor Einfügen –, sodass dieselben Eingaben immer denselben Patch generieren.
Der funktionierende Vergleich
Original:
alpha
beta
gamma
delta
Überarbeitet:
alpha
beta revised
gamma
epsilon
alpha und gamma sind die beiden unveränderten Linien. Die anderen beiden Originale werden entfernt und ihre Überarbeitungen hinzugefügt, wodurch 2 Zeilen hinzugefügt, 2 Zeilen entfernt, 2 unveränderte Zeilen und – an drei Kontextzeilen – 1 Stück entstehen:
--- a/document.txt
+++ b/document.txt
@@ -1,4 +1,4 @@
alpha
-beta
+beta revised
gamma
-delta
+epsilon
Der Quellcodeblock verwendet bewusst den gleichen zweizeiligen Header und die gleiche Bereichsgrammatik wie das Artefakt. Die Zählung eins wird nur als Anfang geschrieben; andere Zählungen verwenden start,count. Eine Einfügung in eine leere Datei beginnt daher mit einem alten Bereich von 0,0.
Der Kontext ändert die Verpackung, nicht die Antwort
Bei drei Kontextzeilen steht das unveränderte gamma zwischen beiden Ersetzungen und sie teilen sich ein Stück. Bei Null-Kontext wird diese unveränderte Linie weggelassen und die beiden Ersatzregionen werden zu zwei kompakten Blöcken. Die Bearbeitungstabelle listet in beiden Fällen immer noch die vollständige Sequenz auf.
GNU Diffutils verwendet standardmäßig drei Zeilen, da der Kontext einem Patchprogramm dabei hilft, eine Bearbeitung zu finden, nachdem benachbarte Zeilen verschoben wurden. Die kontextfreie Ausgabe ist für eine kompakte Rezension gültig und nützlich, liefert jedoch weniger Hinweise darauf, wo ein späterer Verbraucher sie anwenden sollte.
Hierbei handelt es sich um einen wechselseitigen Textvergleich, nicht um eine semantische Zusammenführung. Verwenden Sie den Markdown-Inhaltsverzeichnis-Maker, um ein Dokument zu erstellen, und vergleichen Sie das Ergebnis dann hier, wenn Sie jeden eingefügten Anker und jede Navigationszeile überprüfen möchten.
So wird es gemacht
- CRLF und einzelne CR-Zeilenenden werden auf LF normalisiert, während aufgezeichnet wird, ob die letzte logische Zeile jedes Dokuments einen abschließenden Zeilenumbruch hat.
- Erstellen Sie eine Matrix mit der längsten gemeinsamen Teilsequenz über den gesamten Zeilentext und seinen Beendigungsstatus und wählen Sie das Löschen vor dem Einfügen aus, wenn mehrere Mindestskripts übereinstimmen.
- Erweitern Sie jede geänderte Bearbeitung um die erforderliche Anzahl unveränderter Kontextzeilen und führen Sie Bereiche, die sich berühren oder überlappen, zu einheitlichen Diff-Hunks zusammen.
- Schreiben Sie bereinigte ---- und +++-Beschriftungen, den genauen @@-Start, Zählbereiche und Leerzeichen sowie Minus- oder Plus-Zeilenpräfixe in einen herunterladbaren Patch.
Wovon es ausgeht
- Der Vergleich erfolgt zeilenbasiert und nach der Zeilenumbruchnormalisierung exakt. Unterschiede zwischen Leerzeichen, Groß- und Kleinschreibung und Unicode-Normalisierung werden nicht ignoriert.
- Jede Seite ist auf 2.000 Zeichen begrenzt, wodurch die quadratische Matrix der längsten gemeinsamen Teilsequenz im Browser begrenzt bleibt.
- Es kann mindestens ein Bearbeitungsskript vorhanden sein. Bindungen, die zuerst gelöscht werden, machen diese Ausgabe wiederholbar, aber nicht eindeutig mathematisch privilegiert.
- Ein syntaktisch erstellter Patch kann immer noch gegen eine dritte Datei fehlschlagen, deren umgebender Inhalt sich geändert hat; Dieses Tool wendet keine Patches an oder führt sie zusammen.
Fragen
Warum wird eine geänderte Zeile als eine Entfernung und eine Hinzufügung angezeigt?
Unified Diff hat Kontext, entfernte und hinzugefügte Zeilendatensätze, keinen separaten Ersetzungsdatensatz. Bei einem Austausch wird also die alte Komplettlinie entfernt und die neue hinzugefügt.
Was ändern Kontextlinien?
Sie ändern, wie viel unverändertes Material einen Schnitt umgibt und ob nahegelegene Regionen zu einem Stück verschmelzen. Sie ändern nicht die zugrunde liegenden Hinzufügungen, Entfernungen oder Mindestbearbeitungsskripte.
Zählt ein endgültiger Zeilenumbruchunterschied?
Ja. Eine Textdatei mit der Endung `same` ist nicht Byte-äquivalent zu einer Textdatei mit der Endung `same` plus einer neuen Zeile, daher gibt der Patch die herkömmliche explizite Markierung für die unvollständige Zeile aus.
Kann der Patch einen lokalen Verzeichnispfad offenlegen?
Die Beschriftung wird auf ihre endgültige Pfadkomponente reduziert und Steuerzeichen werden entfernt. Die Header verwenden nur `a/label` und `b/label`, ohne Maschinenpfad oder Zeitstempel.