Git отказывается объединять несвязанные истории при ребазе


2153

Во git rebase origin/developmentвремя следующего сообщения об ошибке отображается из Git:

fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

Моя версия Git 2.9.0. Раньше нормально работал в предыдущей версии.

Как я могу продолжить эту перебазирование, разрешив несвязанные истории с принудительным флагом, введенным в новом выпуске?


12
@Shishya При всем уважении ответ, получивший наибольшее количество голосов, не решает этот вопрос напрямую. Вопрос требует git-rebaseситуации, в то время как ответ дает флаг дляgit-merge
Shubham Chaudhary

13
@AsifMohammed это не то, для чего принятый ответ . Люди автоматически найдут ответ с наибольшим количеством голосов из-за сортировки голосов по умолчанию.
Глорфиндель

2
В случае, если кто-то еще совершил ту же ошибку, я получил эту ошибку после случайного использования git pull [repo URL]вместоgit clone [repo URL]
rsoren


35
Беспорядок был сделан здесь из-за того факта, что в заголовке не указано, что это происходит в контексте перебазирования, поэтому ваш вопрос привлекает Googlers, которые получают эту ошибку в разных контекстах, и выдает ответ, который на самом деле не отвечает применитесь к вопросу, который вы задали. Это не может быть легко очищено сейчас, поэтому непоследовательная пара вопросов и ответов останется на сайте и будет высоко в результатах поиска Google навсегда. Мораль этой истории в том, что названия вопросов имеют значение!
Марк Амери

Ответы:


2620

Поведение по умолчанию изменилось с Git 2.9:

«git merge» используется, чтобы разрешить объединение двух ветвей, которые по умолчанию не имеют общей базы, что привело к созданию совершенно новой истории существующего проекта, а затем было получено ничего не подозревающим сопровождающим, что позволило слить ненужную параллельную историю с существующим проектом , Команда научена не разрешать это по умолчанию , с --allow-unrelated-historiesопцией аварийной штриховки, которая будет использоваться в редком случае, который объединяет истории двух проектов, которые начали свою жизнь независимо.

Смотрите журнал изменений Git для получения дополнительной информации.

Вы можете использовать, --allow-unrelated-historiesчтобы слияние произошло.


18
Знайте изменение слияния, но этот вариант не будет работать с ребазом
Шубхам Чаудхари

3
Есть ли опция, которая будет включаться --allow-unrelated-historiesпостоянно?
Jmarceli

4
@jmarceli "Поскольку такое" слияние двух проектов "является редким событием, опция конфигурации, позволяющая всегда разрешать такое слияние, не добавляется." Так что нет.
blue112 25.11.16

2
Я попытался объединить ветку для другого репо, но он создал новый коммит в моей текущей ветке и не сохранил историю из другого репо. Затем я извлек локальную ветку из другого репозитория, и только после этого слил ее, и внезапно появился нормальный коммит слияния. Weird.
мгол

13
Отлично, работает git pullтакже. Был в том «редком событии, которое объединяет истории двух проектов, которые начали свою жизнь самостоятельно». git --work-tree="." pull --allow-unrelated-histories
Петру Захария

1192

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

Использование --allow-unrelated-historiesфлага работало с запросом на получение таким образом:

git pull origin branchname --allow-unrelated-histories

232
Я всегда вижу эту ошибку, если когда я создаю новый репозиторий Github с README.md, а затем перетаскиваю его в локальный репозиторий в первый раз. Так раздражает.
Тиен До

29
Для новых репо, сначала тянет, как правило, лучше начать с git clone.
Umbrella

3
@PardeepJain Пожалуйста, смотрите этот github.com/git/git/blob/master/Documentation/RelNotes/…
adi

2
Это остановило меня на несколько часов, прежде чем я понял, что должно быть очевидное разрешение для объединения файлов, как это происходит, если это происходит для файлов по умолчанию - я рад, что я не единственный, у кого была эта проблема, по крайней мере!
Zibbobz

3
В моем случае это произошло потому, что я добавил файл лицензии на github. Упомянутая выше команда (и ниже они одинаковые) сработала.
Удадди


266

Я получил эту ошибку, когда я сначала установил локальный репозиторий. Затем я пошел на GitHub и создал новый репозиторий. Потом я побежал

git remote add origin <repository url>

Когда я пытался толкать или тянуть, я fatal: unrelated_historiesкаждый раз получал одну и ту же ошибку.

Вот как я это исправил:

git pull origin master --allow-unrelated-histories
git merge origin origin/master
... add and commit here...
git push origin master

Я думаю, что мы были в одной лодке. Чтобы добавить что-то: Моя проблема заключалась в том, что в удаленном репо уже было что-то. Так что в моей папке он удалил .gitпапку, запустил git initи сделал то, что сказала Адития, за исключением части слияния.
codepleb

1
Как нажать кнопку INSERT на Mac? На самом деле, я должен набрать сообщение коммита и выполнить слияние из командной строки, но я не знаю, как это сделать из командной строки.
Shajeel Afzal

Открывается ли vim? Если это так, то это просто SHIFT +:
Adithya Bhat

Даже я сначала создал репозиторий GitHub и проходил через эти команды добавления репо.
г-н Сурия Джа

1
Это действительно хороший ответ. Дело в том, что вы должны принудительно вытянуть, а затем объединить локальное и удаленное репо.
alanwsx


136
git pull origin <branch> --allow-unrelated-histories

Вы будете перенаправлены в окно редактирования Vim:

  • Вставить сообщение коммита
  • Затем нажмите Esc(чтобы выйти из режима «Вставка»), затем :(двоеточие), затем x(маленькая «х») и, наконец, нажмите, Enterчтобы выйти из Vim.
  • git push --set-upstream origin <branch>

5
Ctrl + X не выведет вас из Vim
Рубен

но :x<Enter>будет
webKnjaZ

Спасибо за указание, как выйти; Я был полностью потерян, и все другие ответы, кажется, предполагают, что это очевидно!
учусь


47

Пытаться git pull --rebase development


Это решило мою проблему. Вот как началась проблема
Харлан Нельсон

1
Это, вероятно, должно быть:git pull --rebase=preserve --allow-unrelated-histories development
Риккардо Мурри

3
@RiccardoMurri Только что попробовал это, я не сделал бы это снова. В моем новом репо было несколько примеров файлов инициализации, а в локальных репо были зафиксированы месячные коммиты. Выполнение этого ( newOrigin branchвместо development) добавило начальную фиксацию к вершине моей локальной ветки, фактически удалив из нее почти все. Я хотел, чтобы начальный коммит с нового пульта был внизу.
redOctober13,

42

Для Android Studio и IntelliJ:

Во-первых, совершайте все и разрешайте любые конфликты.

Затем откройте терминал снизу IDE и введите:

git pull origin master --allow-unrelated-histories

Теперь вы можете нажать.


38

ВНИМАНИЕ, ЭТО ПОТЕНЦИАЛЬНО ЗАПОЛНИТ ДИСТАНЦИОННОЕ ХРАНИЛИЩЕ

Это сработало для меня:

git push origin master --force

1
Но что на самом деле происходит с локальными и удаленными файлами?
Prathamesh Больше

Насколько я знаю и опытный, локальные файлы не повреждены. Удаленные файлы, которые вы хотите добавить в определенную папку, будут добавлены.
Аникет Патил


Просто включите заявление об отказе от ответственности, что эта команда переопределяет все файлы в основной ветке . Работал хорошо для меня. Спасибо.
Флавио

1
Это работает, но довольно резко, --allow-unrelad-историй более конкретны и уместны
bdulac

32

Поскольку все остальные ответы на самом деле не отвечают на вопрос, вот решение, вдохновленное этим ответом на связанный вопрос.

Итак, вы получаете свою ошибку, выполняя git rebase:

$ git rebase origin/development
fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

Эта ошибка на самом деле не отменяет ребаз, но вы сейчас находитесь в середине:

$ git status
interactive rebase in progress; onto 4321beefdead
Last command done (1 command done):
   pick 1234deadbeef1234deadbeef test merge commit

Теперь вы можете выполнить слияние вручную. Узнайте родительские коммиты исходного коммита слияния:

$ git log -1 1234deadbeef1234deadbeef
commit 1234deadbeef1234deadbeef
Merge: 111111111 222222222
Author: Hans Dampf
Date:   Wed Jun 6 18:04:35 2018 +0200

    test merge commit

Выясните, какой из двух родителей слияния является тем, который был слит с текущим (возможно, вторым, проверьте с помощью git log 222222222), а затем выполните слияние вручную, скопировав сообщение коммита исходного коммита слияния:

$ git merge --allow-unrelated 222222222 --no-commit
Automatic merge went well; stopped before committing as requested
$ git commit -C 1234deadbeef1234deadbeef
[detached HEAD 909af09ec] test merge commit
 Date: Wed Jun 6 18:04:35 2018 +0200
$ git rebase --continue
Successfully rebased and updated refs/heads/test-branch.

28

У меня такая же проблема. Проблема удаленная, что-то мешало этому.

Сначала я создал локальный репозиторий. Я добавил LICENSEи README.mdфайл в мой локальный и совершил.

Тогда я хотел удаленное хранилище, поэтому я создал его на GitHub. Здесь я сделал ошибку, отметив «Инициализировать этот репозиторий с помощью README» , что также привело к созданию README.md в удаленном режиме.

Так что теперь, когда я побежал

git push --set-upstream origin master

Я получил:

error: failed to push some refs to 'https://github.com/lokeshub/myTODs.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes
(e.g. hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Теперь, чтобы преодолеть это, я сделал

git pull origin master

Что привело к следующей ошибке:

From https://github.com/lokeshub/myTODs
branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories**

Я старался:

git pull origin master --allow-unrelated-histories

Результат:

From https://github.com/lokeshub/myTODs
 * branch            master     -> FETCH_HEAD
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed;
fix conflicts and then commit the result.

Решение:

Я удалил удаленный репозиторий и создал новый (я думаю, что только удаление файла READMEмогло бы работать), и после этого сработало следующее:

git remote rm origin
git remote add origin https://github.com/lokeshub/myTODOs.git
git push --set-upstream origin master

25
Создание нового хранилища не является решением
Зак

3
мастер происхождения git pull - у меня сработали мелкие несвязанные истории .. Спасибо
SKalariya

git push --force ... было бы правильным решением на шаге 1 в данном конкретном случае
Константин Пелепелин

2
Это не решение. Если вы новичок, то вы можете сделать это, но если вы работаете с какими-то реальными проектами, вам придется иметь дело с правильным способом.
Prathamesh Больше

27

Обычно это происходит, когда вы впервые фиксируете удаленный репозиторий. Поскольку ошибка ясно говорит «отказ от слияния несвязанных историй», нам нужно использовать флаг --allow-unrelated-history.

git pull origin master  --allow-unrelated-histories

Теперь будут некоторые конфликты, которые мы должны решить вручную. После этого просто передайте код и нажмите его.


Как уже упоминалось в вопросе, я пытаюсь выполнить git-rebase, а не git-pull, git-rebase не имеет --allow-unrelated-historiesфлага.
Шубхам Чаудхари

25

Две возможности, когда это может произойти -

  1. Вы клонировали проект, и каталог .git каким-то образом был удален или поврежден. Это приводит к тому, что Git не знает о вашей локальной истории и, следовательно, заставляет его выдавать эту ошибку, когда вы пытаетесь отправить или извлечь из удаленного репозитория.

  2. Вы создали новый репозиторий, добавили в него несколько коммитов, и теперь вы пытаетесь извлечь из удаленного репозитория, который уже имеет некоторые свои коммиты. Git также выдаст ошибку в этом случае, так как он понятия не имеет, как связаны два проекта.

РЕШЕНИЕ

мастер происхождения git pull - мелкие-не связанные истории

Ссылка - https://www.educative.io/edpresso/the-fatal-refusing-to-merge-unrelated-histories-git-error


12

Я тоже боролся с этим, но мне удалось найти обходной путь.

Когда вы столкнетесь с ошибкой выше, просто выберите команду merge и затем продолжите ребазирование:

git cherry-pick -m 1 1234deadbeef1234deadbeef
git rebase --continue

3
В самолете английский пожалуйста?
Агент Зебра

@AgentZebra Для любого диска в комплексной плоскости непрерывный интеграл замкнутого пути равен 0.
Добавление

12

Сначала перенесите удаленные изменения в локальную систему, используя следующую команду:

git pull origin branchname --allow-unrelated-histories

** бранчаме мастер в моем случае.

Когда команда pull выполнена, возникает конфликт. Вы должны решить конфликты. Я использую Android Studio для разрешения конфликтов. введите описание изображения здесь

Когда конфликты решены, слияние завершено!

Теперь вы можете спокойно нажимать.


Я искал кнопку, чтобы Resolve Conflictв AS. Иногда всплывающее окно справа / вниз исчезает, и я ничего не могу сделать. Спасибо @oiyio
mochadwi


7

При этом git pullя получил это сообщение fatal: refusing to merge unrelated histories для модуля репо, где я некоторое время не обновлял локальную копию.

Я запустил эту команду, чтобы обновить локальную версию от источника. Я просто хотел получить последние новости от удаленного и не нуждался в локальных изменениях.

git reset --hard origin/master

Это исправило это в моем случае.


12
ВНИМАНИЕ: Это удалило ВСЕ мои файлы. Будьте осторожны, если не знаете, что делаете!
Сальви Паскуаль

2
Это удалит все ожидающие изменения!
Орестис П.


1

Я использую ребаз в течение многих лет, и я никогда не сталкивался с такой проблемой. Однако ваша первая проблема заключается в том, что вы пытаетесь сделать это непосредственно в удаленной ветви developmentиз удаленного хранилища, называемого origin. Это буквально неправильно, потому что rebase - опасная команда, которая перестраивает историю git. Сказав это, вы должны сначала примерить свой локальный репозиторий и нажать его только, если он работает для вас, как ожидалось.

Итак, мой обычный рабочий процесс ребазирования выглядит следующим образом (но, пожалуйста, имейте в виду, что вы не должны использовать ребаз в ветвях, которые вы не единственный комитет. Для таких ветвей используйте просто слияние и разрешение конфликтов, если применимо):

  1. убедитесь, что у вас есть чистое рабочее дерево (без изменений)
  2. checkout к ветке, на которую вы хотите сделать ребаз (например, скажем, это master; как однострочная команда):git checkout master && git pull origin master && git checkout development
  3. Сделайте фактическую перезагрузку: git rebase master
  4. Если все готово и все работает как положено, отправьте его на пульт. Для этого вам необходимо принудительно выполнить это, поскольку удаленный хост уже имеет историю в другом порядке, удаленный будет отвечать без нажатия кнопки. Итак, мы должны сказать, что «моя локальная версия истории верна, перезаписать все в этой удаленной ветви, используя мою локальную версию истории»:git push -f origin development

Как я уже упоминал, имейте в виду, что rebase манипулирует историей git, что обычно плохо. Тем не менее, это можно сделать на ветках, где никто больше не берет на себя обязательства. Для того, чтобы ветки могли работать с другими разработчиками, используйте другую стратегию слияния, такую ​​как слияние, сквош или вишневый кир. Итак, другими словами: Rebase не должен быть вашим инструментом для распределенной разработки. Это прекрасно работает для вас, если вы единственный, кто работает с этим хранилищем.

Мы используем функцию ветки стратегии. В этом я обычно использую rebase для получения «обновлений» от других разработчиков, которые происходили в это время в основной ветке. Это уменьшает размер коммитов, которые видны в запросе на получение. Поэтому рецензенту кода легче увидеть мои изменения, сделанные в этой ветви функций.


В этом случае, я на самом деле хотел продолжить ребазинг, и ответ не касается этого. Я знаю риски перебазирования и когда я должен и не должен использовать git-rebase. Это общее (самоуверенное) руководство для рабочего процесса git, которое не дает прямого ответа на вопрос. Что касается использования rebase в течение многих лет, эта конкретная ошибка была добавлена ​​в v2.9.0 в git, и этот поток работал нормально до этого выпуска. На то, что вы разместили в этом ответе, уже дан ответ на более старые вопросы, такие как stackoverflow.com/a/11566503/2670370 и git-scm.com/book/en/v2/Git-Branching-Rebasing
Shubham Chaudhary
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.