Heim  >  Artikel  >  php教程  >  Gits Patch-Funktion

Gits Patch-Funktion

黄舟
黄舟Original
2016-12-13 14:16:441278Durchsuche

Normale Entwickler klonen den Code aus dem Software-Repository, schreiben dann den Code, erstellen einen Patch und senden ihn schließlich per E-Mail an Linux Der Betreuer des Kernels wäre nett. Git wurde ursprünglich als Linux-Versionskontrolltool verwendet und bietet transparente, vollständige und stabile Patch-Funktionen.

Lassen Sie uns zunächst vorstellen, was Patch ist. Wenn eine Software eine neue Version hat, können wir die neue Version des Codes zur Kompilierung und Installation vollständig herunterladen. Allerdings wie Linux Bei einem großen Projekt wie Kernel ist der Code, selbst wenn er komprimiert ist, größer als 70 MB. Jeder neue Download ist ziemlich kostspielig. Allerdings darf jedes Update nicht mehr als 1 MB Code ändern, daher nur Um Diff-Daten von zwei Versionen des Codes zu erhalten, sollte es möglich sein, das Programm zu sehr geringen Kosten zu aktualisieren. Deshalb, Larry Wall hat ein Tool entwickelt: Patch. Es kann Versionsaktualisierungen basierend auf einer Diff-Datei durchführen.

In Git müssen wir Diff und Patch jedoch nicht direkt verwenden, um Patches zu erstellen. Git bietet zwei einfache Patch-Lösungen. Eine besteht darin, Git zu verwenden Der von diff generierte Standard-Patch und der zweite ist der von git format-patch generierte Git-spezifische Patch.

1. Von Git Diff generierter Standard-Patch

Wir können zuerst einen Patch mit Git Diff erstellen. Im Arbeitsverzeichnis des Beispiels in diesem Artikel befindet sich zunächst eine Datei a, und der Inhalt lautet „Dies ist die Datei a.“ im Hauptzweig platziert. Um den Code zu ändern, besteht unser allgemeiner Ansatz darin, einen neuen Zweig zu erstellen:

sweetdum@sweetdum-ASUS:~/GitEx$ git branch Fix
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout Fix
Zum Zweig gewechselt 'Fix'

Als nächstes hängen wir eine Zeile an Datei a an und führen dann git diff aus.
sweetdum@sweetdum-ASUS:~/GitEx$ echo 'Fix!!!'>>a
sweetdum@sweetdum-ASUS:~/GitEx$ git diff
diff --git a/a b/a
index 4add65f..0d295ac 100644
--- a/a
+++ b/a
@@ -1 +1,2 @@
Dies ist die Datei a.
+Fix!!!

Wir haben Git gesehen Die Ausgabe von Diff ist ein sehr typisches Patch-Diff. Auf diese Weise können wir diese Ausgabe direkt in einen Patch umwandeln:
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m "Fix"
[Fix b88c46b] Fix
1 Dateien geändert, 1 Einfügungen(+), 0 Löschungen(-)
sweetdum@sweetdum-ASUS:~/GitEx$ git diff master > Patch
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout master
Umgestellt auf branch 'master'

Wir haben jetzt eine Patch-Datei und haben den Master ausgecheckt. Als nächstes können wir Git verwenden Bewerben Sie sich, um diesen Patch anzuwenden. Natürlich werden wir in tatsächlichen Anwendungen keinen Patch in einem Zweig erstellen und ihn in einem anderen Zweig anwenden, da wir ihn nur zusammenführen müssen. Wir sind jetzt Es gibt keinen solchen Fix-Zweig. Unter normalen Umständen richten wir zum Schutz des Masters einen Zweig speziell für die Verarbeitung neu übermittelter Patches ein:

sweetdum@sweetdum-ASUS:~/GitEx$ git branch PATCH
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout PATCH
Gewechselt zu branch 'PATCH'
sweetdum@sweetdum-ASUS:~/GitEx$ git apply patch
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m "Patch Anwenden“
[PATCH 9740af8] Patch anwenden
1 Dateien geändert, 1 Einfügungen (+), 0 Löschungen(-)

Schauen Sie, jetzt haben wir diesen Patch im PATCH-Zweig angewendet. Wir können den PATCH-Zweig mit dem Fix-Zweig vergleichen. Das Ergebnis ist definitiv nichts, was darauf hinweist, dass der PATCH-Zweig und der Fix-Zweig vorhanden sind genau das gleiche. Der Patch wurde erfolgreich angewendet. Auch wenn mehrere Dateien vorhanden sind, git diff kann auch einen Patch generieren.

2.git-spezifischer Patch, der von git format-patch generiert wird.

Wir verwenden auch das Arbeitsverzeichnis des obigen Beispiels, nachdem wir im Fix-Zweig eine neue Zeile hinzugefügt haben format-patch generiert einen Patch.
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout Fix
Zum Zweig „Fix“ gewechselt
sweetdum@sweetdum-ASUS:~/GitEx$ echo 'Fix!!!'>>a
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m „Fix1“
[Fix 6991743] Fix1
1 Dateien geändert, 1 Einfügungen (+), 0 Löschungen(-)
sweetdum@sweetdum-ASUS:~/GitEx$ git format-patch -M master
0001-Fix1.patch

Die Option -M von git format-patch gibt an, dass dieser Patch mit diesem Zweig verglichen werden sollte. Jetzt wird eine Patch-Datei generiert, mal sehen, was es ist:

sweetdum@sweetdum-ASUS:~/GitEx$ cat 0001-Fix1.patch
From 6991743354857c9a6909a253e859e886165b0d90 Montag, 17. September 00:00:00 2001
Von: Süße Knödel
Datum: Mo, 29. August 2011 14:06:12 +0800
Betreff: [PATCH] Fix1

---
a |. 1 +
1 Dateien geändert, 1 Einfügungen(+), 0 Löschungen(-)

diff --git a/a b/a
index 4add65f..0d295ac 100644
--- a/a
+++ b/a
@@ -1 +1,2 @@
Dies ist die Datei a.
+Fix!!!
--
1.7.4.1

Schauen Sie, dieses Mal gibt es noch viel mehr Dinge, nicht nur die Diff-Informationen, sondern auch den Einreicher, die Zeit usw. Wenn Sie genau hinschauen, werden Sie feststellen, dass es sich um eine E-Mail-Datei handelt, die Sie direkt senden können! Für diese Art von Patch müssen wir Git verwenden Ich möchte mich bewerben.

sweetdum@sweetdum-ASUS:~/GitEx$ git checkout master
Zum Zweig gewechselt 'master'
sweetdum@sweetdum-ASUS:~/GitEx$ git branch PATCH
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout PATCH
sweetdum@sweetdum-ASUS:~/GitEx$ git am 0001-Fix1.patch
Anwenden: Fix1
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m "PATCH apply"

Nach dem Absenden des Patches können wir einen Blick auf die aktuelle Situation der Datei a werfen:

sweetdum@sweetdum-ASUS:~/GitEx$ cat a
Dies ist die Datei a.
Fix!!!

Natürlich gibt es noch einen Fix!!!

Es ist jedoch zu beachten, dass bei mehreren Übermittlungen zwischen dem Master- und dem Fix-Zweig ein Patch für jede Übermittlung generiert wird.

3. Vergleich der beiden Patches:

Kompatibilität: Offensichtlich weist der von git diff generierte Patch eine starke Kompatibilität auf. Wenn das offizielle Repository des Codes, den Sie ändern, kein von Git verwaltetes Repository ist, müssen Sie Git verwenden Der von diff generierte Patch kann dafür sorgen, dass Ihr Code vom Projektbetreuer akzeptiert wird.

Debugging-Funktion: Für den von git diff generierten Patch können Sie git apply --check verwenden, um zu sehen, ob der Patch sauber und reibungslos auf den aktuellen Zweig angewendet werden kann, wenn git Der von format-patch generierte Patch kann nicht auf den aktuellen Zweig angewendet werden. Git am gibt eine Eingabeaufforderung aus und unterstützt Sie beim Abschließen der Patch-Arbeit -3 Führen Sie eine Drei-Parteien-Zusammenführung durch. Detaillierte Methoden finden Sie im Git-Handbuch oder in „Progit“. Unter diesem Gesichtspunkt sind beide Debugging-Funktionen sehr stark.

Repository-Informationen: aufgrund von Git Der von format-patch generierte Patch enthält den Namen des Patch-Entwicklers. Wenn der Patch angewendet wird, wird dieser Name natürlich im Repository aufgezeichnet. Daher empfehlen Open-Source-Communities, die derzeit Git verwenden, häufig, dass jeder Format-Patch zum Generieren von Patches verwendet.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn