5. Конфликты
Git: Машина времени. Урок 4: Конфликты
Заголовок раздела «Git: Машина времени. Урок 4: Конфликты»
Конфликты в Git – это неизбежная часть совместной работы над проектом. Они возникают, когда два или более человека одновременно редактируют одну и ту же строку в одном и том же файле, и Git не может автоматически определить, какая версия должна быть сохранена.
Что такое конфликт?
Заголовок раздела «Что такое конфликт?»Представьте, что вы и ваш коллега работаете над одним и тем же файлом index.html. Вы добавляете новый параграф, а ваш коллега меняет заголовок. Если вы оба закоммитите свои изменения и попытаетесь слить их в одну ветку (например, main), Git может столкнуться с конфликтом, если эти изменения касаются одной и той же области файла. Git не знает, какой вариант правильный, и требует вашего вмешательства.
Пример конфликта
Заголовок раздела «Пример конфликта»Допустим, у нас есть файл index.html с таким содержимым:
<!DOCTYPE html><html><head> <title>Мой сайт</title></head><body> <h1>Привет мир!</h1></body></html>Вы работаете в ветке feature/add-paragraph и добавляете новый параграф:
<!DOCTYPE html><html><head> <title>Мой сайт</title></head><body> <h1>Привет мир!</h1> <p>Это новый параграф.</p></body></html>Ваш коллега работает в ветке feature/update-title и меняет заголовок:
<!DOCTYPE html><html><head> <title>Супер сайт</title></head><body> <h1>Привет мир!</h1></body></html>Теперь, если вы попытаетесь слить ветку feature/update-title в feature/add-paragraph или наоборот, Git обнаружит конфликт. Файл index.html будет выглядеть примерно так:
<!DOCTYPE html><html><head> <<<<<<< HEAD <title>Мой сайт</title> ========= <title>Супер сайт</title> >>>>>>> feature/update-title</head><body> <h1>Привет мир!</h1> <p>Это новый параграф.</p></body></html><<<<<<< HEAD указывает на начало конфликтующей области в вашей текущей ветке.
========= разделяет вашу версию и версию из сливаемой ветки.
>>>>>>> feature/update-title указывает на конец конфликтующей области и имя ветки, вызвавшей конфликт.
Разрешение конфликта
Заголовок раздела «Разрешение конфликта»Чтобы разрешить конфликт, вам нужно вручную отредактировать файл index.html, удалив маркеры конфликта (<<<<<<<, =========, >>>>>>>) и оставив правильную версию кода. В этом случае, возможно, вы захотите объединить оба изменения:
<!DOCTYPE html><html><head> <title>Супер сайт</title></head><body> <h1>Привет мир!</h1> <p>Это новый параграф.</p></body></html>После разрешения конфликта, добавьте измененный файл в индекс (git add index.html) и завершите слияние (git commit).
Жизненный пример
Заголовок раздела «Жизненный пример»Конфликты очень часто возникают при работе над большими проектами, такими как веб-сайты или мобильные приложения. Например, в команде, работающей над React-приложением, два разработчика могут одновременно редактировать один и тот же компонент. Один может добавлять новую функциональность, а другой - исправлять ошибку. При слиянии этих изменений в основную ветку могут возникнуть конфликты, которые необходимо разрешить. Похожие ситуации возникают при работе с фреймворками, такими как Angular или Vue.js, или при разработке backend API на Node.js или Python. Использование хорошо структурированного кода, небольших коммитов и частая синхронизация с основной веткой помогают минимизировать возникновение конфликтов.
Ключевые моменты
Заголовок раздела «Ключевые моменты»- Конфликты возникают при одновременном редактировании одних и тех же строк кода разными людьми.
- Git не может автоматически разрешить конфликты и требует ручного вмешательства.
- Разрешение конфликта включает в себя редактирование файла, удаление маркеров конфликта и выбор правильной версии кода.
- После разрешения конфликта необходимо добавить файл в индекс и завершить слияние.
- Частая синхронизация с основной веткой и небольшие коммиты помогают минимизировать конфликты.
Интерактивный пример
Заголовок раздела «Интерактивный пример»Разрешение merge-конфликта: