Ti unisci. In realtà è abbastanza semplice e un'operazione perfettamente locale:
git checkout b1
git merge master
# repeat for b2 and b3
Questo lascia la storia esattamente come è successo: hai biforcato dal maestro, hai apportato modifiche a tutti i rami e infine hai incorporato i cambiamenti dal maestro in tutti e tre i rami.
git
è in grado di gestire questa situazione davvero bene, è progettato per le fusioni che avvengono in tutte le direzioni, allo stesso tempo. Puoi fidarti di essere in grado di riunire correttamente tutti i thread. Semplicemente non importa se il ramo b1
si fonde master
o si master
fonde b1
, il commit di unione sembra lo stesso per git. L'unica differenza è, quale ramo finisce per puntare a questo commit di unione.
Ti rebase. Le persone con un SVN o un background simile lo trovano più intuitivo. I comandi sono analoghi al caso merge:
git checkout b1
git rebase master
# repeat for b2 and b3
Alla gente piace questo approccio perché mantiene una storia lineare in tutti i settori. Tuttavia, questa storia lineare è una bugia e dovresti essere consapevole che lo è. Considera questo grafico di commit:
A --- B --- C --- D <-- master
\
\-- E --- F --- G <-- b1
La fusione risulta nella vera storia:
A --- B --- C --- D <-- master
\ \
\-- E --- F --- G +-- H <-- b1
Il rebase, tuttavia, ti dà questa storia:
A --- B --- C --- D <-- master
\
\-- E' --- F' --- G' <-- b1
Il punto è che gli impegni E'
, F'
e G'
mai realmente esistiti, e probabilmente non sono mai stati testati. Non possono nemmeno compilare. In realtà è abbastanza facile creare commit senza senso tramite un rebase, specialmente quando i cambiamenti master
sono importanti per lo sviluppo in b1
.
La conseguenza di questo può essere, che non è possibile distinguere quale delle tre commit E
, F
e G
in realtà ha introdotto una regressione, diminuendo il valore di git bisect
.
Non sto dicendo che non dovresti usare git rebase
. Ha i suoi usi. Ma ogni volta che lo usi, devi essere consapevole del fatto che stai mentendo sulla storia. E dovresti almeno compilare test i nuovi commit.