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 feature1
em 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 feature2
on feature1
pode ser problemático, porque eles compartilham uma história semelhante, mas não a mesma. Os commits D
, E
, F
e , , 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 feature2
que 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 feature1
antes do rebase” e requer que o reflogging seja ativado (o padrão para repositórios não vazios).
O comando acima deve rebase feature2
em feature1
sem problemas e ter o seguinte resultado:
master ---A---B---C
feature1 D'--E'--F'
feature2 G'--H'
Feito!