Перебазирование и слияние
Сравните перебазирование и слияние и узнайте, когда применять каждый подход для чистой линейной истории.
«Перебазирование и слияние» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.
Слияние или перебазирование? Выбор стратегии
При работе с Git Вы часто сталкиваетесь с тем, что Ваша ветка расходится с другой, например ветка feature — с main.
Как объединить эти изменения? Git предлагает две основные стратегии: слияние и перебазирование. Обе стратегии обеспечивают интеграцию, но делают это принципиально разными способами, формируя разную историю проекта.
Слияние: объединение историй
Слияние — стандартный способ интеграции изменений в Git. При слиянии одной ветки с другой Git берёт содержимое исходной ветки и объединяет его с целевой веткой.
Главная особенность слияния заключается в создании нового коммита слияния. У этого коммита есть два родительских коммита, что явно показывает объединение двух разошедшихся историй. При этом точная история обеих веток сохраняется.
Выполнение слияния в Git
Рассмотрим простое слияние. Мы создадим ветку feature, добавим коммит, а затем сольём её обратно с main.
git init my_merge_project
cd my_merge_project
echo "Initial content" > file.txt
git add .
git commit -m "Initial commit"
git branch feature
git checkout feature
echo "Feature A" >> feature.txt
git add .
git commit -m "Add feature A"
git checkout main
echo "Main update" >> main.txt
git add .
git commit -m "Update main"
git merge feature
git log --oneline --graphСлияние: преимущества и недостатки
Слияние — простой и безопасный способ работы с общими ветками, но оно может привести к «неопрятной» истории.
- Преимущества:
- Сохраняет точную историю коммитов.
- Не разрушает существующие коммиты и не переписывает их.
- Просто в использовании и понимании.
- Недостатки:
- Может создавать «шумную» историю с большим количеством коммитов слияния.
- Граф может выглядеть сложным из-за множества сливающихся веток.
Перебазирование: переписывание истории
Перебазирование — альтернатива слиянию, при которой изменения интегрируются путём перемещения или объединения последовательности коммитов относительно нового базового коммита. Вместо создания коммита слияния история проекта переписывается.
По сути, коммиты Вашей ветки функциональности «воспроизводятся» поверх последнего коммита целевой ветки, создавая впечатление, будто работа изначально начиналась оттуда. Так формируется линейная история без дополнительных коммитов слияния.
Выполнение перебазирования в Git
Теперь рассмотрим тот же сценарий с перебазированием. Мы перебазируем ветку feature относительно main.
Обратите внимание: коммит ветки feature повторно применяется поверх последнего коммита main, а затем перемотка вперёд перемещает указатель main на него.
git init my_rebase_project
cd my_rebase_project
echo "Initial content" > file.txt
git add .
git commit -m "Initial commit"
git branch feature
git checkout feature
echo "Feature B" >> feature.txt
git add .
git commit -m "Add feature B"
git checkout main
echo "Main update 2" >> main.txt
git add .
git commit -m "Update main 2"
git checkout feature
git rebase main
git checkout main
git merge feature
git log --oneline --graphПеребазирование: преимущества и недостатки
Перебазирование создаёт чистую историю, но связано с важным предупреждением относительно общих веток.
- Преимущества:
- Создаёт чистую линейную историю проекта.
- Упрощает просмотр и понимание истории коммитов.
- Позволяет привести коммиты в порядок (объединить, изменить порядок) перед интеграцией.
- Недостатки:
- Переписывает историю коммитов.
- Может быть опасным для коммитов, уже отправленных в общий (публичный) удалённый репозиторий.
Слияние и перебазирование: сравнение
Кратко рассмотрим основные различия:
- Слияние:
- Создаёт новый коммит слияния.
- Сохраняет полную точную историю.
- Не разрушает существующие данные.
- Граф может быть сложным.
- Перебазирование:
- Переписывает историю, не создавая коммит слияния.
- Формирует линейную историю.
- Разрушает исходную структуру (изменяет идентификаторы коммитов).
- Граф получается очень чистым.
Выбор стратегии
Итак, когда следует использовать каждую из стратегий?
- Используйте слияние, если:
- Вы работаете с общими ветками (например,
main,develop). - Вам необходимо сохранить точную историю проекта.
- Вы хотите явно показать, когда разошедшиеся истории были объединены.
- Используйте перебазирование, если:
- Вы работаете в своей личной ветке функциональности до её отправки.
- Вам нужна чистая линейная история.
- Вы хотите привести коммиты ветки функциональности в порядок (например, объединить или изменить их порядок) перед интеграцией.
Золотое правило: никогда не перебазируйте коммиты, уже отправленные в общий удалённый репозиторий! Перебазирование общей истории может создать множество проблем для участников команды.
Быстрая проверка: слияние или перебазирование?
Рассмотрите свойства двух основных стратегий интеграции в Git.
Итоги: слияние и перебазирование
На этом уроке мы рассмотрели два основных способа интеграции изменений в Git: слияние и перебазирование.
- Слияние объединяет истории с помощью нового коммита слияния, сохраняя все исходные коммиты.
- Перебазирование переписывает историю, создавая линейное движение за счёт перемещения коммитов.
Выбирайте стратегию с учётом рабочего процесса команды и помните золотое правило: никогда не перебазируйте публичную историю! Это понимание крайне важно для поддержания чистого и удобного для совместной работы процесса Git.
Часто задаваемые вопросы
Урок «Перебазирование и слияние» бесплатный?
Да — полный текст урока «Перебазирование и слияние» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.
Чему я научусь в уроке «Перебазирование и слияние»?
Сравните перебазирование и слияние и узнайте, когда применять каждый подход для чистой линейной истории. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать DevOps Bootcamp?
Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Перебазирование и слияние»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке DevOps Bootcamp?
Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Рабочий процесс с функциональными ветками
- Введение в рабочий процесс Gitflow
- Перебазирование и слияние
- Разработка на основе основной ветки