Короткий ответ
Ветка — это указатель на цепочку коммитов, позволяющий разрабатывать функциональность изолированно от основной линии; merge создаёт коммит слияния и сохраняет историю обеих веток, а rebase переносит коммиты поверх новой базы, делая историю линейной.
Как это работает подробнее
branch — лёгкий указатель (хеш последнего коммита), а не копия файлов; HEAD переключается между ветками. merge делает трёхстороннее слияние с общим предком; rebase переигрывает коммиты один за другим на новую базу.
Пример кода
Команды терминала
git checkout feature/orders
git fetch origin
git rebase origin/main # переносит коммиты feature поверх актуального main
git push --force-with-lease
git checkout main
git merge --no-ff feature/orders # сохраняет отдельный merge-коммит для историиЧто использовать на практике
- Рекомендация. rebase используют для приватных feature-веток перед открытием PR, чтобы история была чистой; merge — для объединения в основную ветку, чтобы не терять контекст. Публичную ветку, от которой уже ответвились другие, rebase'ить нельзя.
Подводные камни
- Риск. rebase общей ветки после того, как её запушили и другие от неё ответвились, — ломает историю у коллег; путают
git merge --squashс обычным merge.