Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Конфликты в git
Конфликты — нормальная часть командной разработки. За 10 лет я встречал разные типы конфликтов и знаю, как их эффективно решать.
Типы конфликтов
1. Merge конфликты (чаще всего)
<<<<<<< HEAD
def calculate_price(quantity, discount):
return quantity * 100 - discount # мой код
=======
def calculate_price(quantity, discount):
return quantity * 100 * (1 - discount) # код коллеги
>>>>>>> feature/discount-fix
Это означает: я и коллега оба изменили одно место в файле, git не знает, какой вариант выбрать.
2. Delete/modify конфликты (файл удалили, но кто-то его изменил)
3. Both added конфликты (оба добавили один файл с разным содержимым)
Мой процесс разрешения
Шаг 1: Понять ситуацию
git status # Какие файлы в конфликте?
git log --oneline -5 # Последние коммиты
git branch -a # На каких ветках я работаю?
Шаг 2: НЕ паниковать, просмотреть конфликт
# Посмотреть конфликтные файлы
git diff
# Посмотреть наши изменения vs их
git diff --ours
git diff --theirs
# Посмотреть контекст
cat models.py | grep -A5 -B5 "<<<<<<<"
Шаг 3: Общение перед резолвом
Это самый важный шаг! Я часто:
- Пишу в Slack коллеге: "Эй, у нас конфликт в models.py, давай обсудим?"
- Обсуждаю, какой подход лучше
- Часто выясняется, что оба варианта неправильные, нужна новая реализация
Шаг 4: Разрешение конфликта
# Вариант 1: Используем наш код
git checkout --ours models.py
# Вариант 2: Используем их код
git checkout --theirs models.py
# Вариант 3: Ручное слияние (чаще всего)
# Открываю файл в редакторе, вручную соединяю оба варианта
Примеры ручного слияния:
# Были два конфликтующих куска
# Мой код обновил логику расчёта
# Их код изменил название переменной
# Правильное решение — объединить оба:
def calculate_price(quantity, discount):
base_price = quantity * PRICE_PER_UNIT
discount_amount = base_price * discount
final_price = base_price - discount_amount
return final_price
Шаг 5: Проверить, что всё работает
# Добавить файлы
git add models.py
# Убедиться, что нет других конфликтов
git status
# Запустить тесты (важно!)
pytest tests/models_test.py -v
# Завершить merge
git commit -m "Resolve merge conflict in models.py"
Реальный пример из жизни
Один раз у нас был конфликт в settings.py. Я добавлял новую переменную БД, коллега менял существующую. Вот как я это решил:
# Я увидел конфликт при git pull
Auto-merging settings.py
CONFLICT (content): Merge conflict in settings.py
Automatic merge failed
# Посмотрел оба варианта
git diff --ours settings.py
# Мой: DATABASE_TIMEOUT = 30
git diff --theirs settings.py
# Их: DATABASE_TIMEOUT = 60 (обновление из чата)
# Я позвал коллегу в Slack
# "Эй, нужно 30 или 60?"
# Он: "Давай 60, это оптимально для нашей нагрузки"
# Я резолвлю
git checkout --theirs settings.py
git add settings.py
git commit -m "Resolve merge conflict: use DATABASE_TIMEOUT=60"
Лучшие практики для минимизации конфликтов
1. Ветки должны быть узкими
# Плохо: ветка feature/refactor-everything
# Хорошо: ветка feature/optimize-db-queries
2. Часто pullить main
git pull origin main --rebase
# Это вытягивает новые изменения из main и перезаписывает мои коммиты сверху
# Конфликты будут на маленькие куски, а не большие
3. Избегать одновременного редактирования одного файла
# В code review: "Эй, мы оба в models.py работаем?
# Давай координироваться"
4. Маленькие частые PR
- Вместо одного PR с 100 изменениями делаю 5 PR по 20 изменений
- Это меньше конфликтов и проще review
Когда конфликты становятся проблемой
Сложный конфликт: тысячи строк
# Если вещей слишком много, может быть:
# 1. Ветка слишком долго не обновлялась
# 2. Нужна полная переписка интеграции
# Решение: пересоздать ветку
git checkout main
git pull origin main
git checkout -b feature/my-feature-new
# Вручную перенести нужные изменения
Когда merge становится небезопасным
# Если я не уверен в результате merge
git merge --no-commit --no-ff origin/main
# Смотрю результат
git diff HEAD
# Если не нравится
git merge --abort
# Если нравится
git commit
Инструменты
Я использую встроенные инструменты, но иногда помогают специальные:
# Визуальный mergetool (если конфликт сложный)
git mergetool # Opens VS Code, Vim, или другой редактор
# Git в VS Code - встроенный конфликт resolver отлично работает
# Там можно кликнуть "Accept Current Change" / "Accept Incoming Change"
Главное
- Не паниковать — git может откатиться, данные не теряются
- Общаться — спросить коллегу, что он делал
- Тестировать — после разрешения конфликта запустить тесты
- Смотреть на future — предотвращать конфликты координацией
Конфликты — это признак того, что команда активно разрабатывает. Важно не их избегать, а решать эффективно.