Warum diff / patch verwenden, wenn es einfacher ist, nur cp zu verwenden?


19
diff -u file1.txt file2.txt > patchfile

patchErstellt eine Patch-Datei, die aus einer Anweisung besteht , die Datei1.txt so zu konvertieren, dass sie genau der Datei2.txt entspricht

Kann dies nicht cpstattdessen mit dem Befehl erfolgen? Ich kann mir vorstellen, dass dies nützlich ist, wenn die Datei zu groß ist und über ein Netzwerk übertragen werden muss, in dem dieser Ansatz möglicherweise Bandbreite spart. Gibt es eine andere Möglichkeit, diff / patch zu verwenden, die in anderen Szenarien vorteilhaft wäre?

Antworten:


31

Diffs können komplizierter sein, als nur eine Datei mit einer anderen zu vergleichen. Sie können ganze Verzeichnishierarchien vergleichen. Betrachten Sie das Beispiel, mit dem ich einen Fehler in GCC beheben möchte. Meine Änderung fügt eine oder zwei Zeilen in 4 oder 5 Dateien hinzu und löscht eine Handvoll Zeilen in diesen und anderen Dateien. Wenn ich diese Änderungen jemandem mitteilen möchte, sind meine Optionen möglicherweise für die Aufnahme in GCC

  • Kopieren Sie den gesamten Quelltextbaum
  • Kopieren Sie nur die Dateien, die geändert wurden
  • Geben Sie nur die Änderungen an, die ich vorgenommen habe

Das Kopieren des gesamten Quellbaums ist nicht sinnvoll, aber was ist mit den beiden anderen Optionen, die den Kern Ihrer Frage ausmachen? Bedenken Sie nun, dass jemand anderes an der gleichen Datei gearbeitet hat wie ich und wir beide unsere Änderungen an jemanden weitergeben. Woher weiß diese Person, was wir getan haben und ob die Änderungen kompatibel sind (verschiedene Teile der Datei) oder in Konflikt stehen (gleiche Zeilen der Datei)? Er wird sie diffamieren! Der Diff kann ihm sagen, wie sich die Dateien voneinander und von der unveränderten Quelldatei unterscheiden. Wenn das Diff das ist, was benötigt wird, ist es sinnvoller, das Diff an erster Stelle zu senden. Ein Diff kann auch Änderungen von mehr als einer Datei enthalten. Während ich also insgesamt 9 Dateien bearbeitet habe, kann ich eine einzige Diff-Datei bereitstellen, um diese Änderungen zu beschreiben.

Diffs können auch zum Bereitstellen des Verlaufs verwendet werden. Was ist, wenn eine Änderung vor drei Monaten einen Fehler verursacht hat, den ich erst heute entdeckt habe? Wenn ich den Fehler eingrenzen und ihn auf eine bestimmte Änderung eingrenzen kann, kann ich mit dem Diff die Änderung rückgängig machen oder rückgängig machen. Dies könnte ich nicht so einfach tun, wenn ich nur Dateien kopiere.

Dies alles hängt mit der Versionskontrolle zusammen, bei der Programme den Dateiverlauf als eine Reihe von Unterschieden von der Zeit ihrer Erstellung bis heute aufzeichnen können. Die Diffs liefern einen Verlauf (ich kann die Datei wie an einem bestimmten Tag neu erstellen), ich kann sehen, wen ich für das Brechen von etwas verantwortlich mache (der Diff hat einen Besitzer) und ich kann Änderungen an vorgelagerten Projekten einfach übermitteln, indem ich ihnen spezifische Diffs gebe ( Vielleicht interessieren sie sich nur für eine Änderung, wenn ich viele vorgenommen habe.

Zusammenfassend ist ja cpeinfacher als diffund patch, aber der Nutzen von diffund patchist größer als cpin Situationen, in denen es wichtig ist, zu verfolgen, wie sich Dateien ändern.


Tatsächlich speichert git den Dateiversionsverlauf nicht wirklich als Unterschiede zu nachfolgenden Commits. Für jedes Commit wird der Inhalt jeder Datei gespeichert (siehe "git show -s --pretty = raw" und "git ls-tree HEAD"). Auf dieser Ebene werden dann, da viele Dateien in unterschiedlichen Commits ähnlich sind, Delta-Komprimierungen verwendet, um Daten zwischen Dateien auszutauschen (dies ist jedoch nicht an den Verlauf gebunden).
ysdx

Die Diffs sind jedoch ein praktisches Visualisierungswerkzeug für diese Geschichte.
ysdx

20

Wenn Sie einen Patch erhalten, können Sie den Patch häufig (sofern Sie nicht genau dieselben Zeilen geändert haben) auch auf eine Reihe von Dateien anwenden, die Sie selbst geändert haben.

Der Patch enthält Informationen zum alten und zum neuen Status der Dateien. Wenn Sie eine kopierte Datei erhalten, wissen Sie nicht, wie das Original lautete (der alte Zustand), und Sie können die Unterschiede nicht ohne große Schwierigkeiten auf eine Datei (oder eine Reihe von Dateien) anwenden, die Sie ebenfalls geändert haben. Bei Sätzen von Quelldateien ist also nicht die Speicherplatzerhaltung von größter Bedeutung, sondern die Vorher-Nachher-Information.

Früher (context / unified) wurde dies häufig mit Anweisungen für Editoren durchgeführt (Einfügen einer Zeile nach X, Löschen von Zeile Y), aber das würde nur funktionieren, wenn Sie den Status kennen, von dem diese Anweisung ausgeht. Habe also das gleiche Problem wie deine "Lösung" nur beim Kopieren.


2
Mit Patch-Dateien können Sie sie auch rückgängig machen und auf mehrere Dateien gleichzeitig
anwenden

Tatsächlich sind Unified Diffs ( diff -u) eine Verbesserung für den Menschen. Sie tragen diff -cmeiner Meinung nach nicht zur Robustheit gegenüber Konflikten über reguläre Kontext-Diffs ( ) bei. Sogar plain diffs ( diff) funktionieren noch oft, ohne genau zu wissen, von welchem "Zustand diese Anweisung ausgegangen ist ". Trotzdem ist dies besser als die akzeptierte Antwort, denn darüber zu reden, wie Patch-Dateien mehrere Quelldateien gleichzeitig patchen können, ist wirklich ein roter Faden.
Celada

@celeda Sie haben Recht mit den Kontextunterschieden, zwischen diesen und normalen Unterschieden liegt der Hauptunterschied. Ohne den Kontext sind Patches viel schwieriger, wenn überhaupt, in umgekehrter Reihenfolge anzuwenden.
Anthon

12

Wenn Sie diff verwenden, können Sie sehen, was sich genau geändert hat. Mit diff / patch können Sie also verhindern, dass jemand unerwünschte Änderungen in der Datei vornimmt.


11

Die an den Dateien vorgenommenen Änderungen sind normalerweise viel kleiner als die geänderten Dateien.

Das bedeutet, dass Sie viel Platz sparen können, wenn Sie ein Diff speichern. Bei diffder Erstellung war der Speicherplatz teuer.

Es bedeutet aber auch, dass Sie ein Diff erneut auf eine Datei anwenden können, auch wenn sich diese Datei auf andere Weise geändert hat. Das Patch- Dienstprogramm erledigt das für Sie und teilt Ihnen mit, wenn Probleme auftreten.

Dies ist in der Tat der wichtigste Grund, mit Unterschieden in der Softwareentwicklung zu arbeiten. Wenn eine Änderung vorgenommen wurde (normalerweise an mehr als einer Datei), kann sie als Diff gespeichert werden: Das Ergebnis wird als Änderungssatz oder Patch bezeichnet . Wenn alles in Ordnung ist, handelt es sich bei dem Patch nicht nur um eine willkürliche Änderung, sondern um eine funktionale Änderung, z. B. eine Fehlerbehebung oder eine neue Funktion.

In der Zwischenzeit kann eine andere Änderung vorgenommen werden, möglicherweise von einem anderen Entwickler, auch an einem anderen Ort. Wenn die Änderungen nicht an denselben Teilen derselben Dateien vorgenommen wurden, können sie unabhängig voneinander angewendet werden. So können sich die Entwickler gegenseitig ihre Patches zum Testen zusenden. Es können eine ganze Reihe von Patches erstellt werden, die mögliche Änderungen darstellen. Einige davon können letztendlich abgelehnt werden, der Rest wird in das System integriert.

Die Arbeit mit Diffs ermöglicht also die gleichzeitige Entwicklung. Sie müssen nicht mehr an einem Wechsel gleichzeitig arbeiten.

Moderne verteilte Versionskontrollsysteme setzen diese Arbeitsweise fort.


1

Kurz gesagt, es kann. Wenn Sie sich einige Thinkg Big Larry Wall-Videos auf YouTube ansehen, spricht er darüber, wie Diff / Patch gestartet wurde und welche Probleme sie lösten. Im Wesentlichen ging es darum, die Größe für die Kommunikation über das Internet zu reduzieren und die Patches flexibel und für Menschen lesbar zu halten .

Wenn Sie sich auf einem lokalen System befinden und sich nicht für eines dieser Dinge interessieren, dann cpoder rsyncsind Sie in Ordnung.


Danke PSKocik. Könntest du bitte den Link zu diesem Video teilen?
toddlermenot

Ich bin mit der letzten Aussage nicht einverstanden. Heutzutage geht es nicht mehr um Größe, sondern darum, Ihren Entwicklungsprozess zu verfolgen, um die Verwaltung zu vereinfachen.
Reinierpost

@reinierpost benutze git um meinen Entwicklungsprozess zu verfolgen. Ich kann nicht direkt diff-patchen.
PSkocik
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.