Пример не очень хороший, потому что он рассматривает только один коммит (объединенный или перебазированный), создавая впечатление, что полученные коммиты похожи. В целом, ребаз добавляет несколько коммитов, в то время как объединение добавляет не более одного (быстрое слияние не добавляет ни одного).
Более того, до тех пор, пока нет конфликта для разрешения или если вы решите указанные конфликты одинаково каждый раз , конечное содержимое C3 'и C5 будет то же самое, но они остаются разными коммитами (поскольку у C3 'и C5 разные родители, у них также будут разные хэши, что более очевидно на рисунках ниже). Соответственно записанная история у каждого разная. Примечание для ребаз, история линейная, а для слияния это решетка .
Рассмотрим тот же вопрос при слиянии / перебазировании нескольких коммитов , как показано в « A Visual Git Reference » от Марка Лодато. Вы увидите, что конечный результат будет совсем другим.
git checkout master
git merge other # update master with tip of branch 'other' changes
![git merge other](https://i.stack.imgur.com/Q2xFT.png)
Вы берете только:
- текущий коммит (ed489 ниже, так как вы на мастере),
- последний коммит ветки other (который представляет собой моментальный снимок, представляющий полное содержимое репо, когда он разветвлен в '
other
', а не в дельте)
- их общий предок (b325c) и выполняет трехстороннее слияние .
Для значения рабочего каталога и этапа на этой диаграмме обратите внимание на стрелки, идущие к трехстороннему объединению, затем к рабочему каталогу и этапу. В рабочем каталоге представлены все файлы, которые вы видите (на своем жестком диске), некоторые из которых были изменены в результате трехстороннего слияния. Этап содержит файлы, измененные в результате трехстороннего слияния, которое затем используется для создания нового коммита (f8bc5).
Это сильно отличается от перебазирования, которое стремится к повторному применению каждого коммита ветки поверх ветви назначения :
git checkout topic # this time we are on topic
git rebase master # means: recreate every topic commits on top of master
at the end, we are still on (new) 'topic' branch
![git rebase master](https://i.stack.imgur.com/F2olX.png)
Приведенная выше команда принимает все коммиты, которые существуют в 'topic
', но не в master
(а именно 169a6
и 2c33a
), воспроизводит их на master
, а затем перемещает головку ветки к новому наконечнику. Обратите внимание, что старые коммиты [со временем] будут собираться, если на них больше нет ссылок.
Перебазирование использует рабочий каталог и промежуточную область при воспроизведении фиксаций (применить изменения к рабочему каталогу, добавить изменения в промежуточную область, зафиксировать промежуточные изменения, повторить). После того, как все это сделано, в заголовке перебазированной ветви устанавливается последний из новых коммитов (f7e63).
2 дополнительных отличия: