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