Ich bearbeite viele Textdateien. Manchmal ist es Code. In anderen Fällen ist es das geschriebene Wort für Rollenspiele (RPGs), Programmierbücher oder allgemeine Korrespondenz. Manchmal ist es schön, eine Änderung vorzunehmen, aber mein Mitarbeiter muss meine Änderung mit dem vergleichen, was er ursprünglich geschrieben hatte. Viele Benutzer verwenden standardmäßig Office-Suiten wie LibreOffice, die Kommentare oder Funktionen zur Änderungsverfolgung verwenden. Manchmal ist ein einfacheres Tool jedoch sinnvoller, und dafür können Sie in der Programmierhistorie nach Tools wie diff
suchen und patch
, die eine standardisierte Formatierung zum Nachverfolgen und Anwenden von Änderungen auf freigegebene Dateien bereitstellen.
Weitere Linux-Ressourcen
- Spickzettel für Linux-Befehle
- Spickzettel für fortgeschrittene Linux-Befehle
- Kostenloser Online-Kurs:RHEL Technical Overview
- Spickzettel für Linux-Netzwerke
- SELinux-Spickzettel
- Spickzettel für allgemeine Linux-Befehle
- Was sind Linux-Container?
- Unsere neuesten Linux-Artikel
Selbst bei einer einfachen Datei ist die Synchronisierung zweier Dokumente komplex. Einige Elemente werden geändert, andere bleiben unverändert, neue Inhalte werden hinzugefügt, und einige bleiben gleich, werden aber an andere Stellen im Dokument verschoben. Es ist schwierig, Änderungen zu replizieren, ohne glücklich zu akzeptieren, dass alle Änderungen gleichermaßen gültig sind, und die alte Datei durch die neue zu ersetzen. Es ist auch monolithisch undurchsichtig. Es gibt so viele Änderungen, dass es schwierig ist, genau herauszufinden, was sich geändert hat.
Mit dem diff
Befehl können Sie eine Aufzeichnung darüber erstellen, wie sich die Datei geändert hat, und mit patch
Sie können diese Änderungen über die alte Version "wiederholen", um sie mit der neuen Version auf den neuesten Stand zu bringen.
Einrichtung
Angenommen, Sie und ich arbeiten gemeinsam an einer Datei, die beschreibt, wie man eine Tasse Tee zubereitet.
Bisher die Datei tea.md
enthält rohes Kopieren und Einfügen:
Boil water.
Warm the teapot.
Add tea and water to the teapot.
Place a tea cosy over the teapot.
Steep for 6 minutes.
Pour tea into cup.
Add milk.
Es scheint vernünftig, aber Sie können immer Optimierungen vornehmen, also senden Sie mir die Datei zur Verbesserung. Um den Prozess der Teezubereitung zu verdeutlichen, kopiere ich die Datei als tea-revision.md
und bearbeiten Sie es, bis Sie Folgendes erhalten:
Warm a teapot in the proving drawer of your oven.
Boil water.
Add tea leaves to a tea strainer.
Add strainer and water to teapot.
Steep for 6 minutes. Keep it warm with a tea cosy.
Pour tea into cup.
Optionally, add warm milk.
Wie erwartet sind einige Gegenstände (Boil water
und Pour tea into cup
) bleiben unverändert, während andere Zeilen (Warm the teapot
) wurden ergänzt. Einige Zeilen sind komplett neu und einige Zeilen sind gleich, aber in einer anderen Reihenfolge.
Diff erstellen
Der diff
Tool zeigt den Unterschied zwischen zwei Dateien an. Es gibt verschiedene Möglichkeiten, die Ergebnisse anzuzeigen, aber ich denke, die klarste ist --unified
(-u
kurz) Ansicht, die anzeigt, welche Zeilen hinzugefügt oder entfernt wurden. Eine Zeile, die in irgendeiner Weise geändert wurde, wird als Zeile behandelt, die subtrahiert und dann hinzugefügt wurde. Standardmäßig diff
gibt seine Ausgabe an das Terminal aus.
Geben Sie diff
an mit der alten Datei und dann der neuen Datei:
$ diff --unified tea.md tea-revised.md
--- tea.md 2021-11-13 10:26:25.082110219 +1300
+++ tea-revised.md 2021-11-13 10:26:32.049110664 +1300
@@ -1,7 +1,7 @@
+Warm a teapot in the proving drawer of your oven.
Boil water.
-Warm the teapot.
-Add tea and water to the teapot.
-Place a tea cosy over the teapot.
-Steep for 6 minutes.
+Add tea leaves to a tea strainer.
+Add strainer and water to teapot.
+Steep for 6 minutes. Keep it warm with a tea cosy.
Pour tea into cup.
-Add milk.
+Optionally, add warm milk.
Ein Pluszeichen (+
) am Anfang einer Zeile gibt etwas an, das der alten Datei hinzugefügt wurde. Ein Minuszeichen (-
) am Anfang einer Zeile zeigt an, dass eine Zeile entfernt oder geändert wurde.
Erstellen Sie einen Patch mit diff
Eine Patch-Datei ist nur die Ausgabe von diff --unified
Befehl in einer Datei abgelegt. Sie können dies mit der Standard-Bash-Umleitung tun:
$ diff -u tea.md tea-revised.md > tea.patch
Der Inhalt der Datei ist genau derselbe wie der, der an das Terminal ausgegeben wurde. Ich schaue mir gerne Patch-Dateien in Emacs an, die jede Zeile farblich kennzeichnen, je nachdem, ob sie hinzugefügt oder entfernt wurde.
Änderungen mit Patch anwenden
Sobald ich eine Patch-Datei habe, kann ich sie Ihnen zusenden, damit Sie sie überprüfen und optional auf Ihre alte Datei anwenden können. Einen Patch wenden Sie mit dem patch
an Befehl:
$ patch tea.md tea.patch
Zeilen wurden hinzugefügt, Zeilen wurden subtrahiert, und am Ende erhalten Sie eine Datei, die mit meiner Version identisch ist:
$ cat tea.md
Warm a teapot in the proving drawer of your oven.
Boil water.
Add tea leaves to a tea strainer.
Add strainer and water to teapot.
Steep for 6 minutes. Keep it warm with a tea cosy.
Pour tea into cup.
Optionally, add warm milk.
Es gibt keine Begrenzung, wie oft Sie eine Datei patchen können. Sie könnten meine Änderungen iterieren, einen neuen Patch generieren und mir diesen zur Überprüfung zusenden. Durch das Senden von Änderungen anstelle von Ergebnissen kann jeder Mitwirkende überprüfen, was sich geändert hat, entscheiden, was er behalten oder entfernen möchte, und den Prozess genau dokumentieren.
Installieren
Unter Linux und macOS haben Sie bereits beide diff
und patch
Befehle. Unter Windows können Sie diff
abrufen und patch
über Cygwin, oder verwenden Sie Chocolatey, um nach diffutils und patch zu suchen.
Wenn Sie jemals versucht haben, per E-Mail oder Chat an Dateien zusammenzuarbeiten, und dabei festgestellt haben, dass Sie versucht haben, zu beschreiben wo Sie eine Änderung vornehmen müssen, dann werden Sie diff
lieben und patch
. Eine sorgfältig strukturierte Datei, wie z. B. Code oder zeilenbegrenztes Markdown, lässt sich leicht unterscheiden, patchen und warten.