Git WindowsLinux

Git: fatal: refusing to merge unrelated histories

  • Обновлено
  • Чтение ≈ 4 минуты

Краткий ответ

Git не объединяет два репозитория без общего предка: например, локальный репозиторий создан отдельно от удалённого. Ниже — причины и порядок действий от простого к сложному.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Если не помогло
  5. Решение
  6. Альтернативы
  7. Проверка перед объединением

#Что означает ошибка

Сообщение
fatal: refusing to merge unrelated histories

Ошибка fatal: refusing to merge unrelated histories возникает, когда Git объединяет две ветки без общего предка. Типичный случай: вы создали локальный репозиторий с коммитом, а на сервере уже есть README или лицензия, созданные при создании проекта.

Git защищает от случайного смешения проектов.

Если вы уверены, что объединение нужно, разрешите его явно.

Git не объединяет два репозитория без общего предка: например, локальный репозиторий создан отдельно от удалённого. Если вы осознанно хотите объединить, используйте --allow-unrelated-histories.

#Причины и решения

Возможная причинаКак узнатьЧто делать
Разные репозиторииGit не находит общего предка двух независимых наборов коммитовОбъединяйте истории только если это сознательно два начала одного проекта.
Удалённый репозиторий с первым коммитомНа GitHub создан отдельный коммит README, локально — свой первый коммитПосле fetch и резервной копии используйте осознанный merge с разрешением независимых историй.
Неверный remoteВ git remote -v указан вообще другой проектНичего не сливайте; уточните адрес и владельца.
Переписанная историяУдалённая история была перезаписана, общий предок больше не достижимНе переписывайте повторно; выясните ситуацию у команды и сравните журналы.

#Пошаговое решение

  1. Проверьте адрес удалённого репозиторияОткройте терминал в корне проекта и выполните git remote -v; проверьте, что origin указывает на ваш репозиторий, а не на похожее имя другого проекта. Выполните git status — текущие несохранённые изменения запишите и сохраните до операций слияния. Если адрес ошибочный, исправьте его только после подтверждения владельца и точного URL. При сомнениях не используйте --allow-unrelated-histories: Git специально предупреждает о двух независимых историях.
  2. Сделайте резервную веткуДо изменения истории выполните git branch --show-current, git log -1 --oneline и git fetch origin (fetch скачивает сведения без объединения рабочих файлов). Посмотрите список удалённых веток: git branch -r, затем граф: git log --oneline --graph --decorate --all -n 30. Если локальная и удалённая ветки были созданы независимо (например, README добавлен на GitHub отдельно от локальных файлов), у них может не быть общего предка. Сохраните копию каталога проекта и создайте резервную ветку git branch backup-before-merge — не используйте это имя повторно, если ветка уже существует.
  3. Объедините с флагомТолько если подтверждено, что это один проект с двумя независимыми началами, выберите правильную ветку сервера (ниже пример origin/main) и выполните в чистом рабочем каталоге git merge --allow-unrelated-histories origin/main. Эту команду запускают после git fetch origin, находясь на своей локальной ветке. Если появится окно редактора сообщения коммита, сохраните его и закройте; если Git сообщает CONFLICT, остановитесь и перейдите к следующему шагу. Не выполняйте pull --rebase --allow-unrelated-histories: это не штатный способ решить данную ошибку.
  4. Разрешите конфликтыПри конфликте выполните git status: Git перечислит файлы с пометкой both added/both modified. Откройте каждый файл в редакторе и осмысленно объедините нужные версии; удалите маркеры <<<<<<<, =======, >>>>>>>. Затем git add конкретные исправленные файлы и git commit для завершения слияния. Если сомневаетесь, выполните git merge --abort до завершения коммита, убедитесь в исходном состоянии и попросите помощь. Не выбирайте автоматически «взять всё из удалённой версии», когда это может стереть локальную работу.
  5. Отправьте результатПосле успешного слияния выполните git status, затем git log --oneline --graph --all -n 20, чтобы увидеть общий коммит. Если это именно ожидаемый результат, запустите тесты проекта и только затем отправляйте ветку обычным git push -u origin main (имя main — пример, узнайте актуальное через git branch --show-current). При отказе сервера не применяйте git push --force; разберитесь с правами или новыми коммитами, которые появились параллельно.
  6. Команды просмотра безопасны; merge — условная отдельная операция
    Linux · Терминал (Bash)Команда
    Команды просмотра безопасны; merge — условная отдельная операция.
    # Выполнять только в корне подтверждённо правильного репозитория
    git remote -v
    git status
    git fetch origin
    git branch -r
    git log --oneline --graph --all -n 30
    # Только после резервной копии и проверки того, что это один проект:
    # git merge --allow-unrelated-histories origin/main

#Если не помогло

Используйте флаг только если уверены в том, что объединяете нужные репозитории.

#Решение

Выполните git pull origin main --allow-unrelated-histories. Git объединит истории и создаст коммит слияния. Если возникнут конфликты (чаще всего README.md или .gitignore), откройте файлы, выберите нужные строки между маркерами <<<<<<< и >>>>>>>, затем git add . и git commit. Потом git push.

#Альтернативы

Если на сервере уже есть отдельный первый коммит с README, объединение через осознанный git merge --allow-unrelated-histories origin/main сохраняет обе истории. Не используйте git push --force, --force-with-lease или переписывание удалённой истории как общее решение: можно потерять чужие коммиты. После слияния проверьте журнал и только затем отправляйте изменения.

#Проверка перед объединением

Убедитесь, что вы подключили правильный remote: git remote -v — иногда адрес указывает на чужой проект. Сравните истории: git log --oneline --graph --all. Проверьте, что ветки названы одинаково (main и master). Создайте резервную ветку на случай ошибки: git branch backup. Не используйте --allow-unrelated-histories ради обхода, если не понимаете происхождение истории.

Linux · Терминал (Bash)С осторожностью
Если origin/main отсутствует или проект другой, не выполнять. Откат незавершённого слияния: git merge --abort.
# Резервная ветка (имя должно быть свободным):
git branch backup-before-merge
# После fetch и проверки origin/main, при ЧИСТОМ рабочем каталоге:
git merge --allow-unrelated-histories origin/main

Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.