Diff & Patch: Comparing Files (Artikel 262)
Vergleich von Dateien und Verzeichnissen mit diff. Erfahren Sie alles über Patch-Files, die Anwendung von Code-Änderungen und den Einsatz von visuellen Diff-Tools.
# Diff & Patch Mastery: Änderungen präzise verwalten
TL;DR / Management Summary “Was hat sich an der Config geändert?” Dies ist die tägliche Frage jedes Admins. diff ist das Werkzeug, um Unterschiede zwischen zwei Dateien oder Verzeichnissen zu finden. Sein Partner patch nimmt diese Unterschiede und wendet sie automatisch auf eine andere Datei an. Ein Senior Admin nutzt diese Tools, um Bugfixes zu verteilen, Konfigurationsänderungen zu dokumentieren und Backups gegen Live-Systeme zu validieren.
# 1. Einführung & Architektur
Die Sprache der Unterschiede.
Ein Diff zeigt an, welche Zeilen hinzugefügt (+), gelöscht (-) oder geändert wurden. Der Standard im Enterprise-Umfeld ist das Unified Format (-u).
# Der Patch-Workflow (Mermaid)
graph LR
A[Original: nginx.conf] --> B{diff -u}
C[New: nginx.conf.new] --> B
B --> D[Patch File: nginx.patch]
D --> E[Command: patch]
F[Another Host: nginx.conf] --> E
E --> G[Updated Host: nginx.conf]
# 2. diff: Den Unterschied finden
Analyse der Änderungen.
# Einfacher Vergleich
# Zeigt Unterschiede zwischen alter und neuer Config
diff -u config.old config.new
# Verzeichnisse vergleichen
Ideal, um zu sehen, welche Konfigurationsdateien auf zwei Servern unterschiedlich sind.
# -r: Rekursiv, -q: Nur Dateinamen melden
diff -rq /etc/nginx /backup/etc/nginx
# 3. patch: Änderungen anwenden
Die Automatisierung.
Wenn Sie eine Änderung an 100 Servern ausrollen wollen, schicken Sie nicht die ganze Datei, sondern nur den Patch.
# Schritt 1: Patch erstellen
diff -u config.old config.new > my_change.patch
# Schritt 2: Patch anwenden
# Auf dem Ziel-Server
patch config.old < my_change.patch
# 4. Day-2 Operations: Visuelle Diffs
Für komplexe Merges.
Wenn hunderte Zeilen unterschiedlich sind, hilft nur ein visueller Vergleich.
# vimdiff (Der Favorit)
# Zeigt beide Dateien nebeneinander im Terminal
vimdiff config.old config.new
Mit CTRL + w, w wechseln Sie zwischen den Fenstern.
# 5. Troubleshooting & “War Stories”
Wenn der Patch nicht passt.
# Story 1: “Das Fuzz-Problem”
Symptom: patch meldet Hunk #1 succeeded at 120 (with fuzz 2).
Ursache: Die Zieldatei hat sich seit der Erstellung des Patches leicht geändert. Die Zeilennummern passen nicht mehr exakt, aber patch hat die Stelle durch Kontext-Erkennung gefunden.
Lösung: Prüfen Sie das Ergebnis manuell! “Fuzz” bedeutet, dass der Patch “geraten” hat.
# Story 2: “Der binäre Diff-Fail”
Symptom: diff meldet “Binary files differ” und zeigt keine Details.
Ursache: Eine der Dateien enthält nicht-druckbare Zeichen (z.B. ein Bild oder ein kompiliertes Binary).
Lösung: Nutzen Sie spezialisierte Tools wie cmp -l für Byte-Vergleiche oder hexdump -C | diff für eine visuelle Analyse von Binärdaten.
# 6. Fazit & Empfehlung
- Format: Nutzen Sie immer
diff -u. Es ist die einzige Syntax, die vonpatchund modernen Git-Tools universell verstanden wird. - Wartung: Erstellen Sie Diffs vor jedem großen Upgrade eines Dienstes, um Ihre manuellen Änderungen dokumentiert zu haben.
- Wahl: Nutzen Sie colordiff, um die Ausgabe auf der Konsole lesbarer zu machen (
apk add colordiff).
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Standard Diff (Unified) | diff -u file1 file2 |
| Verzeichnis Diff | diff -r dir1 dir2 |
| Nur Namen bei Diff | diff -r -q dir1 dir2 |
| Patch anwenden | patch < patchfile |
| Patch rückgängig | patch -R < patchfile |
| Diffs ignorieren (Space) | diff -b |
| Visueller Diff | vimdiff file1 file2 |
| Git Style Diff | git diff --no-index file1 file2 |
| Diff als HTML | diff2html (Node.js tool) |
| Leere Files beachten | diff -N |