Łą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.
git
potrafi 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ę b1
połączy master
, czy master
połą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 master
są ważne dla rozwoju w b1
.
Konsekwencją tego może być, że nie można odróżnić, który z trzech zatwierdzeń E
, F
i G
faktycznie 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ń.