Code-Dateien vergleichen: hinzugefügte und entfernte Zeilen
Sehen Sie genau, was sich zwischen zwei Dateiversionen geändert hat: Wird return a + b in zwei neue Zeilen umgeschrieben, ergibt das 2 hinzugefügte, 1 entfernte und 3 unveränderte Zeilen, mit alten und neuen Zeilennummern und klassischer Diff-Ansicht. Kostenlos in Ihrem Browser.
- Kostenlos
- Läuft in Ihrem Browser
- Ohne Anmeldung
- Ihre Daten bleiben auf Ihrem Gerät
Im Browser ausführen – kostenlos
Vergleichen Sie zwei Versionen einer Quellcodedatei und erhalten Sie eine deterministische Aufstellung aller Änderungen, Zeile für Zeile. Das Ergebnis kennzeichnet jede hinzugefügte, entfernte und unveränderte Zeile, nennt gegebenenfalls die alten und neuen Zeilennummern und liefert eine vertraute Gesamtansicht für Protokolle oder Prüfoberflächen. Die Funktion eignet sich für jede textbasierte Programmiersprache. Sie interpretiert keine Syntax, führt keinen Code aus, greift auf kein Repository zu und verändert keine Version. Dadurch ist sie ein kleiner, berechenbarer Baustein für Entwicklungswerkzeuge, Lernsysteme, Migrationsprüfungen und automatisierte Review-Abläufe.
Geben Sie beide Codeversionen an
Eine der Versionen darf leer sein und steht dann folgerichtig für eine neu erstellte oder vollständig gelöschte Datei. Beide dürfen jedoch nicht leer sein, da es sonst keinen sinnvollen Vergleich gäbe. Zeilenenden werden vor dem Vergleich vereinheitlicht.
Dadurch lassen sich Windows-Text mit CRLF und Unix-Text mit LF vergleichen, ohne dass jede Zeile fälschlich als geändert erscheint. Der Vergleich ist bewusst sprachunabhängig: JavaScript, Python, Go, Rust, Konfigurationsdateien, Vorlagen, SQL und andere zeilenorientierte Texte folgen denselben Regeln. Nach der Vereinheitlichung werden die Zeilen exakt verglichen.
Leerzeichen, Tabulatoren, Groß- und Kleinschreibung, Satzzeichen und Kommentare bleiben bedeutsam, da solche Einzelheiten das Programmverhalten ändern können. Geben Sie den vollständigen Text und keinen Patch an. Das Ergebnis wertet den Code niemals aus und löst keine Importe auf; daher können Sie auch nicht vertrauenswürdige Ausschnitte als Klartext vergleichen.
Für einen vorhersehbaren Ressourcenbedarf ist jede Version auf 2,000 Zeilen begrenzt. Teilen Sie außergewöhnlich große generierte Dateien vor dem Senden auf.
Verstehen Sie strukturierte Änderungen und Gesamtansicht
Die Antwort enthält ein identical-Kennzeichen, eine Zusammenfassung, ein strukturiertes Zeilen-Array und Text im vereinheitlichten Stil. Die Zusammenfassung zählt hinzugefügte, entfernte und unveränderte Zeilen. Jeder strukturierte Eintrag enthält einen Typ und den exakten Text.
Nicht zutreffende Felder werden ausgelassen; dies vereinfacht die Weiterverarbeitung gegenüber Platzhaltern mit null. Eine geänderte Zeile erscheint als eine Entfernung und eine Hinzufügung, entsprechend der grundlegenden Semantik klassischer zeilenbasierter Diff-Werkzeuge. Danach folgen ein Bereichskopf und Zeilen mit Präfix: Ein Leerzeichen bedeutet unverändert, ein Minuszeichen entfernt und ein Pluszeichen hinzugefügt.
Die Ausgabe umfasst die gesamte übermittelte Datei, statt weit auseinanderliegende Bereiche in getrennte Kontextblöcke zu verdichten. Dadurch bleibt die Verarbeitung einfach, und die strukturierte Liste beschreibt genau dieselbe Reihenfolge wie die Textansicht.
Nutzen Sie deterministische Ausgaben in Entwicklungsabläufen
Der Algorithmus ermittelt eine geordnete gemeinsame Teilfolge. So erkennt er Einfügungen und Löschungen auch dann, wenn sich Zeilennummern verschieben. Doppelte Zeilen werden anhand ihrer Position und Reihenfolge behandelt und nicht so, als wäre die Datei eine Menge.
Wenn mehrere gültige Ausrichtungen möglich sind, nutzt die Implementierung eine stabile Entscheidungsregel; gleiche Eingaben erzeugen somit immer dieselbe Ausgabe. Verwenden Sie das strukturierte Array für eine Gegenüberstellung, zum Zählen von Änderungstypen, zum Beschriften von Zeilennummern oder zum Durchsetzen einer Richtlinie. Dafür wären Sprachparser oder Versionsverwaltungskontext nötig.
Das engere Zeilenmodell bietet transparentes Verhalten ohne Netzwerkabhängigkeit und lässt sich mit denselben zwei Zeichenketten lokal reproduzieren.
Anwendungsfälle
Erstellen Sie eine Code-Review-Ansicht
Zeigen Sie strukturierte hinzugefügte, entfernte und gleiche Zeilen mit den korrekten alten und neuen Nummern an.
Prüfen Sie Änderungen an erzeugtem Code
Vergleichen Sie Ausgaben zweier Läufe und speichern Sie eine deterministische Gesamtansicht in den Build-Protokollen.
Erläutern Sie die Überarbeitung einer Aufgabe
Zeigen Sie Lernenden genau, welche Quellzeilen eingefügt oder gelöscht wurden, ohne den eingereichten Code auszuführen.
Häufige Fragen
Was kostet ein Vergleich?
Im Browser kann dieselbe deterministische Logik lokal ausgeführt werden.
Welche Programmiersprachen werden unterstützt?
Jede textbasierte Sprache wird unterstützt, da der Vergleich zeilenweise und unabhängig von der Syntax erfolgt.
Werden reine Leerraumänderungen gemeldet?
Ja. Leerzeichen und Tabulatoren sind relevant; eine Zeile mit geändertem Leerraum erscheint daher entfernt und hinzugefügt.
Darf eine der Versionen leer sein?
Ja. Eine leere Version steht für eine neue oder gelöschte Datei. Nur zwei leere Versionen führen zu einem Fehler.
Verwendet das Ergebnis das vereinheitlichte Diff-Format?
Es liefert Dateimarkierungen, einen Bereichskopf und bekannte Zeilenpräfixe sowie strukturierte Einträge. Es ist eine Gesamtansicht der Datei und keine Folge verdichteter Kontextblöcke.
Verwandte Tools
Für Entwickler — API-Zugang
Alles auf dieser Seite ist auch per API verfügbar. Dieser Abschnitt richtet sich an Teams, die es in ihre eigenen Systeme einbinden möchten; alle anderen nutzen einfach das Tool oben.
Endpunkt
Authentifizierung per Bearer-Token. Ein einziger POST stellt die Aufgabe in die Warteschlange; das Ergebnis erhalten Sie per Webhook oder über einen signierten Link.
Aufruf aus Ihrem Stack
curl -X POST https://api.kit.forhosting.com/dev2/diff-two-code-files \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"original_code":"function greet(name) {\n return `Hello, ${name}`;\n}\n","revised_code":"function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"}'const res = await fetch("https://api.kit.forhosting.com/dev2/diff-two-code-files", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"original_code": "function greet(name) {\n return `Hello, ${name}`;\n}\n",
"revised_code": "function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev2/diff-two-code-files",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"original_code": "function greet(name) {\n return `Hello, ${name}`;\n}\n",
"revised_code": "function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev2/diff-two-code-files", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"original_code":"function greet(name) {\\n return `Hello, ${name}`;\\n}\\n","revised_code":"function greet(name = \\"world\\") {\\n return `Hello, ${name}!`;\\n}\\n"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"original_code":"function greet(name) {\n return `Hello, ${name}`;\n}\n","revised_code":"function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev2/diff-two-code-files", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Beispiel-Anfrage
{
"original_code": "function greet(name) {\n return `Hello, ${name}`;\n}\n",
"revised_code": "function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev2.diff_two_code_files",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}Die API arbeitet asynchron: Sie erhalten sofort eine task_id. Polling ist mit 1 Anfrage pro Sekunde erlaubt.
Preis
Der Preis steht auf der Seite – keine Tokens, keine Credits. Fehlgeschlagene Aufgaben werden nicht berechnet.
Fehler
| HTTP | Code | Bedeutung |
|---|---|---|
401 | unauthorized | Der API-Schlüssel fehlt oder ist ungültig – prüfen Sie den Authorization-Header (Bearer). |
402 | insufficient_balance | Ihr Guthaben reicht für diese Aufgabe nicht aus – Aufladungen verfallen nicht. |
404 | unknown_type | Unbekannter Aufgabentyp – prüfen Sie das Feld „type“ gegen den Katalog. |
429 | rate_limited | Zu viele Anfragen – warten Sie kurz; Polling ist mit 1 Anfrage pro Sekunde erlaubt. |
Technische Hinweise
Geben Sie beide Codeversionen an
Übermitteln Sie den früheren Quelltext in original_code und den späteren in revised_code.
Verstehen Sie strukturierte Änderungen und Gesamtansicht
Unveränderte Einträge enthalten old_line und new_line, weil die Zeile in beiden Versionen vorkommt. Entfernte Einträge enthalten old_line, hinzugefügte dagegen new_line. Das Feld unified_diff beginnt mit Markierungen für Original und Überarbeitung.
Nutzen Sie deterministische Ausgaben in Entwicklungsabläufen
Verwenden Sie unified_diff für einen lesbaren Protokolleintrag, einen kompakten Aufgabenanhang oder ein Werkzeug, das die üblichen Präfixe versteht. Diese Fähigkeit bietet keinen syntaxbezogenen Abgleich, keine Umbenennungserkennung, keine Hervorhebung einzelner Token, keine Lösung von Merge-Konflikten und keinen Repository-Zugriff.