Ricollocare il ramo della funzione su un altro ramo della funzione


305

Ho due rami (privati) su cui sto lavorando.

a -- b -- c                  <-- Master
     \     \
      \     d -- e           <-- Branch1
       \
        f -- g               <-- Branch2

Dopo aver lavorato su questi rami un po 'ho scoperto che ho bisogno delle modifiche da Branch2 in Branch1. Vorrei modificare le modifiche in Branch2 in Branch1. Vorrei finire con il seguente:

a -- b -- c                  <-- Master
           \
            d -- e -- f -- g <-- Branch1

Sono abbastanza sicuro di dover reimpostare il secondo ramo sul primo, ma non sono del tutto sicuro della sintassi corretta e di quale ramo avrei dovuto estrarre.

Questo comando produrrà il risultato desiderato?

(Branch1)$ git rebase --onto Branch1 Branch2

11
Per rispondere alla tua domanda, vorrei creare un repository di prova, creare la struttura di commit che hai mostrato e provare il comando che hai mostrato. Ma penso che tu possa farlo da solo, quindi non lo farò :)
Daniel Hilgarth,

3
Grazie. Ero così intenzionato a farlo bene la prima volta che non mi è venuto in mente che potrei facilmente provarlo da solo :-)
Arjen,

4
Ho pensato di sì, è per questo che ho pubblicato quel commento :) Ogni volta che faccio qualcosa non sono sicuro che farà quello che penso, creo un repository di test ed eseguo i miei test lì. In alternativa, creo una copia del mio archivio reale ed eseguo i test sulla copia.
Daniel Hilgarth,

Nota: Git 2.0 introdurrà una scorciatoia per questo tipo di rebase: git rebase -. vedi la mia risposta qui sotto
VonC

5
Nota minore: le risposte qui danno branch2 come risultato. L'OP voleva succursale1. O ho perso qualcosa?
Josef.B,

Risposte:


353
  1. Passa a Branch2

    git checkout Branch2
    
  2. Applica le modifiche correnti (Branch2) in cima alle modifiche Branch1, rimanendo in Branch2:

    git rebase Branch1
    

Che ti lascerebbe con il risultato desiderato in Branch2:

a -- b -- c                      <-- Master
           \
            d -- e               <-- Branch1
           \
            d -- e -- f' -- g'   <-- Branch2

Puoi eliminare Branch1.


Grazie! Quando si elimina il ramo dopo la riformulazione, viene visualizzato il messaggio che il ramo non è stato unito completamente. Presumo di poter tranquillamente ignorare questo messaggio e forzare l'eliminazione?
Arjen,

10
non voleva avere tutte le modifiche in Branch1?
tomasz_kusmierczyk,

6
Sembra il contrario di quello che voleva, no?
1252748

1
In effetti, @tomasz_kusmierczyk e @ 1252748, e anch'io mi sono confuso. Ma poi mi sono reso conto che esibirsi git rebaserimanendo in Branch1 riscriverà la storia di Branch1 per avere le modifiche di Branch1 in cima a quelle copiate da Branch2. Ciò si tradurrà nel seguente ordine commit, a - b - f - g - c' - d' - e'.
Eel GhEEz,

1
@tomasz_kusmierczyk e 1252748, questo non è l'opposto di quello che vuole, questo è ESATTAMENTE quello che voleva. I nomi delle filiali non contano, puoi sempre cambiarli.
a3y3,

56

Nota: se eri attivo Branch1, con Git 2.0 (Q2 2014) potrai digitare:

git checkout Branch2
git rebase -

Vedi commit 4f40740 di Brian Gesiakmodocache :

rebase: consenti " -" scorciatoia per il ramo precedente

Insegnare a rebase la stessa scorciatoia di checkoute mergenominare il ramo sul ramo rebasecorrente su; cioè, " -" significa "il ramo in cui eravamo precedentemente".


26
bello, ma anche un po 'pericoloso. a volte vince la verbosità. ma poi di nuovo, mi piace anche Java ... (-:
sthzg

3

So che hai chiesto a Rebase, ma invece Cherry-Pick mi impegnerebbe a passare da Branch2 a Branch1. In questo modo, non avrei bisogno di preoccuparmi di quale ramo è stato creato dal master e avrei un maggiore controllo sulla fusione.

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.