Vous fusionnez. C'est en fait assez simple, et une opération parfaitement locale:
git checkout b1
git merge master
# repeat for b2 and b3
Cela laisse l'historique exactement tel qu'il s'est produit: vous avez dérivé de master, vous avez apporté des modifications à toutes les branches, et enfin vous avez incorporé les modifications de master dans les trois branches.
git
peut très bien gérer cette situation, il est conçu pour les fusions qui se produisent dans toutes les directions, en même temps. Vous pouvez lui faire confiance pour pouvoir réunir correctement tous les threads. Il ne se soucie simplement pas de savoir si la branche b1
fusionne master
ou master
fusionne b1
, la validation de la fusion ressemble tout de même à git. La seule différence est, quelle branche finit par pointer vers ce commit de fusion.
Vous rebasez. Les personnes possédant un SVN ou des antécédents similaires trouvent cela plus intuitif. Les commandes sont analogues au cas de fusion:
git checkout b1
git rebase master
# repeat for b2 and b3
Les gens aiment cette approche car elle conserve une histoire linéaire dans toutes les branches. Cependant, cette histoire linéaire est un mensonge, et vous devez être conscient qu'elle l'est. Considérez ce graphique de validation:
A --- B --- C --- D <-- master
\
\-- E --- F --- G <-- b1
La fusion entraîne la véritable histoire:
A --- B --- C --- D <-- master
\ \
\-- E --- F --- G +-- H <-- b1
Le rebase, cependant, vous donne cette histoire:
A --- B --- C --- D <-- master
\
\-- E' --- F' --- G' <-- b1
Le fait est que les engagements E'
, F'
et G'
n'ont jamais vraiment existé, et n'ont probablement jamais été testés. Ils peuvent même ne pas compiler. Il est en fait assez facile de créer des commits absurdes via un rebase, surtout lorsque les changements dans master
sont importants pour le développement deb1
.
La conséquence de cela peut être que vous ne pouvez pas distinguer lequel des trois commits E
,F
et en G
fait introduit une régression, ce qui diminue la valeur de git bisect
.
Je ne dis pas que vous ne devriez pas utiliser git rebase
. Il a ses utilisations. Mais chaque fois que vous l'utilisez, vous devez être conscient du fait que vous mentez sur l'histoire. Et vous devez au moins compiler tester les nouveaux commits.