Как избежать конфликтов в Git?

«Как избежать конфликтов в Git?» — вопрос из категории Git, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-практиках мы строим процессы так, чтобы минимизировать ручное разрешение конфликтов. Вот что я применяю в рабочих проектах:

1. Стратегия ветвления и частые коммиты:

  • Используем GitFlow или Trunk-Based Development с короткоживущими feature-ветками.
  • Коммичу небольшими, логически завершенными изменениями. Это упрощает rebase и cherry-pick.

2. Автоматизация и CI/CD:

  • В пайплайне (GitLab CI/GitHub Actions) настраиваю автоматический rebase или merge основной ветки в feature-ветку перед запуском тестов. Это выявляет конфликты на ранней стадии.
  • Пример шага в .gitlab-ci.yml:
    test:
      before_script:
        - git fetch origin
        - git rebase origin/main  # Если будет конфликт — пайплайн упадет

3. Регулярное обновление ветки: Перед началом работы и перед созданием Merge/Pull Request всегда обновляю свою ветку:

git fetch origin
git rebase origin/main  # Предпочитаю rebase для линейной истории
# ИЛИ, если команда использует merge
git merge origin/main

4. Разрешение конфликтов: Если конфликт возник, разрешаю его с помощью инструментов:

# 1. Запускаю интерактивный rebase или merge
# 2. Для визуального разрешения использую:
git mergetool --tool=meld  # или vscode, kdiff3
# 3. После редактирования файлов:
git add <разрешенные_файлы>
git rebase --continue  # или git commit (при merge)

5. Соглашения в команде: Договариваемся о формате файлов конфигурации (YAML, JSON), используем линтеры и автоформатеры (Prettier, yamlfmt), чтобы уменьшить шанс конфликтов в коде инфраструктуры (Terraform, Ansible).