Вы сливаетесь. На самом деле это довольно простая и совершенно локальная операция:
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. Это имеет свое применение. Но всякий раз, когда вы используете его, вы должны осознавать тот факт, что вы лжете об истории. И вы должны по крайней мере скомпилировать тест новых коммитов.