Устранение конфликта слияния, если вы зашли в тупик |
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 могут сэкономить вам потраченное на разрешение конфликта время, и также предотвратят дефенестрацию вашего ноутбука! |