Почему git rebase требует трехстороннего слияния? - PullRequest
7 голосов
/ 15 декабря 2011

Я пытаюсь понять, почему rebase требует трехстороннего слияния.Например, если у нас есть

A1 - A2
 \
  B1   

И я извлек B1, и я хочу выполнить:

git rebase A2

, почему git объединяет A2, B1 И A1?Почему не хватит A2 и B1?Я имею в виду, что A2 и B1 как коммит не содержат полный текущий снимок дерева?

1 Ответ

8 голосов
/ 15 декабря 2011

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

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

Итак, нам нужны все эти три коммита для фактического расчета различий, поскольку мы не можем понять, что произошло в коммите, просто взглянув на этот коммит.

...