Menü

Werkzeuge durchsuchenÄnderungsprotokoll

zum Navigieren zum ÖffnenBeschreiben Sie das Problem, nicht das Tool

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.

Die linke Seite des Vergleichs. CRLF- und CR-Zeilenumbrüche werden vor dem Zeilenvergleich auf LF normalisiert.

Die rechte Seite. Eine geänderte Zeile wird als eine Löschung und eine Hinzufügung dargestellt, wie es für Unified Diff erforderlich ist.

Um jede Bearbeitung herum werden unveränderte Zeilen angezeigt. In der Nähe befindliche Bearbeitungen werden zusammengeführt, wenn sich ihr Kontext überschneidet.

Zusammenfassung ändern
2 lines added, 2 lines removed
Zeilen hinzugefügt
2
Zeilen entfernt
2
Linien unverändert
10
Verwandle Kerle
2

Einheitlicher Diff-Patch

document.txt.patch · 167 B

Ein Standard-Patch --- / +++ mit @@-Bereichen, ausgewähltem Kontext und expliziten Markierungen für fehlende letzte Zeilen.

Das komplette Zeilenbearbeitungsskript

Unchanged11alpha
Removed2beta
Added2beta revised
Unchanged33line 03
Unchanged44line 04
Unchanged55line 05
Unchanged66line 06
Unchanged77line 07
Unchanged88line 08
Unchanged99line 09
Unchanged1010line 10
Unchanged1111line 11
Removed12delta
Added12epsilon

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Quellen