2009-10-10 10 views
15

Uso in git molti rami di argomenti locali e, a volte, con dipendenze tra rami argomento che causano problemi di rebase. Ad esempio, con una struttura come:Riorganizzazione di rami argomento dipendenti

master ---> featureA ---> featureB 
        \--> featureC 

If master modifiche e ottengo (e risolvere) i conflitti quando rebasing featureA, poi dopo rebasing featureB sul featureA innesca gli stessi conflitti (e quelli a volte entusiasmanti nuovi pure) perché prova a riapplicare le patch dal ramo featureA. Supponendo che le patch effettive tra featureA e featureB si applichino in modo pulito se selezionate, esiste un modo per eseguire un rebase in questa situazione con più o meno lo stesso effetto del cherry-picking di tutti i commit tra featureA e featureB?

+0

Vedere anche [in che modo rebase un'intera sottoristoria: diverse diramazioni, con alcuni collegamenti tra di loro risultanti dall'unione] (http://stackoverflow.com/a/9706495/94687). La parte spiacevole di questa soluzione è la necessità di reimpostare in seguito i riferimenti alle ramifiche di argomento ai nuovi commit rebased. –

risposta

17

Dopo rebasing featureA, si può fare

git rebase --onto featureA oldFeatureA featureB 

assumendo oldFeatureA rappresenta il commit sulla punta della featureA prima di Ribasato esso (è possibile mantenere un altro ramo lì o basta ricordare l'hash commit).

Questo dovrebbe essere sostanzialmente la stessa di ciliegia-picking ogni commit tra A e B sulla versione ricalcolato di A.

Documentation on git-rebase (incluse alcune spiegazioni pittorici voti di ciò che accade durante alcune operazioni più complesse REBASE)

+0

Eccellente, grazie. Avevo capito che - sembrava che dovesse fare il lavoro, ma non mi serviva il vecchio consiglio come base. – Kai

+4

Invece di 'oldFeatureA', dovrebbe essere possibile usare' featureA @ {1} ', assumendo che il rebase fosse l'ultima modifica a quella branche. Altrimenti usa qualcosa come '@ {2}', '@ {3}', o '@ {un'ora fa}' – Ropez

4

Per il futuro, se lavori con molte branche di argomenti interdipendenti, forse dovresti prendere in considerazione l'utilizzo di TopGit (README), uno strumento per gestire la coda di patch usando i rami di argomenti di Git, una patch per ramo; o in alternativa uno strumento per gestire più rami di argomento.

Vedere ad es. topgit Means Never Having to Wait for Reviews post del blog.

+0

Grazie per aver puntato su TopGit! TopGit sembra mirare alla cosa giusta: mantenere filiali interdipendenti. ** Ma TopGit ha la caratteristica di rebase i miei rami di argomenti interdipendenti su un nuovo stato upstream? ** Se potesse, potrei usare TopGit per sviluppare e preparare le mie patch come filiali per una revisione e possibile estrazione da parte dell'upstream. –

+0

Vedere anche [Alcune discussioni su un "TopGit basato su rebase"] (http://git.661346.n2.nabble.com/Branch-dependencies-td6641429.html): "Penso che un nuovo" sistema "debba essere basato su 'rebase', non basato su un merge come TopGit " –