Устранение конфликтов слияния

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

Visual Studio 2019 | Visual Studio 2022

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

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

Общие сведения о рабочем процессе Git см . в руководстве по Azure Repos Git.

В этой статье приведены процедуры для следующих задач:

  • Общие сведения о конфликт слияния
  • Устранение конфликтов слияния

Общие сведения о конфликт слияния

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

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

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

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

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

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

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

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

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

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

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

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

Устранение конфликтов слияния

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

Совет

Если исходная ветвь является ветвью удаленного отслеживания, убедитесь, что ветвь обновлена, выполнив получение Git перед слиянием. Или выполните команду извлечения Git, которая объединяет получение Git с слиянием Git.

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

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

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

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

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

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

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

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

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

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

    Снимок экрана: кнопка

Следующие шаги