Skip to main content

Разрешение конфликта слияния с помощью командной строки

Устраните конфликты слияния с помощью командной строки и текстового редактора.

Platform navigation

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

Совет. Можно использовать редактор конфликтов в GitHub, чтобы разрешать конкурирующие конфликты слияния изменений строк между ветвями, которые являются частью запроса на вытягивание. Дополнительные сведения см. в разделе Разрешение конфликта слияния в GitHub.

Конкурирующие конфликты слияния изменений строк

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

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

  1. Откройте ТерминалТерминалGIT Bash.

  2. Перейдите в локальный репозиторий Git, в котором есть конфликт слияния.

    cd REPOSITORY-NAME
    
  3. Создайте список файлов, затронутых конфликтом слияния. В этом примере у файла 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")
    
  4. Откройте любимый текстовый редактор, например Visual Studio Code, и перейдите к файлу с конфликт слияния.

  5. Чтобы увидеть начало конфликта слияния в файле, выполните в нем поиск метки конфликта <<<<<<<. При открытии файла в текстовом редакторе вы увидите изменения из ГЛАВНОЙ или базовой ветви после строки <<<<<<< HEAD. Далее вы увидите =======, который отделяет ваши изменения от изменений в другой ветви, а затем >>>>>>> BRANCH-NAME. В этом примере один человек написал "открыть проблему" в базовой или ГЛАВНОЙ ветви, а другой написал "задать свой вопрос в IRC" в ветви сравнения или branch-a.

    If you have questions, please
    <<<<<<< HEAD
    open an issue
    =======
    ask your question in IRC.
    >>>>>>> branch-a
    
  6. Решите, хотите ли вы сохранить изменения только вашей ветви, только другой ветви или внести совершенно новое изменение, которое может включать изменения в обеих ветвях. Удалите конфликтующие маркеры <<<<<<<, =======, >>>>>>> и внесите необходимые изменения в окончательном объединении. В этом примере оба изменения включены в окончательное слияние:

    If you have questions, please open an issue or ask in our IRC channel if it's more urgent.
    
  7. Добавьте или внесите свои изменения.

    git add .
    
  8. Зафиксируйте изменения с помощью комментария.

    git commit -m "Resolve merge conflict by incorporating both suggestions"
    

Теперь можно выполнять слияние ветвей в командной строке или отправить изменения в удаленный репозиторий в GitHub и выполнить слияние изменений в запросе на вытягивание.

Конфликты слияния файлов удалены

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

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

  1. Откройте ТерминалТерминалGIT Bash.

  2. Перейдите в локальный репозиторий Git, в котором есть конфликт слияния.

    cd REPOSITORY-NAME
    
  3. Создайте список файлов, затронутых конфликтом слияния. В этом примере у файла 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")
    
  4. Откройте любимый текстовый редактор, например Visual Studio Code, и перейдите к файлу с конфликт слияния.

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

    Чтобы добавить удаленный файл обратно в репозиторий, выполните следующие действия:

    git add README.md
    

    Чтобы удалить этот файл из репозитория, выполните следующие действия:

    $ git rm README.md
    > README.md: needs merge
    > rm 'README.md'
    
  6. Зафиксируйте изменения с помощью комментария.

    $ git commit -m "Resolve merge conflict by keeping README.md file"
    > [branch-d 6f89e49] Merge branch 'branch-c' into branch-d
    

Теперь можно выполнять слияние ветвей в командной строке или отправить изменения в удаленный репозиторий в GitHub и выполнить слияние изменений в запросе на вытягивание.

Дополнительные материалы