Rebase de branches dependentes com Git

O Git o incentiva a usar branches e, dependendo do seu fluxo de trabalho, você pode obter históricos de commit bastante complexos. Mais cedo ou mais tarde, você também poderá se deparar com situações em que deseja realocar um branch que possui branches filho.

História inicial:

master ---A---B---C

feature1 D
---E---F

feature2 G
---H

Então você começa a rebase feature1em master:

$ git rebase master feature1

E o resultado é o seguinte:

master ---A---B---C

feature1 D
'--E'--F'

feature2 D---E---F---G---H

Fazer outro rebase simples de feature2on feature1pode ser problemático, porque eles compartilham uma história semelhante, mas não a mesma. Os commits D, E, Fe , , vai trazer-lhe problemas. Dependendo da complexidade de seus branches e do número de commits, isso pode ser pelo menos tedioso de resolver usando para pular os commits certos. Na pior das hipóteses, você pode bagunçar seu código com conflitos desnecessários.D'E'F'git rebase --skip

A solução é usar depois de rebasear o primeiro branch.git rebase --onto

$ git rebase --onto feature1 feature1@{1} feature2

Isso irá realocar todos os commits feature2que seguem o antigo cabeçalho de feature1(ou seja F) para o novo cabeçalho de feature1(ou seja F'). A sintaxe feature1@{1}significa “o último estado conhecido feature1antes do rebase” e requer que o reflogging seja ativado (o padrão para repositórios não vazios).

O comando acima deve rebase feature2em feature1sem problemas e ter o seguinte resultado:

master ---A---B---C

feature1 D
'--E'--F'

feature2 G'
--H'

Feito!