Вы объединяетесь.Это на самом деле довольно простая и совершенно локальная операция:
git checkout b1
git merge master
# repeat for b2 and b3
Это оставляет историю в точности так, как это произошло: вы ответили на вопрос от мастера, вы внесли изменения во все ветви, и, наконец, вы внесли изменения из мастераво все три ветви.
git
может справиться с этой ситуацией действительно хорошо, он предназначен для слияния, происходящего во всех направлениях одновременно.Вы можете доверять этому, чтобы быть в состоянии собрать все нити вместе правильно.Просто не имеет значения, будет ли ветвь b1
merge master
, или master
merges 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
.Это имеет свое применение.Но всякий раз, когда вы используете его, вы должны осознавать тот факт, что вы лжете об истории.И вы должны хотя бы скомпилировать тест новых коммитов.