Quando si applica una patch, esiste un modo per risolvere i conflitti?


124

Sono su Windows.

Per vari motivi abbiamo più istanze git di diversi rami svn.

Molte volte voglio risolvere un problema nel repository A, generare una patch e applicarla al repository B. Funziona bene tranne in caso di conflitti.

Durante il rebase faccio clic con il pulsante destro del mouse sulla cartella e uso tortioseGit e seleziono l'opzione di risoluzione. Questo fa apparire una bella interfaccia grafica che mi permette di lavorare sui miei conflitti.

Esiste un modo per ottenere ciò con blocchi di patch rifiutati?

Ecco il mio attuale approccio alla creazione / applicazione delle patch

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch

3
Di solito lo faccio a mano quando tutte le opzioni di patch falliscono ...
stdcall

Se l'unione fallisce, è perché il programma non riesce a capire come eseguire l'unione in modo non ambiguo. Dovresti ottenere un file con <<<<, ===, >>>> set e devi entrare e risolverli a mano.
tacaswell

Sì, farlo a mano è una vera pita quando parli di qualche 100 rej hunk.
Kenoyer130

È allora che vorresti usare git mergetoole fare un'unione a 3 vie con la GUi di tua scelta (sono parziale con kdiff su Windows) ...
g19fanatic

Risposte:


254

Per generare la tua patch fai quanto segue:

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

Quando sei pronto per applicare le patch:

git am -3 < changes.patch

la -3farà una fusione a tre vie in caso di conflitti. A questo punto si può fare un git mergetoolse si vuole andare in una GUI o solo manualmente unire i file usando vim (lo standard <<<<<<, ||||||, >>>>>>risoluzione dei conflitti).


3
Può essere utile aggiungere --ignore-whitespace --ignore-space-changeal git amtroppo. Ho avuto fusioni banali che non sono andate avanti senza di essa.
angularsen

12
git apply -3 changes.patchsembra funzionare anche per me
peterflynn

1
Anche se la patch non si applica in modo pulito ottengo ancora "Nessun file da unire" da git mergetool. Invece ho dovuto trovare il commit di base della patch originale usata, applicarla sopra (fortunatamente il mio repository lo aveva) e poi rebase.
jozxyqk

4
Ho lo stesso problema di @jozxyqk. Né git am -3git apply -3lascerà effettivamente i marcatori di conflitto nei miei file, anche se ricevo messaggi come Applied patch to 'configure.ac' with conflicts.e error: patch failed: .... Questo è acceso git 2.17.1. Forse quando alcuni file non possono essere riparati affatto, git torna indietro?
nh2

1
Ho lo stesso problema di @ nh2, hai mai trovato il problema?
Eridanis

12

Se ti imbatti spesso nello stesso set di conflitti quando applichi patch, rebasing o unisci, puoi usare la funzione git rerere (riutilizza la risoluzione registrata). Ciò consente di pre-definire come risolvere i conflitti in base a come li hai risolti in passato. Vedi http://git-scm.com/blog/2010/03/08/rerere.html per i dettagli su come funziona.


5

TortoiseGit ha una funzione di unione che può aprire i file di patch.

Ce n'è una foto qui .


In realtà l'opzione di unione potrebbe essere quello che sto cercando.
Kenoyer130

Veramente? Non uso la tartaruga da molto tempo, ma la pagina collegata ha il testo "TortoiseMerge può aprire direttamente il file di patch Git, lo rivedi e applica la patch alla copia funzionante.", Quindi sembra che dovrebbe!
AMS

apre i file di patch ... tuttavia, a volte il formato del file di patch interrompe il tortoisegitmerge. non ho mai avuto successo con diff -u, ma piuttosto diff -c output.
thistleknot

Puoi anche trascinare con il tasto destro le patch su una cartella dell'albero di lavoro e selezionare "Applica patch seriale" (per patch come 0001-xxx.patch, ... 0002-xxy.patch) o "Applica file patch singolo".
MrTux

2

Il mio approccio è:

  • Crea un ramo di "integrazione" in cui i file sono identici
  • Applicare la patch a questo ramo di integrazione
  • Uniscilo o rebase per master (non so se rebase è utile qui, perché non so cosa succederà quando applicherò ulteriori patch)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.