2013-04-24 12 views
85

Sono su Windows.Quando si applica una patch esiste un modo per risolvere i conflitti?

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

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

Durante la ristrutturazione, faccio semplicemente clic con il pulsante destro del mouse sulla cartella e uso tortioseGit e selezionare l'opzione di risoluzione. Questo fa apparire un bel gui per farmi lavorare attraverso i miei conflitti.

C'è un modo per farlo con blocchi di patch rifiutati?

Ecco il mio approccio attuale alla creazione/applicare le patch

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

faccio di solito a mano quando tutte le opzioni patch falliscono ... – stdcall

+0

Se l'unione non riesce, è perché il programma non riesce a capire come unire ambiguamente l'unione. Dovresti ottenere un file con <<<<, ===, > >>> set e devi entrare e risolverli a mano. – tacaswell

+0

Sì, farlo a mano è una vera pita quando parli di un paio di pezzi da 100 rej. – Kenoyer130

risposta

151

per generare la patch di effettuare le seguenti operazioni:

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

Ora, quando si è pronti ad applicare le patch:

git am -3 < changes.patch 

il -3 farà una a tre vie si fondono in caso di conflitti. A questo punto puoi fare un git mergetool se vuoi andare a un gui o semplicemente unire manualmente i file usando vim (la risoluzione standard <<<<<<, ||||||, >>>>>>).

+0

Non sapevo della notazione '...'; è documentato nella pagina man [gitrevisions (7)] (https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html). –

+0

Ci sono sicuramente molti modi per ottenere i commit che vuoi e nient'altro ... Detto ciò, quello che stavo cercando di trasmettere non è quello che ho effettivamente detto ... Ora è fissato per significare davvero quello che volevo .. . (o così penso ...) ... – g19fanatic

+2

Potrebbe essere utile aggiungere '--ignore -whitespace --ignore-space-change' a' git am'. Ho avuto fusioni insignificanti che non sono passate senza. – angularsen

2

TortoiseGit ha una funzione di unione in grado di aprire file di patch.

C'è una sua foto here.

+0

In realtà l'opzione di unione potrebbe essere ciò che sono cercando. – Kenoyer130

+0

NM non ha modo di importare un file patch ... – Kenoyer130

+0

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

7

Se si verificano spesso lo stesso conflitto durante l'applicazione di patch, rebasing o unione, è possibile utilizzare la funzione git rerere (riutilizzo della risoluzione registrata). Ciò ti consente di pre-definire come i conflitti dovrebbero essere risolti in base a come li hai risolti in passato. Vedi http://git-scm.com/blog/2010/03/08/rerere.html per dettagli su come funziona.

0

Il mio approccio è:

  • Creare un "integrazione" -Branch dove i file sono identici
  • applicare la patch per questa integrazione-Branch
  • Merge o REBASE al master (non sapere se rebase è utile qui, perché non so cosa succederà quando si applicano ulteriori patch)
Problemi correlati