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 branch1tmp
foi clonado branch1
** antes de ** branch1
ser 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