← Назад к вопросам

Как решал конфликты в git?

1.0 Junior🔥 251 комментариев
#Git и VCS#Soft Skills

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Конфликты в 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 — предотвращать конфликты координацией

Конфликты — это признак того, что команда активно разрабатывает. Важно не их избегать, а решать эффективно.

Как решал конфликты в git? | PrepBro