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

Ответ

В 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).

Ответ 18+ 🔞

Да ты послушай, как мы в DevOps эти конфликты в гите выносим! Прям волнение ебать, когда вся команда в один файл лезет. Но если по уму, то можно сделать так, что ручные разборки — это как пойти за хлебом через минное поле, нафиг не нужно.

1. Как ветки плодим и коммитим:

  • Сидим либо на GitFlow, либо на Trunk-Based, но так, чтобы фича-ветки жили не дольше трёх дней. Идея — не дать им превратиться в этих манда с ушами, которые потом не пришить.
  • Коммиты делаем маленькими и осмысленными. Не "пофиксил всё", а "починил порт в конфиге nginx". Тогда если что, rebase проглатывается как семечки, а не как хуй с горы.

2. Роботы вместо нас:

  • В CI/CD пайплайн встраиваю автоматическое подтягивание основной ветки. Просто чтобы, если конфликт назревает, он вскрылся сразу, а не в момент, когда ты уже терпения ноль ебать и хочешь смерджить.
  • Смотри, как в .gitlab-ci.yml просто прикрутить:

    test:
      before_script:
        - git fetch origin
        - git rebase origin/main  # Упал на конфликте? Отлично, чини сразу, а не в проде!

3. Дисциплина, блядь: Перед тем как глубоко в работу нырнуть и перед тем, как пулл-реквест создавать — всегда обновляюсь. Банально, но сколько же распиздяев этого не делает!

git fetch origin
git rebase origin/main  # Люблю чистую историю, без merge-коммитов как соплей
# Ну или если команда любит шары, то git merge origin/main

4. Ну а если всё-таки припёрло: Тут без магии. Берёшь и разбираешься.

# 1. Запускаешь тот самый rebase или merge, который обосрался.
# 2. Включаешь визуалку, чтобы не ебаться с текстом в консоли:
git mergetool --tool=vscode  # или meld, что тебе привычнее
# 3. Починил файлы, добавил и поехал дальше:
git add <разрешенные_файлы>
git rebase --continue  # Если мержил, то просто git commit

5. Главное — договориться: Всякие YAML, JSON, Terraform-конфиги — это же пиздопроебибна для конфликтов. Поэтому вводим линтеры и автоформатеры (типа Prettier или yamlfmt). Чтобы у всех код выглядел одинаково, и не было этих споров, какого хуя тут два пробела, а у тебя четыре. И тогда жить становится проще, ей-богу.