Чтобы выполнить слияние, Git должен выяснить, что именно произошло в двух ветвях со времени общего предка (A1
). Как вы правильно сказали, Git хранит снимки коммитов / деревьев, поэтому для получения фактического набора изменений он должен сравнить A2
с A1
и B1
с A1
, а затем объединить эти отдельные наборы изменений.
То же самое происходит в ребазе. Чтобы применить набор изменений A2
к B1
, сначала нам нужно рассчитать этот набор изменений на основе различий между A1
и A2
. И тогда мы можем применить это к B1
. Вы можете думать о перебазировании как о чем-то похожем на автоматическое создание файлов патчей. Сначала он генерирует все эти файлы исправлений из старой ветки и затем применяет их к текущей HEAD.
Итак, нам нужны все эти три коммита для фактического расчета различий, поскольку мы не можем понять, что произошло в коммите, просто взглянув на этот коммит.