Text Diff

Vergelijk twee teksten naast elkaar en markeer verschillen regel voor regel

Probeer een voorbeeld

Tekst A

Tekst B

Draait lokaal · Veilig om secrets te plakken
Draait lokaal · Veilig om secrets te plakken

Wat is Text Diff?

Een text diff (afkorting van "difference") is het resultaat van het vergelijken van twee tekstblokken waarbij wordt vastgesteld welke regels zijn toegevoegd, verwijderd of ongewijzigd. Het concept is afkomstig van het Unix-hulpprogramma diff, voor het eerst uitgebracht in 1974 als onderdeel van Version 5 Unix. Tegenwoordig is text diff de ruggengraat van versiebeheersystemen zoals Git, waarbij elke commit een diff opslaat in plaats van een volledige kopie van elk bestand.

Een diff-algoritme zoekt de Longest Common Subsequence (LCS) tussen twee reeksen regels. Regels die in de LCS aanwezig zijn, worden als ongewijzigd gemarkeerd. Regels in de originele tekst maar niet in de LCS worden als verwijderd gemarkeerd. Regels in de gewijzigde tekst maar niet in de LCS worden als toegevoegd gemarkeerd. Het resultaat is een minimale set wijzigingen die nodig zijn om de ene tekst in de andere te transformeren.

Diff-uitvoer komt in verschillende formaten voor. Unified diff (de standaard voor git diff) geeft verwijderde regels een minteken als prefix en toegevoegde regels een plusteken. Side-by-side diff rangschikt beide teksten in parallelle kolommen. Dit hulpmiddel gebruikt regel-voor-regel vergelijking met kleurgecodeerde uitvoer: groen voor toevoegingen, rood voor verwijderingen en neutraal voor ongewijzigde regels. Ongewijzigde regels worden standaard zonder prefix weergegeven, maar kunnen worden verborgen om alleen de wijzigingen te bekijken.

Waarom een online text diff-tool gebruiken?

Tekst vergelijken in een terminal vereist het installeren van diff-hulpprogramma's en het omgaan met opdrachtregelopties. Een browsergebaseerde diff-tool neemt die drempel volledig weg.

Directe vergelijking
Plak twee tekstblokken en zie de verschillen onmiddellijk gemarkeerd. Geen bestandsaanmaak, geen commando's om te onthouden, geen uitvoer om te verwerken.
🔒
Privacy-eerst verwerking
Alle vergelijking vindt in uw browser plaats via JavaScript. Uw tekst verlaat uw apparaat nooit — wat belangrijk is bij het vergelijken van configuratiebestanden, inloggegevens of bedrijfseigen code.
📋
Kopieerklare uitvoer
De diff-uitvoer gebruikt standaard + / - prefixen die overeenkomen met het unified diff-formaat. U kunt het resultaat direct kopiëren naar commitberichten, codereviews of bugmeldingen.
🌐
Geen inloggen of installatie vereist
Werkt op elk apparaat met een browser. Geen accountaanmaak, geen extensie, geen desktopapplicatie. Open de pagina en begin met vergelijken.

Toepassingen van Text Diff

Frontend-ontwikkeling
Vergelijk verkleinde CSS- of HTML-uitvoer voor en na een bouwstap om onbedoelde wijzigingen in gegenereerde opmaak of stijlen te ontdekken.
Backend-ontwikkeling
Vergelijk API-reacties tussen omgevingen (staging versus productie) om te verifiëren dat een deployment geen onverwachte gegevenswijzigingen heeft geïntroduceerd.
DevOps & Infrastructuur
Vergelijk Kubernetes-manifesten, Terraform-plannen of Nginx-configuraties voordat u wijzigingen toepast op een live cluster of server.
QA & Testen
Verifieer dat testuitvoer overeenkomt met verwachte basislijnen door het werkelijke resultaat te vergelijken met een opgeslagen snapshot-bestand.
Data-engineering
Vergelijk CSV-headers of SQL-schemadefinities over database-migraties heen om te bevestigen dat kolommen correct zijn toegevoegd of hernoemd.
Leren & Studie
Vergelijk uw oplossing regel voor regel met een referentie-implementatie om te zien waar uw logica afwijkt van de verwachte aanpak.

Diff-uitvoerformaten vergeleken

Diff-hulpmiddelen produceren uitvoer in verschillende formaten. De onderstaande tabel geeft een overzicht van de meest voorkomende, wat ze genereert en wanneer elk nuttig is.

FormaatHulpmiddel / BronOmschrijving
Unified diffdiff -u / git diffPrefixes lines with + / - / space; includes @@ hunk headers
Side-by-sidediff -y / sdiffTwo columns, changed lines aligned horizontally
Context diffdiff -cShows changed lines with surrounding context, marked with ! / + / -
HTML diffPython difflibColor-coded HTML table with inline change highlights
JSON PatchRFC 6902Array of add/remove/replace operations on a JSON document

Hoe regel-diff werkt: het LCS-algoritme

De meeste regel-diff-hulpmiddelen, waaronder dit, gebruiken het Longest Common Subsequence (LCS)-algoritme. LCS vindt de grootste reeks regels die in beide teksten in dezelfde relatieve volgorde voorkomt, zonder dat ze aaneengesloten hoeven te zijn. De regels die niet in de LCS zitten, zijn de feitelijke verschillen.

Het standaard LCS-algoritme gebruikt dynamisch programmeren en heeft een tijdcomplexiteit van O(m x n), waarbij m en n het aantal regels in de twee teksten zijn. Voor grote bestanden verminderen geoptimaliseerde varianten zoals het Myers' diff-algoritme (gebruikt door Git) dit tot O(n + d^2) waarbij d het aantal verschillen is — waardoor het snel blijft wanneer de meeste regels gedeeld worden.

1. Bouw de DP-tabel
Maak een (m+1) x (n+1) matrix. Sla voor elk paar regels de lengte op van de langste gemeenschappelijke deelrij die tot nu toe is gevonden. Gelijke regels verhogen de diagonale waarde met 1.
2. Terugwaarts traceren
Loop van de rechteronderhoek van de matrix terug naar (0,0). Diagonale stappen bij gelijke regels leveren "ongewijzigde" items op. Horizontale of verticale stappen leveren "toegevoegde" of "verwijderde" items op.
3. Uitvoer weergeven
Wijs aan elk item een weergaveregel toe: ongewijzigde regels krijgen geen prefix, toegevoegde regels krijgen +, verwijderde regels krijgen -. Pas kleurcodering toe voor visuele duidelijkheid.

Codevoorbeelden

Implementaties van regel-voor-regel tekstvergelijking in JavaScript, Python, Go en de opdrachtregel. Elk voorbeeld produceert uitvoer in unified-diff-stijl.

JavaScript
// Line-by-line diff using the LCS algorithm
function diffLines(a, b) {
  const linesA = a.split('\n')
  const linesB = b.split('\n')

  // Build LCS table
  const m = linesA.length, n = linesB.length
  const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0))
  for (let i = 1; i <= m; i++)
    for (let j = 1; j <= n; j++)
      dp[i][j] = linesA[i-1] === linesB[j-1]
        ? dp[i-1][j-1] + 1
        : Math.max(dp[i-1][j], dp[i][j-1])

  // Backtrack to produce diff
  const result = []
  let i = m, j = n
  while (i > 0 || j > 0) {
    if (i > 0 && j > 0 && linesA[i-1] === linesB[j-1]) {
      result.unshift({ type: 'equal', text: linesA[i-1] }); i--; j--
    } else if (j > 0 && (i === 0 || dp[i][j-1] >= dp[i-1][j])) {
      result.unshift({ type: 'add', text: linesB[j-1] }); j--
    } else {
      result.unshift({ type: 'remove', text: linesA[i-1] }); i--
    }
  }
  return result
}

const diff = diffLines("alpha\nbeta\ngamma", "alpha\nbeta changed\ngamma\ndelta")
// → [
//   { type: 'equal',  text: 'alpha' },
//   { type: 'remove', text: 'beta' },
//   { type: 'add',    text: 'beta changed' },
//   { type: 'equal',  text: 'gamma' },
//   { type: 'add',    text: 'delta' }
// ]
Python
import difflib

text_a = """alpha
beta
gamma""".splitlines()

text_b = """alpha
beta changed
gamma
delta""".splitlines()

# Unified diff (same format as git diff)
for line in difflib.unified_diff(text_a, text_b, fromfile='a.txt', tofile='b.txt', lineterm=''):
    print(line)
# --- a.txt
# +++ b.txt
# @@ -1,3 +1,4 @@
#  alpha
# -beta
# +beta changed
#  gamma
# +delta

# HTML side-by-side diff
d = difflib.HtmlDiff()
html = d.make_file(text_a, text_b, fromdesc='Original', todesc='Modified')
Go
package main

import (
	"fmt"
	"strings"
)

// Minimal LCS-based line diff
func diffLines(a, b string) {
	la := strings.Split(a, "\n")
	lb := strings.Split(b, "\n")
	m, n := len(la), len(lb)

	dp := make([][]int, m+1)
	for i := range dp {
		dp[i] = make([]int, n+1)
	}
	for i := 1; i <= m; i++ {
		for j := 1; j <= n; j++ {
			if la[i-1] == lb[j-1] {
				dp[i][j] = dp[i-1][j-1] + 1
			} else if dp[i-1][j] >= dp[i][j-1] {
				dp[i][j] = dp[i-1][j]
			} else {
				dp[i][j] = dp[i][j-1]
			}
		}
	}

	var result []string
	i, j := m, n
	for i > 0 || j > 0 {
		if i > 0 && j > 0 && la[i-1] == lb[j-1] {
			result = append([]string{" " + la[i-1]}, result...)
			i--; j--
		} else if j > 0 && (i == 0 || dp[i][j-1] >= dp[i-1][j]) {
			result = append([]string{"+" + lb[j-1]}, result...)
			j--
		} else {
			result = append([]string{"-" + la[i-1]}, result...)
			i--
		}
	}

	for _, line := range result {
		fmt.Println(line)
	}
}

// Output:
//  alpha
// -beta
// +beta changed
//  gamma
// +delta
CLI (diff / git)
# Compare two files with unified diff (3 lines of context)
diff -u original.txt modified.txt

# Git diff between working tree and last commit
git diff HEAD -- file.txt

# Git diff between two branches
git diff main..feature -- src/

# Side-by-side diff in the terminal
diff -y --width=120 original.txt modified.txt

# Color-coded diff (requires colordiff)
diff -u original.txt modified.txt | colordiff

Veelgestelde vragen

Wat is het verschil tussen een regel-diff en een teken-diff?
Een regel-diff vergelijkt tekst regel voor regel: als een teken op een regel verandert, wordt de hele regel als verwijderd gemarkeerd en de nieuwe versie als toegevoegd. Een teken-diff (of woorddiff) werkt op een fijner niveau en markeert de specifieke tekens of woorden die binnen een regel zijn gewijzigd. Regel-diff is standaard voor codereview; teken-diff is nuttiger voor proza-bewerking.
Hoe werkt git diff intern?
Git gebruikt standaard het Myers' diff-algoritme, dat het kortste bewerkingsscript (het minimale aantal invoegingen en verwijderingen) tussen twee bestanden vindt. Git slaat het resultaat op in unified diff-formaat met @@ hunk-headers die regelnummers aangeven. Wanneer u git diff uitvoert, vergelijkt Git de werkkopie met de index (staging area), niet met de laatste commit, tenzij u HEAD expliciet doorgeeft.
Kan ik binaire bestanden vergelijken met een text diff-tool?
Nee. Text diff-hulpmiddelen splitsen invoer op newline-tekens en vergelijken strings. Binaire bestanden bevatten willekeurige bytereeksen die zinloze regelsplitsingen opleveren. Gebruik voor binaire vergelijking een hex diff-hulpmiddel of een vergelijking van controlesommen op bestandsniveau (sha256sum op beide bestanden).
Worden mijn gegevens naar een server gestuurd bij gebruik van dit hulpmiddel?
Nee. Dit hulpmiddel draait volledig in uw browser. De diff-berekening maakt gebruik van een JavaScript LCS-implementatie die aan de clientzijde wordt uitgevoerd. Er worden geen netwerkverzoeken gedaan met uw tekstinhoud. U kunt dit verifiëren door het tabblad Netwerk in uw browser te openen terwijl u het hulpmiddel gebruikt.
Wat is het unified diff-formaat?
Unified diff is het uitvoerformaat van diff -u en git diff. Het toont gewijzigde regels met - (verwijderd) en + (toegevoegd) als prefix, voorafgegaan door @@ headers die de regelnummerbereiken in beide bestanden aangeven. Contextregels (ongewijzigd) hebben een spatie als prefix. Unified diff is het meest gebruikelijke formaat voor patches, pull requests en codereviews.
Hoe vergelijk ik grote bestanden met veel verschillen?
Voor bestanden met duizenden regels werkt een browsergebaseerd hulpmiddel, maar het kan vertragen omdat het LCS-algoritme kwadratisch schaalt. Voor zeer grote diffs zijn opdrachtregelprogramma's zoals diff of git diff sneller omdat ze geoptimaliseerde C-implementaties gebruiken en uitvoer kunnen streamen. U kunt ook ongewijzigde regels verbergen (schakel "Ongewijzigde regels tonen" uit in dit hulpmiddel) om alleen op wijzigingen te focussen.
Wat is een drieweg-merge diff?
Een drieweg-merge vergelijkt twee gewijzigde versies van een bestand met hun gemeenschappelijke voorouder (de basis). Git gebruikt dit tijdens git merge en git rebase. Het identificeert wijzigingen die in elke branch ten opzichte van de basis zijn gemaakt en combineert ze. Wanneer beide branches dezelfde regel wijzigen, meldt Git een samenvoegconflict. Een drieweg-merge vereist drie invoerbestanden, terwijl een standaard diff er slechts twee nodig heeft.