Was ist ein Patch in der Git-Versionskontrolle?

136

Ich bin sowohl in der Git- als auch in der Versionskontrolle neu und versuche herauszufinden, was ein Patch ist und wie er sich von den anderen Aktivitäten in Git unterscheidet.

Wann wende ich einen Patch an? Kommt es jedes Mal vor, wenn ich mich verpflichte?

Amit Erandole
quelle

Antworten:

116

In diesem Blogbeitrag können Sie sehen, wie Sie einen Patch erstellen können (Sammlung von Änderungen, die Sie kommunizieren und auf ein anderes Repo anwenden möchten).

Git Patch
(Bild aus dem Blogbeitrag 2008 " Bioruby with git: Wie würde das funktionieren? ", veröffentlicht von Jan AERTS )

Siehe auch Mit Git zu Rails beitragen als weiteres konkretes Beispiel.

Heutzutage macht es die GitHub-Pull-Anfrage wirklich einfach, Patches auf GitHub-Repos anzuwenden. Dies ist nützlich, wenn Sie kein direkter Mitwirkender sind (dh Sie haben kein Recht, direkt auf ein Repo zu pushen).
Tatsächlich hat GitHub vor kurzem " Better Pull Request Emails " eingeführt, um die Benachrichtigung über neue Patches zu verbessern.

VonC
quelle
4
Eine gute Antwort, die mir sagt, dass ein GIT-Patch nicht das ist, wonach ich suche.
RonLugge
91

Patch ist ein Unix-Programm, das Textdateien gemäß den Anweisungen in einer separaten Datei aktualisiert, die als Patch-Datei bezeichnet wird.

Mit anderen Worten kann es sich also um die Datei mit Anweisungen oder ein Programm handeln, das diese Datei verarbeitet und auf etwas anwendet.

Was ist eine Patch-Datei? Angenommen, Sie haben eine Textdatei mit 2 Zeilen:

This is line A.
This is line B, or otherwise #2.

Dann ändern Sie die erste Zeile und jetzt sieht Ihre Datei folgendermaßen aus:

This is SPARTA.
This is line B, or otherwise #2.

Wie würden Sie die Änderung des Inhalts der Datei beschreiben? Sie können sagen, dass die erste Zeile "Dies ist Zeile A." wurde durch "Dies ist SPARTA." ersetzt, oder sogar das letzte Wort "A" der ersten Zeile wurde durch ein anderes Wort "SPARTA" ersetzt. Und genau das sagt uns diff . Angenommen, ich habe zwei Versionen dieser Datei, eine mit dem Namen file1.txt und eine mit dem Namen file2.txt. Dann führe ich diff aus und erhalte Folgendes:

$ diff -u file1.txt file2.txt 
--- file1.txt   2011-11-26 11:07:03.131010360 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.

Wenn Sie eine Beschreibung der Änderungen haben, können Sie diese auf einen ursprünglichen Inhalt anwenden und einen geänderten Inhalt erhalten. Und diese Änderungen, die in einem einheitlichen Format vorliegen, das "Patch" -ähnliche Programme verstehen können, werden als Patch-Datei bezeichnet. Es ist so, als würde man keinen Fisch von jemandem bekommen, der Ihnen das Fischen beibringt, damit Sie diesen Fisch selbst aus dem Wasser graben können. Wenden wir nun unseren Patch auf file1.txt an, damit er genau wie file2.txt aussieht:

$ cat file1.txt 
This is line A.
This is line B, or otherwise #2.
$ cat file2.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ diff -u file1.txt file2.txt > changes.patch
$ cat changes.patch 
--- file1.txt   2011-11-26 11:09:38.651010370 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.
$ patch < changes.patch 
patching file file1.txt
$ cat file1.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ 

Sie denken vielleicht, dass es einfacher ist, nur zwei Versionen dieser Datei zu haben. Nun, in diesem einfachen Fall ist das wahr. Wenn Sie jedoch viele Dateien haben und diese Dateien sehr groß sind, ist es viel effizienter, ein paar Zeilen Änderungen vorzunehmen, als zwei Kopien des Ganzen.

Wenn es um Git geht, bedeutet Patch-Datei immer noch dasselbe, aber die Verwendung von Diff + Patch selbst wäre ein Albtraum. Beispielsweise müssen Sie immer zwei Versionen der Datei (oder sogar des gesamten Repositorys) auschecken lassen, um sie vergleichen zu können. Klingt nicht so gut, oder? Git kümmert sich also um die ganze harte Arbeit für Sie - es vergleicht Ihre lokale Datei mit dem, was sich in dem Repository befindet, mit dem Sie arbeiten, und kann es Ihnen als "Diff" anzeigen oder dieses "Diff" als "Diff" anwenden Patch aka Übernehmen Sie Ihre Änderungen oder lassen Sie sogar eine Patch-Datei anwenden, die Sie bereits haben. In diesem Sinne ist Git absolut dasselbe wie andere Versionskontrollsysteme wie SVN oder sogar CVS oder Perforce.

Ich hoffe es hilft!


quelle
Ich wusste nie, dass Git das eingebaute patchProgramm verwendet. Ich dachte, Git hätte eine eigene Implementierung.
Radiantshaw
43

Ein Patch ist eine kleine Datei, die die in einem Repository vorgenommenen Änderungen angibt. Es wird im Allgemeinen verwendet, wenn jemand von außerhalb Ihres Teams nur Lesezugriff hat, aber eine gute Codeänderung verfügbar war. Dann erstellt er einen Patch und sendet ihn an Sie. Sie wenden es an und verschieben es in das Git-Repository. Jeder profitiert dann von der aktualisierten Version, und der Autor des Patches benötigte keinen Lese- / Schreibzugriff.

Es ist wirklich hauptsächlich eine Sicherheitssache (zumindest benutzen die Leute das dafür).

Tom van der Woerdt
quelle
1
Zusätzliche Informationen: Während git keine internen Patches verwendet, besteht ein Entwurfsziel für git darin, den Austausch von Patches zu vereinfachen (da viele Projekte auf diese Weise funktionieren, z. B. Linux und git selbst). Git verfügt daher über spezielle Befehle zum Behandeln von Patches ( git diffzeigt Änderungen standardmäßig als Patches an, git applyermöglicht das Anwenden eines Patches usw.).
Sleske
Herzlichen Glückwunsch! Sie haben es wirklich verstanden, wofür Patches verwendet werden, dh, um Änderungen an Repositorys zu senden, auf die der Autor der Änderungen keinen Schreibzugriff hat. Daher ist das Fork and Pull-Anforderungsmodell von GitHub ein Ersatz für das Patch-Modell der Änderungsverteilung. Daher glaube ich, dass Patches nur außerhalb des Kontexts von Tools wie GitHub nützlich sind.
mljrg
8

Eine Patch-Datei stellt einen einzelnen Satz von Änderungen dar, die in beliebiger Reihenfolge auf jeden Zweig angewendet werden können. Durch die Verwendung von Patch erhalten Sie Unterschiede zwischen einer oder mehreren Dateien. Und später können Sie die Unterschiede (Patch) anwenden, um die Änderungen an neuen Dateien zu erhalten. Es gibt viele Verwendungsmöglichkeiten für einen Patch in Git. Wenn Sie nicht festgeschriebene Änderungen in Ihrem Arbeitsverzeichnis haben und diese Änderungen an einer anderen Stelle anwenden müssen, erstellen Sie einfach einen Patch und wenden Sie den Patch an.

git diff > mypatch.patch

Wenn Sie neue Dateien in Ihrem Repository haben (nicht verfolgt), sollten Sie die Datei vor dem Erstellen eines Patches bereitstellen (nicht festschreiben) und den folgenden Befehl verwenden

git diff --cached > mypatch.patch 

Sie können den Patch später anwenden:

git apply mypatch.patch

Wenn Sie einige Änderungen an einem Git-Repository vornehmen möchten, für das Sie keine Schreibberechtigung haben, nehmen Sie einfach die Änderungen vor und erstellen Sie einen Patch zwischen beiden. Senden Sie den Patch auf diese Weise an jemanden, der die Berechtigung zum Anwenden des Patches hat Ihre Änderungen sollten zu diesem Git-Repository hinzugefügt werden.

Anuraj
quelle
Bessere Demos: robots.thoughtbot.com/… . Meine grundlegende Beispielzusammenfassung: git format-patch <base_commit_or_branch_name>= Packen Sie alle Commits von jetzt an zurück zu <base_commit_or_branch_name> in nette und übersichtliche Dateien, die die Diff- und Commit-Nachrichten enthalten, damit Sie sie einfach (z. B. per E-Mail) an eine andere Person senden können, die sie patchen möchte ihre Codebasis. Dann patcht der Empfänger sein System mit Ihrer Datei:cat *.patch | git am
Gabriel Staples
7

Ein Patch besteht aus einer Reihe von Unterschieden zwischen einer oder mehreren Dateien, um zu zeigen, was zwischen ihnen unterschiedlich ist. Normalerweise generieren Sie nur einen Patch, um jemandem zu zeigen, was Sie geändert haben. Ein Beispiel dafür, wann Sie dies tun könnten, ist, wenn Sie einen Fehler in einer Open Source-Anwendung finden und beheben und den Fix dann auf ihrem Bug-Tracker veröffentlichen.

Steve Rukuts
quelle