Gibt es beim Anwenden eines Patches eine Möglichkeit, Konflikte zu lösen?

123

Ich bin an Fenstern.

Aus verschiedenen Gründen haben wir mehrere Git-Instanzen verschiedener SVN-Zweige.

Oft möchte ich ein Problem in Repository A beheben, einen Patch generieren und auf Repository B anwenden. Dies funktioniert einwandfrei, außer wenn Konflikte vorliegen.

Beim erneuten Basieren klicke ich einfach mit der rechten Maustaste auf den Ordner, verwende tortioseGit und wähle die Auflösungsoption. Dies bringt eine nette GUI hervor, mit der ich meine Konflikte durcharbeiten kann.

Gibt es eine Möglichkeit, dies mit abgelehnten Patch-Chunks zu erreichen?

Hier ist mein aktueller Ansatz zum Erstellen / Anwenden der Patches

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch
Kenoyer130
quelle
3
Ich mache es normalerweise von Hand, wenn alle Patch-Optionen fehlschlagen ...
stdcall
Wenn die Zusammenführung fehlschlägt, kann das Programm nicht herausfinden, wie die Zusammenführung eindeutig ausgeführt werden kann. Sie sollten eine Datei mit <<<<, ===, >>>> Sätzen erhalten und diese von Hand auflösen.
Tacaswell
Ja, es von Hand zu machen ist eine echte Pita, wenn man ein paar 100 Rej Hunks spricht.
Kenoyer130
Dann möchten git mergetoolSie eine 3-Wege-Zusammenführung mit der GUI Ihrer Wahl verwenden und durchführen (ich bin teilweise an kdiff unter Windows interessiert) ...
g19fanatic

Antworten:

253

Gehen Sie wie folgt vor, um Ihren Patch zu generieren:

git format-patch --stdout first_commit^..last_commit > changes.patch

Wenn Sie nun bereit sind, die Patches anzuwenden:

git am -3 < changes.patch

Bei -3Konflikten wird eine Drei-Wege-Zusammenführung durchgeführt. An dieser Stelle können Sie tun , git mergetoolwenn Sie eine gui gehen wollen fusionieren oder nur die Dateien manuell vim (der Standard <<<<<<, ||||||, >>>>>>Konfliktlösung).

g19fanatic
quelle
3
Es kann nützlich sein , um hinzuzufügen , --ignore-whitespace --ignore-space-changeum git amzu. Ich hatte triviale Zusammenschlüsse, die ohne sie nicht zustande kamen.
Angularsen
12
git apply -3 changes.patchscheint auch für mich zu funktionieren
Peterflynn
1
Auch wenn der Patch nicht sauber angewendet wird, wird immer noch "Keine Dateien müssen zusammengeführt werden" angezeigt git mergetool. Stattdessen musste ich die Basis finden, die den ursprünglich verwendeten Patch festschrieb, darüber hinaus anwenden (zum Glück hatte mein Repo dies) und dann neu starten.
jozxyqk
4
Ich habe das gleiche Problem wie @jozxyqk. Weder git am -3noch git apply -3werden tatsächlich Konfliktmarkierungen in meine Dateien eingefügt, obwohl ich Nachrichten wie Applied patch to 'configure.ac' with conflicts.und erhalte error: patch failed: .... Das ist an git 2.17.1. Vielleicht, wenn einige Dateien überhaupt nicht gepatcht werden können, rollt git zurück?
nh2
1
Ich habe das gleiche Problem wie @ nh2. Haben Sie das Problem jemals gefunden?
Eridanis
11

Wenn Sie beim Anwenden von Patches, erneuten Basieren oder Zusammenführen häufig auf denselben Konfliktsatz stoßen, können Sie die Funktion git rerere (Wiederverwendung der aufgezeichneten Auflösung) verwenden. Auf diese Weise können Sie vorab festlegen, wie Konflikte gelöst werden sollen, basierend darauf, wie Sie sie in der Vergangenheit gelöst haben. Weitere Informationen zur Funktionsweise finden Sie unter http://git-scm.com/blog/2010/03/08/rerere.html .

mplf
quelle
3

TortoiseGit verfügt über eine Zusammenführungsfunktion, mit der Patch-Dateien geöffnet werden können.

Es gibt ein Bild davon hier .

ams
quelle
Eigentlich könnte die Zusammenführungsoption das sein, wonach ich suche.
Kenoyer130
"Ja wirklich?" Ich habe lange Zeit keine Schildkröte mehr verwendet, aber die verlinkte Seite enthält den Text "TortoiseMerge kann die Git-Patch-Datei direkt öffnen, Sie überprüfen sie und patchen sie auf eine Arbeitskopie.", So wie es scheint!
Ams
Es öffnet Patch-Dateien ... manchmal bricht das Patch-Dateiformat jedoch Tortoisegitmerge. Ich war noch nie erfolgreich mit Diff -u, sondern mit Diff-C-Ausgabe.
Distelknoten
Sie können Patches auch mit der rechten Maustaste in einen Arbeitsbaumordner ziehen und "Patch seriell anwenden" (für Patches wie 0001-xxx.patch, ... 0002-xxy.patch) oder "Einzelne Patch-Datei anwenden" auswählen.
MrTux
1

Mein Ansatz ist:

  • Erstellen Sie eine "Integration" -Zweig, bei der die Dateien identisch sind
  • Wenden Sie den Patch auf diesen Integrationszweig an
  • Füge es zum Master zusammen oder stelle es neu her (ich weiß nicht, ob Rebase hier nützlich ist, da ich nicht weiß, was beim Anwenden weiterer Patches passieren wird).
MichiBack
quelle