2009-09-17 23 views
34

Quindi, ho un ramo di manutenzione e un ramo principale nel mio progetto. Se faccio un commit nel ramo manutenzione e voglio unire in avanti al ramo principale, questo è facile:Come posso eseguire il backport di un commit in git?

git checkout master; git merge maintenance 

Ma se io voglio andare il contrario, vale a dire applicare un commit effettuato da padroneggiare di nuovo a il mio ramo di manutenzione, come faccio? Questa è considerata la ciliegina? Causa problemi o conflitti se unisco nuovamente il ramo di manutenzione?

risposta

30

Questo è esattamente il caso d'uso per git-cherry-pick

git checkout maintenance 
git cherry-pick <commit from master> 
+0

Collegamento interrotto. Hai il nuovo riferimento? Grazie – glarrain

+1

Ho recuperato con successo quel collegamento il 16 giugno 2012. – mwalling

+0

Ottimo, è tornato. Forse era solo temporaneo. Grazie a @mwalling – glarrain

0

Sì, è considerato cherry-picking e non, in genere non dovrebbe presentare problemi. Se il commit non si applica in modo pulito durante il backport, potresti trovarti ad affrontare esattamente lo stesso conflitto quando lo raccogli.

0

Come regola generale, utilizzo l'unione per spostare le modifiche "su" l'albero (da manutenzione a master) e rebase per spostarle "in basso" sull'albero (dal master alla manutenzione). In questo modo viene mantenuto l'ordine di commit nel ramo principale.

Rebase riporta sostanzialmente tutte le modifiche sul ramo corrente al fork (o all'ultima base), copia le modifiche più recenti e quindi applica nuovamente le modifiche.

Se non si desidera ottenere tutte le modifiche dal master, quindi sarà probabilmente necessario selezionare le persone che si desidera.

+2

Mi chiedevo anche su * rebase *.Ma supponendo che un ramo _maintenance_ esista in modo specifico per _non_ avere tutte le modifiche correnti, allora non è quello che vuoi. Mi sembra meglio rebase a un ramo di sviluppo, ma seleziono una correzione di bug fatta in master (o qualsiasi ramo di sviluppo upstream) per la manutenzione. –

11

soluzione alternativa per l'utilizzo di "git cherry-pick" (come consigliato in altre risposte) sarebbe quello di creare un separato [argomento] diramazione per la correzione off ramo di manutenzione, e unire questo primo ramo in ramo di manutenzione, poi in ramo principale (tronco).

Questo flusso di lavoro è (in qualche modo) descritto nel post del blog Resolving conflicts/dependencies between topic branches early da Junio ​​C Hamano, git maintainer.

Risultati di selezione delle ciliegie nel commit duplicato, che in fondo alla linea può causare problemi durante l'unione o la ridefinizione. Il flusso di lavoro basato su argomenti di branche mantiene solo una copia della correzione.

+0

Mi piace come il post collegato spiega l'aggiunta di più commit che potrebbero entrare in conflitto. Unisci la funzione A con Bug fix B insieme, prima di unire uno di essi nel ramo Master o Maintenance. In questo modo puoi assicurarti che i conflitti tra A e B siano risolti, in modo che se premi prima A o B, allora puoi facilmente inserire l'unione di A + B in seguito e sapere che è pre-unito per te. Vedi [diagramma 3 nel documento collegato] (http://gitster.livejournal.com/27297.html). –

0

Come altri hanno già affermato, la scelta delle ciliegie è probabilmente l'opzione migliore. Volevo solo aggiungere che i conflitti durante il cherry-picking possono spesso essere risolti esaminando le "dipendenze" del commit che stai selezionando e che ho creato a tool called git-deps per rilevare e visualizzare tali dipendenze. Se visiti la home page vedrai due video di YouTube: il primo fornisce un'introduzione generale allo strumento, mentre il secondo mostra come può essere usato per evitare conflitti durante la selezione delle ciliegie.

Problemi correlati