Łączysz się. To jest właściwie dość proste i idealnie lokalne działanie:
git checkout b1
git merge master
# repeat for b2 and b3
To pozostawia historię dokładnie tak, jak to się stało: rozwidliłeś się z mastera, dokonałeś zmian we wszystkich gałęziach, a na końcu wprowadziłeś zmiany z mastera do wszystkich trzech gałęzi.
gitpotrafi poradzić sobie z tą sytuacją naprawdę dobrze, jest przeznaczony do łączenia zachodzącego we wszystkich kierunkach jednocześnie. Możesz ufać, że będzie w stanie poprawnie zebrać wszystkie wątki. Po prostu nie ma znaczenia, czy gałąź się b1połączy master, czy masterpołączy b1, zatwierdzenie scalania wygląda tak samo dla git. Jedyną różnicą jest to, która gałąź ostatecznie wskazuje na to zatwierdzenie scalania.
Ty bazujesz. Osoby z SVN lub podobnym doświadczeniem uważają to za bardziej intuicyjne. Polecenia są analogiczne do przypadku scalenia:
git checkout b1
git rebase master
# repeat for b2 and b3
Ludziom podoba się to podejście, ponieważ zachowuje ono liniową historię we wszystkich gałęziach. Jednak ta liniowa historia jest kłamstwem i powinieneś być tego świadomy. Rozważ ten wykres zatwierdzania:
A --- B --- C --- D <-- master
\
\-- E --- F --- G <-- b1
Efektem scalenia jest prawdziwa historia:
A --- B --- C --- D <-- master
\ \
\-- E --- F --- G +-- H <-- b1
Jednak rebase daje ci tę historię:
A --- B --- C --- D <-- master
\
\-- E' --- F' --- G' <-- b1
Chodzi o to, że rewizje E', F'i G'nigdy tak naprawdę nie istniał, i prawdopodobnie nigdy nie były testowane. Mogą nawet się nie kompilować. W rzeczywistości dość łatwe jest tworzenie bezsensownych zatwierdzeń poprzez rebase, szczególnie gdy zmiany mastersą ważne dla rozwoju w b1.
Konsekwencją tego może być, że nie można odróżnić, który z trzech zatwierdzeń E, Fi Gfaktycznie wprowadził regresji, zmniejszając wartość git bisect.
Nie mówię, że nie powinieneś używać git rebase. Ma swoje zastosowania. Ale za każdym razem, gdy go używasz, musisz zdawać sobie sprawę z faktu, że kłamiesz na temat historii. I powinieneś przynajmniej skompilować test nowych zatwierdzeń.