Конфликты слияния возникают, если вносятся конкурирующие изменения в ту же строку файла или если один пользователь изменяет файл, а другой этот же файл удаляет. Дополнительные сведения см. в разделе О конфликтах слияния.
Совет. Можно использовать редактор конфликтов в GitHub, чтобы разрешать конкурирующие конфликты слияния изменений строк между ветвями, которые являются частью запроса на вытягивание. Дополнительные сведения см. в разделе Разрешение конфликта слияния в GitHub.
Конкурирующие конфликты слияния изменений строк
Чтобы разрешить конфликт слияния, вызванный конкурирующими изменениями строк, необходимо выбрать, какие изменения из разных ветвей включить в новую фиксацию.
Например, если несколько человек редактировали файл styleguide.md в одних и тех же строках в разных ветвях одного и того же репозитория Git, будет получена ошибка конфликта слияния при попытке выполнить слияние для этих ветвей. Необходимо разрешить этот конфликт слияния с помощью новой фиксации, прежде чем можно будет выполнить слияние для этих ветвей.
-
Откройте ТерминалТерминалGIT Bash.
-
Перейдите в локальный репозиторий Git, в котором есть конфликт слияния.
cd REPOSITORY-NAME
-
Создайте список файлов, затронутых конфликтом слияния. В этом примере у файла styleguide.md есть конфликт слияния.
$ git status > # On branch branch-b > # You have unmerged paths. > # (fix conflicts and run "git commit") > # > # Unmerged paths: > # (use "git add <file>..." to mark resolution) > # > # both modified: styleguide.md > # > no changes added to commit (use "git add" and/or "git commit -a")
-
Откройте любимый текстовый редактор, например Visual Studio Code, и перейдите к файлу с конфликт слияния.
-
Чтобы увидеть начало конфликта слияния в файле, выполните в нем поиск метки конфликта
<<<<<<<
. При открытии файла в текстовом редакторе вы увидите изменения из ГЛАВНОЙ или базовой ветви после строки<<<<<<< HEAD
. Далее вы увидите=======
, который отделяет ваши изменения от изменений в другой ветви, а затем>>>>>>> BRANCH-NAME
. В этом примере один человек написал "открыть проблему" в базовой или ГЛАВНОЙ ветви, а другой написал "задать свой вопрос в IRC" в ветви сравнения илиbranch-a
.If you have questions, please <<<<<<< HEAD open an issue ======= ask your question in IRC. >>>>>>> branch-a
-
Решите, хотите ли вы сохранить изменения только вашей ветви, только другой ветви или внести совершенно новое изменение, которое может включать изменения в обеих ветвях. Удалите конфликтующие маркеры
<<<<<<<
,=======
,>>>>>>>
и внесите необходимые изменения в окончательном объединении. В этом примере оба изменения включены в окончательное слияние:If you have questions, please open an issue or ask in our IRC channel if it's more urgent.
-
Добавьте или внесите свои изменения.
git add .
-
Зафиксируйте изменения с помощью комментария.
git commit -m "Resolve merge conflict by incorporating both suggestions"
Теперь можно выполнять слияние ветвей в командной строке или отправить изменения в удаленный репозиторий в GitHub и выполнить слияние изменений в запросе на вытягивание.
Конфликты слияния файлов удалены
Чтобы разрешить конфликт слияния, вызванный конкурирующими изменениями в файле, когда один пользователь удаляет файл в одной ветви, а другой этот же файл редактирует, необходимо выбрать, следует ли удалить или сохранить удаленный файл в новой фиксации.
Например, если вы редактировали файл, такой как README.md, а другой человек удалил его же в другой ветви того же репозитория Git, вы получите сообщение об ошибке конфликта слияния при попытке выполнить слияние для этих веток. Необходимо разрешить этот конфликт слияния с помощью новой фиксации, прежде чем можно будет выполнить слияние для этих ветвей.
-
Откройте ТерминалТерминалGIT Bash.
-
Перейдите в локальный репозиторий Git, в котором есть конфликт слияния.
cd REPOSITORY-NAME
-
Создайте список файлов, затронутых конфликтом слияния. В этом примере у файла README.md есть конфликт слияния.
$ git status > # On branch main > # Your branch and 'origin/main' have diverged, > # and have 1 and 2 different commits each, respectively. > # (use "git pull" to merge the remote branch into yours) > # You have unmerged paths. > # (fix conflicts and run "git commit") > # > # Unmerged paths: > # (use "git add/rm <file>..." as appropriate to mark resolution) > # > # deleted by us: README.md > # > # no changes added to commit (use "git add" and/or "git commit -a")
-
Откройте любимый текстовый редактор, например Visual Studio Code, и перейдите к файлу с конфликт слияния.
-
Решите, хотите ли сохранить удаленный файл. Возможно, потребуется просмотреть последние изменения, внесенные в удаленный файл, в текстовом редакторе.
Чтобы добавить удаленный файл обратно в репозиторий, выполните следующие действия:
git add README.md
Чтобы удалить этот файл из репозитория, выполните следующие действия:
$ git rm README.md > README.md: needs merge > rm 'README.md'
-
Зафиксируйте изменения с помощью комментария.
$ git commit -m "Resolve merge conflict by keeping README.md file" > [branch-d 6f89e49] Merge branch 'branch-c' into branch-d
Теперь можно выполнять слияние ветвей в командной строке или отправить изменения в удаленный репозиторий в GitHub и выполнить слияние изменений в запросе на вытягивание.