🐛 Типичные ошибки — Merge-конфликты, monorepo

К оглавлению урока

⚡ Топ ошибок

  • ⚠️ Оставить маркеры конфликта <<<<<<< в файле — код сломается
  • ⚠️ find . -type d -name ".git" -exec rm -rf {} + — БЕЗВОЗВРАТНО теряет историю
  • Забыть git add перед git merge --continue
  • Не проверить git status после разрешения конфликта

Ошибка 1 (КРИТИЧНО): find ... rm -rf .git при миграции в monorepo

⚠️ ОПАСНО: find . -type d -name ".git" -exec rm -rf {} +

Эта команда удаляет директории .git во всех поддиректориях. После выполнения вы безвозвратно потеряете всю историю коммитов во всех вложенных репозиториях — коммиты, ветки, теги, метаданные.

«Мы потеряем коммиты в индивидуальных репозиториях, так как удаляется .git вместе с содержимым» — из лекции.

Обязательно перед выполнением:
1. Проверить что именно будет удалено:
find . -type d -name ".git" (без -exec)

2. Создать резервные копии всех репозиториев:
git bundle create repo.bundle --all

3. Убедиться, что вы находитесь в правильной директории (pwd), а не в корне файловой системы

Восстановление невозможно без предварительной резервной копии.

Ошибка 2: Оставить маркеры конфликта в файле

Проблема: незакрытый конфликт
После разрешения конфликта вы случайно оставили маркеры в файле:
# НЕПРАВИЛЬНО — файл с оставленными маркерами:
function processData(data) {
<<<<<<< HEAD
    return data.filter(item => item.active);
=======
    return data.filter(item => item.enabled);
>>>>>>> feature-branch
}

Если это Python-скрипт, bash-скрипт или любой другой исполняемый файл — он упадёт с синтаксической ошибкой. Если это конфигурационный файл — приложение не запустится.

Решение: Всегда проверяйте файл после разрешения конфликта. Git может помочь:

# Найти незакрытые маркеры конфликта
grep -rn "^<<<<<<<" .
grep -rn "^=======$" .
grep -rn "^>>>>>>>" .

Ошибка 3: Забыть git add перед merge --continue

# ПЛОХО — разрешили конфликт, но не добавили файл
nano merge.txt   # убрали маркеры
git merge --continue
# fatal: There is no merge in progress; did you forget to call git merge?
# или
# error: Committing is not possible because you have unmerged files.

# ПРАВИЛЬНО
nano merge.txt        # разрешить конфликт
git add merge.txt     # пометить как разрешённый
git merge --continue  # завершить слияние

Ошибка 4: Не использовать git status для диагностики

После git merge с конфликтом многие сразу пытаются исправить файлы, не посмотрев git status.

# ВСЕГДА начинать диагностику с:
git status
# On branch main
# You have unmerged paths.
# Unmerged paths:
#   both modified:   merge.txt
#   both modified:   another-file.py

# Это покажет ВСЕ конфликтующие файлы — их может быть несколько!

Ошибка 5: merge --abort вместо разрешения

Если что-то пошло не так в процессе разрешения конфликта — можно отменить весь merge:

# Отменить незавершённое слияние и вернуться в состояние до merge
git merge --abort

# После этого можно попробовать снова с другой стратегией

Но это не решение — конфликт никуда не делся. Нужно разрешать его, а не избегать.