Поделиться через


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

Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019

Visual Studio 2019 | Visual Studio 2022

При слиянием или повторной базойвы сообщаете Git интегрировать изменения, внесенные в одну ветвь, с изменениями, внесенными в другую. Часто Git автоматически завершает слияние или перебазу без помощи. Однако если Git обнаруживает, что изменения, внесенные в одну ветвь, конфликтуют с изменением, сделанным в другой, он предложит устранить конфликт. Конфликт слияния может возникать, когда объединенные ветви изменяют одну и ту же строку файлов по-разному или когда одна ветвь изменяет файл и другую ветвь удаляет ее. Процесс устранения конфликтов слияния применим как к Git merge, так и к перебазированию.

Можно разрешить конфликты слиянием в Visual Studio или с помощью командной строки и любого текстового редактора.

Для обзора рабочего процесса Git, смотрите руководство Azure Repos Git.

Предпосылки

Категория Требования
доступ к проекту Член проекта .
Разрешения — Просмотр кода в частных проектах: по крайней мере базовый доступ.
— Клонирование или внесение вклада в код в частных проектах: Участник группы безопасности для участников или наличие соответствующих разрешений в проекте.
— Задайте разрешения ветви или репозитория: управление разрешениями для ветви или репозитория.
— Измените ветвь по умолчанию: . Измените политики и разрешения для репозитория.
— Импорт репозитория: член группы безопасности администраторов проекта или разрешение уровня проекта Git на создание репозитория установлено в «Разрешить» . Дополнительные сведения см. в разделе "Настройка разрешений репозитория Git".
услуги Repos включено.
Инструменты Необязательно. Используйте команды az repos: Azure DevOps CLI.

Примечание.

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

Категория Требования
доступ к проекту Член проекта .
Разрешения — Просмотр кода: доступ уровня Basic хотя бы .
— Клонирование или участие в коде: член группы безопасности участников или обладатель соответствующих разрешений в проекте.
услуги Repos включено.

Понять конфликты слияния

Слияние или rebase в Git интегрируют коммиты из исходной ветви в вашу текущую локальную ветвь (целевой ветви). Git merge выполняет либо fast-forward, либо no-fast-forward слияние. Слияние без перемотки также называется трехсторонним слиянием или настоящим слиянием. Git перебазировка — это другой тип слияния. Эти типы слияний показаны на следующей схеме.

диаграмма, показывающая до и после фиксаций при использовании слияния Git и повторной базы Git.

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

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

Слияние без быстрого переадресации создает новую целевую ветвь "фиксация слияния", которая интегрирует изменения исходной ветви с изменениями целевой ветви. Применимые изменения — это изменения, внесенные после последней фиксации, обычной для обеих ветвей. На предыдущей схеме коммит C является последним общим коммитом в обеих ветвях. Если любое изменение исходной ветви конфликтует с любым изменением целевой ветви, Git предложит устранить конфликт слияния. Коммит слияния (L) содержит интегрированные изменения из исходной ветви и целевой ветви. Концы исходной и целевой ветви (K и E) являются родителями коммита слияния. В журнале коммитов вашей веткикоммит слияния является полезным маркером для операции слияния, четко показывая, какие ветки были объединены.

Git перебазирование перестраивает историю фиксаций целевой ветви, чтобы она содержала все фиксации исходной ветви, а затем все фиксации целевой ветви с момента последней общей фиксации. На предыдущей схеме коммит C является последним общим коммитом в обоих ветках. Другой способ взглянуть на это: ребейз воспроизводит изменения в вашей целевой ветке поверх истории исходной ветви. Если любое изменение исходной ветви конфликтует с любым изменением целевой ветви, Git предложит устранить конфликт слияния. Как и при быстром слиянии, перебазирование не создаёт коммит слияния. Примечательно, что rebase изменяет последовательность коммитов существующей целевой ветки, что не характерно для других стратегий слияния. На предыдущей схеме коммит K' содержит те же изменения, что и K, но имеет новый идентификатор коммита, так как он ссылается обратно на коммит E вместо C.

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

Дополнительные сведения о вариантах и стратегиях слияния см. в справочнике по Git и в стратегиях слияния Git .

Когда следует разрешать конфликты слиянием

Команды Git merge и Git rebase широко используются в рабочем процессеGit. При работе с локальной функцией или ветвью исправлений часто рекомендуется:

  1. Поддерживайте актуальность вашей локальной ветки main с её удалённой версией, периодически выполняя команду pull для получения и объединения изменений из удалённого репозитория.
  2. Интегрируйте обновления локальной ветки main в вашу локальную функциональную ветку, используя rebase или слияние.
  3. Создайте резервную копию работы в локальной ветви функций, отправкой ее в соответствующую удаленную ветвь.
  4. При завершении функции создайте запрос на вытягивание , чтобы объединить ветвь удаленной функции в ветвь удаленной main.

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

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

Процесс разрешения конфликтов применим как к слиянию Git, так и к Git rebase. Хотя в следующих шагах описано, как разрешать конфликты слияния во время объединения, аналогичным образом можно разрешать конфликты во время перемещения оснований.

Подсказка

Если исходная ветвь является ветви удаленного отслеживания, убедитесь, что ветвь up-to-date, выполнив получения Git перед слиянием. Или выполните команду Git pull, которая объединяет команду Git fetch с командой Git merge.

Visual Studio 2022 предоставляет интерфейс управления версиями Git с помощью меню Git, изменений Git и контекстных меню в Обозреватель решений. Visual Studio 2019 версии 16.8 также предлагает пользовательский интерфейс Team Explorer Git. Дополнительные сведения см. на вкладке Visual Studio 2019 — Team Explorer .

  1. В области ветви в окне репозитория Git проверьте целевую ветвь. Затем щелкните правой кнопкой мыши исходную ветвь и выберите Слияние <исходной ветви> в <целевую ветвь>.

    снимок экрана опции слияния в контекстном меню ветви в окне репозитория Git в Visual Studio.

  2. Visual Studio уведомит вас, если Git остановил слияние из-за конфликтов. В этом случае можно либо устранить конфликты, либо отменить слияние и вернуться в состояние предварительного слияния. В разделе "Необъединённые изменения" окна изменений Git перечислены файлы с конфликтами слияния. Для файла с конфликтами слияния дважды щелкните на нем, чтобы открыть его в редакторе слияний.

    снимок экрана файлов с конфликтами слияния в окне изменений Git в Visual Studio.

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

    снимок экрана редактора слияния в Visual Studio.

  4. Для файла, который был изменен в одной ветви и удален в другой, щелкните правой кнопкой мыши файл и выберите нужное действие ветви.

    снимок экрана контекстного меню для конфликтующего файла в окне изменений Git Visual Studio.

  5. В окне изменений Git введите сообщение фиксации и выберите Этап фиксации, чтобы завершить слияние, после разрешения всех конфликтов слияния для всех файлов.

    снимок экрана: сообщение о фиксации и кнопка

Дальнейшие действия