Как перебазировать изменения в среде разработки

Перебазирование (git rebase), наряду с командой слияния (git merge), является одним из основных способов переноса изменений из одной ветки в другую. Операция слияния фиксирует изменения, всегда двигаясь вперед по истории проекта, в то время как перебазирование позволяет переписать историю коммитов. С помощью команды перебазирования вы можете взять все коммиты из одной ветки и в том же порядке применить их поверх другой ветки, благодаря чему устраняются коммиты слияния и создается линейная история проекта.

Предположим, вы создали ветку dev для работы над какой-либо задачей и сделали в ней несколько коммитов (E и F). В это же время ваши коллеги уже завершили свои задачи и влили свои изменения (C и D) в основную ветку проекта main.

Чтобы интегрировать изменения из ветки main в свою ветку, вы можете перебазировать вашу работу поверх main, как показано на рисунке ниже. В результате будут созданы новые коммиты E' и F', которые полностью идентичны коммитам E и F, отличается только хеш.

Если посмотреть на историю перебазированной ветки, то можно увидеть, что она абсолютно линейна: будто все операции были выполнены последовательно, даже если изначально они совершались параллельно. После того как вы перебазировали ветку, вы можете влить ее в основную ветку проекта, используя слияние с перемоткой вперед. Таким образом вы избежите конфликтов слияния и получите идеальную линейную историю проекта.

В данной статье мы покажем, как выполнить перебазирование в среде разработки . При групповой разработке пользоваться перебазированием следует с осторожностью, так как эта операция приводит к изменению истории коммитов в репозитории проекта. Если с веткой, для которой выполняется перебазирование, работают другие разработчики, это может нарушить их работу.

Перебазировать текущую ветку на выбранную ветку

Чтобы выполнить перебазирование двух веток (например, перебазировать вашу текущую ветку dev на основную ветку проекта main), выполните следующие шаги:

  1. Нажмите на кнопку Синхронизация изменений, чтобы синхронизировать ваши изменения с изменениями в репозитории проекта.

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

  2. Нажмите правой кнопкой мыши на основную ветку проекта в группе Ветки и выберите Перебазировать текущую ветку на ветку в контекстном меню.

    Вы также можете перебазировать текущую ветку поверх определенного коммита в выбранной ветке. Для этого щелкните правой кнопкой мыши на требуемый коммит и выберите команду Перебазировать текущую ветку на коммит в контекстном меню.

    Примечание: Если разработка ведется с использованием задач, команды перебазирования также доступны в группе Задачи представления .

  3. Если процесс перебазирования завершится успешно, будет открыто диалоговое окно с предложением отправить изменения в репозиторий проекта. Нажмите ОК, чтобы перезаписать историю коммитов текущей ветки в удаленном репозитории.

После перебазирования история коммитов в ветке dev будет выглядеть следующим образом:

Коммит ветки dev будет располагаться поверх коммита основной ветки main.

Разрешить конфликт слияния

Когда вы вызываете команду перебазирования для веток, которые существуют уже достаточно долго и имеют значительные отличия, могут происходить конфликты слияния.

Если вы получили сообщение о конфликте, вы можете разрешить его следующими способами:

  • Продолжить перебазирование

    Разрешите конфликт в редакторе кода, зафиксируйте изменения и нажмите Продолжить перебазирование, чтобы завершить процесс перебазирования.

  • Отменить перебазирование

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

  • Пропустить коммит с конфликтующими изменениями

    Нажмите на стрелку рядом с кнопкой Продолжить перебазирование и выберите опцию Пропустить коммит, чтобы исключить (удалить) конфликтный коммит из перебазирования.