Como faço para realocar uma cadeia de branches locais do git?

Suponha que você tenha uma cadeia de branches locais do git, como este:

 develop    branch1    branch2
| | |
o
----o----o----A----B----C----D

Você puxa uma mudança upstream para o branch de desenvolvimento:

         branch1   branch2
| |
A
----B----C----D
/
o
----o----o----o
|
develop

Agora você rebase branch1, dando-lhe isto:

                   branch2
|
A
----B----C----D
/
o
----o----o----o----A'---B'
| |
develop branch1

Nota: Por causa da rebase do branch1, os commits A e B foram reescritos como A ‘e B’.

Agora você deseja realocar branch2 (e quaisquer outros branches encadeados, se os tiver).

A sintaxe óbvia é git rebase branch1 branch2, mas não funciona.

O que você gostaria de fazer é apenas reaplicar C e D no topo do branch1, mas em vez disso, ele tenta reconciliar A e A ‘e os considera conflitantes.

Isso funciona:

git rebase --onto branch1 branch2^^ branch2

No entanto, assume que você sabe que branch2 tem exatamente 2 commits além da referência de branch1 anterior.

Solução 1:

git rebase --onto branch1 branch1tmp branch2

onde branch1tmpfoi clonado branch1** antes de ** branch1ser realocado com desenvolver.

por exemplo

git checkout branch1
git branch branch1tmp

git rebase develop

git rebase
--onto branch1 branch1tmp branch2

Solução 2:

Na página do manual git rebase:

ORIG_HEAD é definido para apontar para a ponta do galho antes da redefinição.

Este é basicamente o marcador de que você precisa git --onto.

Então, usando ORIG_HEAD, você nem precisa do branch tmp:

git checkout branch1
git rebase develop

git rebase
--onto branch1 ORIG_HEAD branch2
git rebase
--onto branch1 ORIG_HEAD branch3
git rebase
--onto branch1 ORIG_HEAD branch4

Quando descobri essa dica, fiquei muito feliz. Manter esses galhos acorrentados é uma grande dor que agora desapareceu.

Extraído de: http://bit.ly/1wAdQK1