Каковы основные отличия и сценарии использования git merge и git rebase?

Ответ

Обе команды, git merge и git rebase, служат для интеграции изменений из одной ветки в другую, но делают это принципиально по-разному, что влияет на историю коммитов.

git merge

  • Что делает: Создает новый "коммит слияния" (merge commit), у которого два родительских коммита. Этот коммит объединяет истории двух веток.
  • История коммитов: Сохраняет полную, нелинейную историю. Всегда видно, когда и какие ветки были слиты.
  • Когда использовать: Это безопасный, неразрушающий способ. Идеально подходит для слияния веток в общие, долгоживущие ветки, такие как main или develop, где важно сохранить точную историю событий.
# Находясь в ветке main, вливаем в нее feature-ветку
git checkout main
git merge feature

git rebase

  • Что делает: Берет все коммиты из одной ветки и "перемещает" их, применяя поверх последнего коммита другой ветки. Это переписывает историю коммитов (изменяются их хеши).
  • История коммитов: Создает чистую, линейную историю, как будто все коммиты были сделаны последовательно в одной ветке.
  • Когда использовать: В основном используется для "подтягивания" последних изменений из main в свою локальную feature-ветку перед ее слиянием. Это помогает избежать лишних merge-коммитов и упрощает разрешение конфликтов.

Важно: Никогда не используйте rebase для веток, которые уже были отправлены в общий репозиторий и используются другими разработчиками, так как переписывание общей истории приведет к серьезным проблемам.

# Находясь в feature-ветке, перебазируем ее на main
git checkout feature
git rebase main

Сводная таблица

Критерий git merge git rebase
История Нелинейная, с merge-коммитами Линейная, чистая
Изменение истории Не изменяет существующие коммиты Переписывает коммиты
Простота Проще для понимания и разрешения конфликтов Требует большего понимания Git
Основной сценарий Слияние в общие ветки (main, develop) Обновление feature-веток перед слиянием

Ответ 18+ 🔞

Слушай, давай я тебе на пальцах объясню, а то про merge и rebase обычно такую хуйню несут, что волосы дыбом встают. Это ж, блядь, основа основ, а люди путаются, как мартышки в апельсинах.

Представь себе, ты пишешь код в своей уютной ветке feature, а в это время в main твои коллеги тоже не спят, суки, и пилят свои коммиты. И вот настал момент всё это добро объединить.

Способ первый: git merge — классика, как борщ с пампушками

Что делает? Берёт твою ветку feature и аккуратненько пришивает её к main. Как? Создаёт специальный коммит-свидание, у которого, внимание, два родителя! Один — последний коммит в main, второй — последний коммит в feature. Это как запись в истории: "А вот тут, блядь, 12 апреля мы слили ветку Васи с новой кнопкой".

История: Получается нелинейная, ветвистая, честная. Видно все развилки и слияния. Для общих веток (main, develop) — это святое. Никто ничего не переписывает, все спят спокойно.

# Сидишь на main и говоришь: "Заходи, feature, не стесняйся"
git checkout main
git merge feature

Когда юзать? Всегда, когда сливаешься в общую ветку. Это безопасно, предсказуемо и не вызовет у коллег желания ебать тебя в сраку вилкой.

Способ второй: git rebase — хитрая жопа, которая любит притворяться

Что делает? А вот это уже поинтереснее. Rebase — это как взять всю свою работу из feature, выдернуть её с корнями и аккуратно пересадить поверх самой свежей версии main. Он буквально переписывает историю, меняя хеши твоих коммитов. После этого кажется, будто ты с самого начала писал код, уже видя все изменения из main. Чистая, линейная история, без лишних merge-коммитов. Красота!

История: Идеально ровная линия. Будто ты гений, который никогда не отвлекался от main. Но это иллюзия, ёпта!

ВНИМАНИЕ, ЕБАНАРОТ: Никогда, слышишь, НИКОГДА не делай rebase для веток, которые уже залиты в общий репозиторий и с которыми работают другие люди. Ты им всю историю перепишешь, и они тебя сожрут с потрохами. Это правило номер ноль.

# Сидишь на своей feature и командуешь: "Всё, переезжаем на новую основу!"
git checkout feature
git rebase main

Когда юзать? Идеально перед тем, как пушить свою feature-ветку и создавать пул-реквест. Сначала rebase main, чтобы подтянуть все свежие изменения и решить конфликты у себя локально, а потом уже merge в main. Так история будет чистой, а ревьюеры не будут материться на лишние коммиты слияния.

Короче, табличка, чтобы совсем пиздец было понятно

Критерий git merge git rebase
История Ветвистая, с мерж-коммитами. "Была развилка, потом сошлись". Прямая линия. "Я всегда был в курсе дел".
Переписывает историю? Нет, священно. ДА, ёбта! Меняет хеши коммитов.
Риск для команды Нулевой. Овердохуищный, если переписать общую ветку.
Основная фишка Слить готовую фичу в main. Причесать свою фичу перед слиянием.

Итог: Merge — для слияния, rebase — для причёсывания. Перепутаешь — получишь пизды. Всё просто, как три копейки.