Перейти к содержимому

5. Конфликты

Иллюстрация к уроку Конфликты в 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-конфликта: