Разделы портала

Онлайн-тренинги

.
Устранение конфликта слияния, если вы зашли в тупик
17.01.2020 00:00

Автор: Кристин Джеквони (Kristin Jackvony)
Оригинал статьи
Перевод: Ольга Алифанова

Все, кто работает с системами контроля версий – например, с Git, - рано или поздно сталкиваются с конфликтом слияния. Если вы новичок в Git, то вот простой пример конфликта слияния:

Мастер-ветка содержит файл с текстом:

"Кристин Джеквони была здесь 22 мая 2019".

Прюнелла и Джо выкачивают себе по версии этой мастер-ветки. Прюнелла создает ветку по имени "Прюнелла", а Джо – ветку по имени "Джо".

Джо обновляет файл в ветке, и теперь там вот что:

"Кристин Джеквони была здесь 22 мая 2019.

Джо Шмое был здесь 23 мая 2019".

Джо создает пулл-реквест для своих изменений, и они одобряются и вливаются в мастер-ветку.

Вскоре после этого Прюнелла обновляет файл в своей ветке, и теперь там вот что:

"Кристин Джеквони была здесь 22 мая 2019.

Прюнелла Прюнвип была здесь 23 мая 2019".

Она тоже создает пулл-реквест для своих изменений, но так как ее версия мастер-ветки – не самая последняя, происходит конфликт слияния. Git видит, что она хочет добавить свое имя во вторую строчку файла, но в ее версии мастер-ветки вторая строчка пуста, а в новой версии там уже находится имя Джо. Прежде чем вливать свои изменения, Прюнелле нужно разобраться с этим конфликтом.


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

Шаг 0: избегайте конфликтов слияния.

Используя полезные советы (см. "Шесть советов по работе с Git"), особенно первый, второй и шестой, можно избежать возникновения конфликта слияния. Пулл-реквест из мастера – всегда хорошая идея, и реализовывать ее надо до того, как вы начали что-то делать с кодом.

Шаг 1: не паникуйте.

При конфликте слияния очень важно не биться в истерике, пытаясь сделать git-что-то и git-то-то. Вы можете только усугубить ситуацию. Конфликт слияния рано или поздно разрешится, даже если вам придется прибегнуть к сторонней помощи (шаг 6). И вы просто не могли сделать ничего непоправимого – в этом прелесть контроля версий!

Шаг 2: устраните конфликт изнутри GitHub.

У GitHub простой интерфейс, позволяющий справляться с конфликтами слияния. Просто нажмите на кнопку "Resolve Conflicts" и изучите конфликт. Он будет выглядеть примерно так:

>>>>>HEAD

Джо Шмое был здесь 23 мая 2019

Прюнелла Прюнвип была здесь 23 мая 2019

<<<<< Prunella

Все, что тут нужно сделать – это определить, какую запись вы хотите видеть на строчке 2, а какую – на строчке 3, и внести эти правки, заодно удаляя лишние символы и названия веток. Когда все будет кончено, файл будет выглядеть так:

"Кристин Джеквони была здесь 22 мая 2019.

Джо Шмое был здесь 23 мая 2019.

Прюнелла Прюнвип была здесь 23 мая 2019".

Теперь кликните по кнопке "Mark as Resolved", и ваш пулл-реквест будет готов к слиянию.

Шаг 3: устраните конфликт через командную строку.

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

Лично я в этом случае открываю файл с конфликтом слияния в текстовом редакторе – например, в TextEdit или Notepad++. Затем я редактирую его, чтобы он выглядел так, как мне нужно, удаляя все лишние символы и названия веток, а затем осуществляю git add с именем файла, и git commit. Я делаю это в соответствии с инструкциями, которые можно найти здесь: https://help.github.com/en/articles/resolving-a-merge-conflict-using-the-command-line. Однако мне всего пару раз удалось успешно это провернуть. Обычно приходится переходить к шагу 4 или шагу 5.

Шаг 4: забудьте о существующей ветке и создайте новую.

В этом случае я копирую текст файла полностью со всеми изменениями, и вставляю его где-нибудь вне кода. Затем я иду в мастер-ветку и делаю git pull origin master. Теперь у меня есть последняя версия со всеми последними изменениями. Затем я создаю новую ветку, переключаюсь на нее, и вставляю свои изменения, после чего провожу свежий пулл-реквест, и конфликт слияния исчезает.

Шаг 5: ядерная атака.

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

Шаг 6: попросите помощи.

Если ничего не помогает, попросите кого-нибудь помочь. Нет ничего ужасного в том, чтобы попросить помощи с особенно коварным конфликтом слияния! Если вы следовали шагу 1 и не паниковали, ваш помощник увидит, что конкретно вы уже делали, и может помочь вам найти решение.

Git-пуристы могут возразить, что конфликты слияния нужно разрешать правильно (как в шаге 2 или 3), и они, возможно, правы. Однако шаги 4 и 5 могут сэкономить вам потраченное на разрешение конфликта время, и также предотвратят дефенестрацию вашего ноутбука!

Обсудить в форуме