2014-12-12 13 views
5

miei rami Git simile a questa:Come REBASE già finita Ribasato filiali

master-*-*-*-*-*-*-implement_x 
\     \-*-further_foo_fixes_that_depend_on_x 
    \     \-*-*-further_bar_fixes_that_depend_on_x 
    \ 
    \-implement_x_rebased 

Si è conclusa in questo modo, perché ho pensato che il mio ramo implement_x sarebbe stata fusa a monte come è, ma mi è stato chiesto di schiacciarlo a un singolo commit, quindi implement_x_rebased. Tuttavia, ho già avviato diversi rami per ulteriori correzioni e sviluppi che dipendono dal mio lavoro, mentre aspetto che lo implement_x venga unito.

Ora desidero rifare i successivi lavori su implement_x_rebased. Ho pensato che fosse un no-op, dal momento che implement_x e implement_x_rebased erano nello stesso identico stato - non ci sarebbero stati conflitti di merge, semplicemente applicando le modifiche tra implement_x e further_foo_fixes_that_depend_on_x ecc. Sopra implement_x_rebased. Tuttavia, sembra che git non sia così intelligente, e cerchi di rebase fino in fondo dalla base - introducendo inutili conflitti di fusione.

ho pensato che la via più facile a dire rebase & schiacciare i ulteriori correzioni su implement_x e poi riporre, e applicare le stashes per implement_x_rebased, ma io sono curioso di sapere se esiste un modo corretto di fare git conto che implement_x e implement_x_rebased sono effettivamente nello stesso stato?

+0

Non conosco la risposta perfetta per questa domanda, ma cherry-pick è anche una delle opzioni. – shirakia

+0

Ah. La raccolta delle ciliegie è decisamente più semplice e migliore dell'applicazione manuale di alcune differenze. Sto ancora aspettando risposte che rispondano direttamente alla mia domanda, ma se non ce n'è per il momento, accetterò che se la pubblichi. – GolDDranks

+0

Per favore controlla 'git rev-parse implement_x^{tree} implement_x_rebased^{tree}' per vedere se i due commit sono davvero di contenuto identico. – jthill

risposta

8

Questo sembra essere un compito per l'opzione --onto di git rebase.

git rebase --onto implement_x_rebased implement_x further_bar_fixes_that_depend_on_x 

Si consiglia di avere un'occhiata alla --onto esempio nella git rebase manual.

+0

Infatti, esattamente questo tipo di situazione è uno degli esempi ('git rebase --onto master next topic') in' git help rebase', tranne per il fatto che il target del rebase non è solo un singolo commit ramo in quell'esempio, ma non è molto importante per l'esempio. – twalberg

+0

La mia storia non è mai stata così bella! Splendida. – GolDDranks

-1

Un modo per avvicinarsi a questo sarebbe quello di rendere implement_x e implement_x_rebased la stessa prima, ad es .:

git checkout implement_x_rebased 
git merge implement_x 

quindi unire nelle vostre ulteriori correzioni in modo normale.

La fusione di implement_x dovrebbe essere un NOOP da un punto di vista del codice (verificare che git diff implement_x implement_x_rebased in realtà produce niente), ma si sta registrando il fatto i due sono fusi, che vi permetterà di tirare su tutto il resto con facilità.

Se non sono proprio la stessa cosa, potrebbe essere necessario l'opzione -s ours. Ciò indica che è stata eseguita un'unione senza unire il codice. USO CON ESTREMA ATTENZIONE.

In caso contrario, è possibile utilizzare semplicemente git rebase per rebase i rami successivi su implement_x_rebased.

Questo è meglio di cherry-picking come a) non c'è bisogno di ciliegio raccogliere ogni singolo commesso, ricordate di ottenere il giusto ordine, ecc b) semanticamente, il vostro albero git ha più senso dopo