Ви зливаєтесь. Це насправді досить проста та ідеально локальна операція:
git checkout b1
git merge master
# repeat for b2 and b3
Це залишає історію саме так, як це сталося: Ви відключили від майстра, ви внесли зміни до всіх гілок, і, нарешті, ви включили зміни з головного в усі три гілки.
git
може вирішити цю ситуацію справді добре, вона розроблена для злиття, що відбувається в усіх напрямках, одночасно. Ви можете довіряти, що зможете правильно зібрати всі нитки. Просто не байдуже, чи b1
об'єднує гілка master
, чи master
зливається b1
, комірка злиття виглядає все одно, що git. Різниця полягає лише в тому, яка галузь в кінцевому підсумку вказує на цей об'єкт об'єднання.
Ви переобладнаєте. Люди з SVN або подібним фоном вважають це більш інтуїтивно зрозумілим. Команди є аналогом випадку злиття:
git checkout b1
git rebase master
# repeat for b2 and b3
Людям подобається такий підхід, оскільки він зберігає лінійну історію у всіх галузях. Однак ця лінійна історія - брехня, і ви повинні знати, що вона є. Розглянемо цей графік фіксації:
A --- B --- C --- D <-- master
\
\-- E --- F --- G <-- b1
Об'єднання призводить до справжньої історії:
A --- B --- C --- D <-- master
\ \
\-- E --- F --- G +-- H <-- b1
Однак, база даних дає вам цю історію:
A --- B --- C --- D <-- master
\
\-- E' --- F' --- G' <-- b1
Справа в тому, що вчинення E'
, F'
і G'
ніколи справді не існувало і, ймовірно, ніколи не було перевірено. Вони можуть навіть не складати. Насправді досить просто створити безглузді комітети за допомогою ребайду, особливо коли зміни master
важливі для розвитку в Росії b1
.
Наслідком цього може бути, що ви не можете визначити , який із трьох коммітов E
, F
і G
фактично ввів регресію, зменшуючи значення git bisect
.
Я не кажу, що ви не повинні використовувати git rebase
. Він має свої напрямки. Але щоразу, коли ви цим користуєтеся, вам потрібно знати про те, що ви брешите про історію. І вам слід принаймні скласти тест на нові коміти.