Rebase da ramificação de recurso para outra ramificação de recurso

305

Eu tenho dois ramos de recursos (particulares) nos quais estou trabalhando.

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

Depois de trabalhar nesses ramos um pouco, descobri que preciso das alterações do Branch2 no Branch1. Gostaria de refazer as alterações no Branch2 para o Branch1. Gostaria de terminar com o seguinte:

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

Tenho certeza de que preciso refazer o segundo ramo para o primeiro, mas não tenho muita certeza sobre a sintaxe correta e qual ramo eu deveria ter feito check-out.

Este comando produzirá o resultado desejado?

(Branch1)$ git rebase --onto Branch1 Branch2
Arjen
fonte
11
Para responder sua pergunta, eu criaria um repositório de teste, criaria a estrutura de confirmação que você mostrou e tentaria o comando que você mostrou. Mas eu acho que você pode fazer isso sozinho, então eu não vou fazê-lo :)
Daniel Hilgarth
3
Obrigado. Eu estava tão empenhado em conseguir esse direito pela primeira vez que não me ocorreu que eu poderia facilmente testar isso mesmo :-)
Arjen
4
Pensei que sim, por isso postei esse comentário :) Toda vez que faço algo, não tenho certeza de que fará o que penso, crio um repositório de teste e realizo meus testes lá. Ou, eu crio uma cópia do meu repositório real e executo os testes na cópia.
Daniel Hilgarth
Nota: Git 2.0 irá apresentar um atalho para este tipo de rebase: git rebase -. veja minha resposta abaixo
VonC
5
Nota secundária: As respostas aqui fornecem branch2 como resultado. O OP queria o ramo1. Ou eu perdi alguma coisa?
Josef.B

Respostas:

353
  1. Mudar para o Branch2

    git checkout Branch2
    
  2. Aplique as alterações atuais (Filial2) sobre as alterações da Filial1, permanecendo na Filial2:

    git rebase Branch1
    

O que deixaria o resultado desejado no Branch2:

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

Você pode excluir o Branch1.

sasikt
fonte
Obrigado! Ao excluir a ramificação após rebasear, recebo uma mensagem de que a ramificação não está totalmente mesclada. Suponho que posso ignorar com segurança esta mensagem e forçar a exclusão?
Arjen
10
ele não queria ter todas as alterações no ramo1?
tomasz_kusmierczyk
6
Isso parece o oposto do que ele queria, não?
1252748 11/0718
1
De fato, @tomasz_kusmierczyk e @ 1252748, e também me confundi. Mas então percebi que a apresentação git rebaseenquanto permanecia no Branch1 reescreveria o histórico do Branch1 para que as alterações do Branch1 fossem copiadas do Branch2. Isso resultará na seguinte ordem de confirmação a - b - f - g - c' - d' - e',.
enguia ghEEz
1
@tomasz_kusmierczyk e 1252748, isso não é o oposto do que ele quer, é EXATAMENTE o que ele queria. Os nomes das filiais não importam, você sempre pode alterá-los.
a3y3 18/02
56

Nota: se você estava ativo Branch1, poderá, com o Git 2.0 (Q2 2014), digitar:

git checkout Branch2
git rebase -

Veja commit 4f40740 de Brian Gesiakmodocache :

rebase: permite " -" abreviação para a ramificação anterior

Teach rebase a mesma abreviação de checkoute mergepara nomear a ramificação na ramificação rebaseatual; isto é, " -" significa "o ramo em que estávamos anteriormente".

VonC
fonte
26
legal, mas também um pouco perigoso. às vezes a verbosidade vence. mas, novamente, eu também gosto de Java ... (-:
sthzg
3

Eu sei que você pediu para rebase, mas eu escolheria os commits que gostaria de passar do Branch2 para o Branch1. Dessa forma, eu não precisaria me preocupar quando o ramo foi criado a partir do mestre e teria mais controle sobre a fusão.

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2
Craigo
fonte