rebase
не является слиянием, как слияние ветки.Вместо этого rebase
- это серия git cherry-pick
с.Черри выбирает коммит и копирует его, как если бы он был написан поверх какого-то другого коммита.Это как если бы вы взяли diff из коммита и применили его где-то еще.
Рассмотрим такой репозиторий.A, B, C и т. Д. ... представляют идентификаторы фиксации.
A - B - C - D [master]
\
E - F - G [feature]
Если master
требуется E
, возможно, это критическое исправление ошибки, но не остальная часть feature
можетgit cherry-pick E
.Git выполнит слияние D и E с C в качестве источника, что приведет к E1.Вот почему вы можете получить конфликты слияния во время перебазирования.Но в отличие от обычного слияния, у E1 будет только один родитель.
A - B - C - D - E1 [master]
\
E - F - G [feature]
Перебазировка - это как если бы это делалось для всех ваших коммитов.И вместо того, чтобы быть на вершине master
, он движется feature
.Вот как выглядит git rebase master
, шаг за шагом.
Опять же, рассмотрим ваш репозиторий.
A - B - C - D [master]
\
E - F - G [feature]
Сначала, как и прежде, он делает cherry-pick
на E и помещает его ввершина master
.Но вместо перемещения master
создается новая ветвь без метки.
E1
/
A - B - C - D [master]
\
E - F - G [feature]
Затем он выбирает F и помещает его поверх E1.
E1 - F1
/
A - B - C - D [master]
\
E - F - G [feature]
ЗатемВишня выбирает G и помещает его в F1 как G1.
E1 - F1 - G1
/
A - B - C - D [master]
\
E - F - G [feature]
Когда сбор вишни завершен, он перемещает метку feature
на G1.
E1 - F1 - G1 [feature]
/
A - B - C - D [master]
\
E - F - G
И да,старые коммиты все еще там.Если ничто не ссылается на них, например, на тег или другую ветку, они будут собираться через несколько недель.Тем временем вы можете получить к ним доступ с помощью git reflog
.См. Обслуживание и восстановление данных глава Pro Git для получения дополнительной информации.