2014-09-02 14 views
6

Come sviluppatore su PHP-src Recentemente mi trovo nella seguente situazione:Rebase su modifiche a monte con merge non banale, commette presenti localmente

A B C 
o---o---o   version1 
     \ 
o---o-----o---o master 
x y  D E 

o---o---o   upstream/master 
x y z 

Così, quando faccio git push --dry-run upstream master version1 ottengo il tipico:

! [rejected]  master -> master (fetch first) 

la mia risposta naturale è quello di rebase il ramo colpiti e preservare la fusione impegna:

git fetch upstream 
git rebase -p upstream/master 

È importante notare che il commit unione originale non era banale, perché ci sono così tante modifiche tra il ramo della versione e il master; ci vuole uno sforzo per risolvere una simile fusione.

Eseguire l'operazione di rebase sopra causa un conflitto di merge e devo risolverlo di nuovo; questo è quasi esattamente lo stesso lavoro che avevo già fatto.

C'è un modo migliore per farlo? O ho dimenticato un'opzione ovvia di rebase?

+0

Avete * avere * per ribattere? Di solito ho anche rebase, ma sono stato anche nella tua situazione in cui non era fattibile e ho seguito una fusione standard. – musiKk

+0

Certo, posso semplicemente premere 'D, E, M (z)' invece di 'D ', E'' ma preferisco mantenere la storia il più pulito possibile :) –

+1

Ti sento. Dipende dal tuo caso. Ho lavorato su fusioni che hanno richiesto ore. Il mio amore per una storia pulita va solo lontano. :) – musiKk

risposta

3

Idealmente si sarebbe "riutilizzare la risoluzione registrata" con rerere:

In un flusso di lavoro che impiegano argomento rami relativamente lungo vissuto, lo sviluppatore a volte ha bisogno di risolvere gli stessi conflitti più e più volte fino a quando i rami argomento sono fatto o fuso al ramo "di rilascio", o inviato e accettato a monte).

Questo comando assiste lo sviluppatore in questo processo registrando i risultati dell'integrergenza in conflitto e i corrispondenti risultati di risoluzione delle mani sull'unione manuale iniziale e applicando le risoluzioni della mano registrate in precedenza ai relativi risultati di automazione.

Purtroppo, questa funzione deve essere attivata prima di prima di fare l'unione:

Nota: È necessario impostare la variabile di configurazione rerere.enabled al fine di consentire questo comando.

Per quanto ne so, non esiste una scorciatoia per fare qualcosa di simile dopo il fatto. Vi consiglio consentendo rerere a livello globale e poi rifare l'unione:

git config --global rerere.enabled true 

In futuro, questa impostazione potrebbe risparmiare un sacco di tempo!

+0

I * penso * questo potrebbe essere esattamente quello di cui ho bisogno, bella scoperta! :) –

+2

La scorciatoia per abilitare retroattivamente qui rerere dovrebbe essere semplicemente 'git config rerere.enabled true; git checkout y; git merge -s ours --no-commit C; git read-tree -um HEAD D; git commit; git checkout master'. – jthill

+0

@jthill che non mi sembra semplice, ma se funziona, sarebbe una bella aggiunta a questa risposta oa una separata :) –

Problemi correlati