Wie wende ich einen mit git format-patch generierten Patch an?


221

Ich habe 2 lokale Git-Repositorys, die beide auf dasselbe Remote-Repository verweisen.

git format-patch 1Wie kann ich diesen Patch in einem Git-Repository auf das andere Repository anwenden?

Antworten:


330

Hinweis: Sie können zunächst eine Vorschau der Funktionen Ihres Patches anzeigen:

Zuerst die Statistiken:

git apply --stat a_file.patch

Dann ein Trockenlauf, um Fehler zu erkennen:

git apply --check a_file.patch

Schließlich können Sie git amIhren Patch als Commit anwenden: Sie können einen angewendeten Patch abmelden.
Dies kann zum späteren Nachschlagen nützlich sein.

git am --signoff < a_file.patch 

Siehe ein Beispiel in diesem Artikel :

In Ihrem Git-Protokoll finden Sie, dass die Festschreibungsnachrichten ein "Abgemeldet von" -Tag enthalten. Dieses Tag wird von Github und anderen gelesen, um nützliche Informationen darüber zu erhalten, wie das Commit im Code gelandet ist.

Beispiel


9
Hinweis für sich selbst: 200. Great Answer Goldabzeichen.
VonC

4
git am < somepatch.patchergibt "fatal: leerer Identitätsname (für <>) nicht erlaubt". Kann mir jemand erklären warum?
Gromit190

@ gromit190 das bedeutet schlechte AuthorHeader im Patch, und / oder du hast es nicht getan git config user.{name,email}.
ulidtko

OK; git apply --checksagt patch does not applyund git apply -3sagt repository lacks the necessary blob to fall back on 3-way merge.In git ist es ein Kinderspiel, Commits neu zu gründen; Aber wie können Benutzer ihre Patches auf den aktualisierten Code zurücksetzen ?
ulidtko

1
@ulidtko Vielleicht mit stackoverflow.com/a/15375869/6309 ?
VonC

162
git apply name-of-file.patch

25
Dies hat möglicherweise nicht die ursprüngliche detaillierte Frage beantwortet, aber es hat die Frage im Titel beantwortet, weshalb ich auf dieser Seite bin. Danke!
Rock Lee

12
Ich verstehe, dass dies eine alte Frage und Antwort ist ... aber ich dachte, es könnte für einige Leute hilfreich sein, den Unterschied zwischen git apply und git am zu verstehen .
mgarey

1
git apply "[... vollständiger Pfad zur Datei ...] / name-of-file.patch"
Anton Lyhin

41

Oder, wenn Sie es in die alte Schule treten:

cd /path/to/other/repository
patch -p1 < 0001-whatever.patch

3
Nur damit Sie sich bewusst sind: Dadurch wird kein Commit erstellt, sodass Commit-Nachrichten und Autoreninformationen verloren gehen.
Caesar

22

Zuerst sollten Sie sich den Unterschied zwischen git amund notierengit apply

Wenn Sie verwenden git am, möchten Sie normalerweise viele Patches anwenden. Daher sollte verwendet werden:

git am *.patch

oder nur:

git am

Git findet Patches automatisch und wendet sie der Reihe nach an ;-)

UPD
Hier erfahren Sie, wie Sie solche Patches generieren


1
Diese Erklärung des Unterschieds half mir zu verwenden git apply.. und in --reverse:-) 👍
Jordan Gee


14

Wenn Sie eine JetBrains-IDE (wie IntelliJ IDEA, Android Studio, PyCharm) verwenden, können Sie die Patch-Datei ziehen und in die IDE ablegen. Daraufhin wird ein Dialogfeld mit dem Inhalt des Patches angezeigt. Jetzt müssen Sie nur noch auf "Patch anwenden" klicken und ein Commit wird erstellt.


1
Danke dafür. Das ist wirklich nützlich für alle. Es gibt eine akzeptierte Antwort. das ist aber auch nützlich.
Lasitha Benaragama

1
@ambarox Aber diese Antwort wurde einmal herabgestimmt, ich weiß nicht warum
ice1000

1
Vielleicht glaubt jemand, dass Patches nur über die Befehlszeile angewendet werden können. : D Ich habe dir eine Gegenstimme gegeben. Prost Kumpel.
Lasitha Benaragama

1
@ LasithaBenaragama - Art von. SO soll nicht nur dem OP helfen, sondern auch allen, die folgen. Diese Antwort ist zwar nützlich, bietet aber keine allgemeine Lösung. Dies wäre ein ausgezeichneter kleiner Blog-Beitrag, aber keine "SO gute" Antwort. Würde das Downvote erklären!
OldTinfoil

-2

Sie können das unten genannte cmd verwenden

git apply fileName.patch
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.