Você se funde. Na verdade, isso é bastante simples e uma operação perfeitamente local:
git checkout b1
git merge master
# repeat for b2 and b3
Isso deixa o histórico exatamente como aconteceu: você partiu do mestre, fez alterações em todos os ramos e, finalmente, incorporou as mudanças do mestre nos três ramos.
git
Para lidar com essa situação muito bem, ele foi projetado para mesclagens acontecendo em todas as direções, ao mesmo tempo. Você pode confiar que poderá reunir todos os threads corretamente. Simplesmente não se importa se o branch b1
mescla master
ou master
mescla b1
, o commit de mesclagem parece igual ao git. A única diferença é que ramo acaba apontando para esse commit de mesclagem.
Você se rebase. Pessoas com um SVN ou experiência semelhante acham isso mais intuitivo. Os comandos são análogos ao caso de mesclagem:
git checkout b1
git rebase master
# repeat for b2 and b3
As pessoas gostam dessa abordagem porque ela mantém uma história linear em todos os ramos. No entanto, essa história linear é uma mentira, e você deve estar ciente de que é. Considere este gráfico de confirmação:
A --- B --- C --- D <-- master
\
\-- E --- F --- G <-- b1
A mesclagem resulta na história verdadeira:
A --- B --- C --- D <-- master
\ \
\-- E --- F --- G +-- H <-- b1
A rebase, no entanto, fornece esse histórico:
A --- B --- C --- D <-- master
\
\-- E' --- F' --- G' <-- b1
O ponto é que os commits E'
, F'
e G'
nunca realmente existiram e provavelmente nunca foram testados. Eles podem até não ser compilados. Na verdade, é muito fácil criar confirmações sem sentido via rebase, especialmente quando as alterações master
são importantes para o desenvolvimento b1
.
A conseqüência disso pode ser que você não consegue distinguir qual dos três commits E
, F
e G
realmente introduziu uma regressão, diminuindo o valor degit bisect
.
Não estou dizendo que você não deveria usar git rebase
. Tem seus usos. Mas sempre que você o usa, precisa estar ciente do fato de estar mentindo sobre a história. E você deve pelo menos compilar o teste que os novos commits.