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

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

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

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

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

Ответ 1

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

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

Дополнительную информацию смотрите в журнале изменений релиза Git.

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

Ответ 2

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

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

git pull origin branchname --allow-unrelated-histories

Ответ 3

Попробуйте следующую команду:

git pull origin master --allow-unrelated-histories

Это должно решить вашу проблему.

Ответ 4

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

git remote add origin <repository url>

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

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

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

Ответ 6

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

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

  • Вставить сообщение коммита
  • Затем нажмите Ctrl + X, чтобы выйти из Vim
  • git push --set-upstream origin <branch>

Ответ 7

У меня такая же проблема. Попробуй это:

git pull origin master --allow-unrelated-histories 

git push origin master

Ответ 8

Попробуйте git pull --rebase development

Ответ 9

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

git push origin master --force

Ответ 10

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

Итак, вы получаете ошибку, делая 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.

Ответ 11

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

Сначала я создал локальный репозиторий. Я добавил 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

Ответ 12

Если вы попытаетесь направить некоторый код в удаленный репозиторий на github, и вот что произойдет, когда вы вытащите удаленный репозиторий.

Это просто из-за того, что по умолчанию запрещается использование локального репозитория и удаленного репозитория.

Вы можете попытаться написать git pull origin master --allow-unrelated-histories, чтобы исправить эту проблему. Надеюсь, что вам помогут!

Ответ 13

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

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

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

Ответ 14

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

git pull origin master  --allow-unrelated-histories

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

Ответ 15

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

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

  1. убедитесь, что у вас есть чистое рабочее дерево (без случайных изменений)
  2. извлеките ветку, на которую хотите перебазировать (например, скажем, 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 для получения "обновлений" от других разработчиков, которые происходили в это время в основной ветке. это уменьшает размер коммитов, которые видны в запросе на получение. Поэтому рецензенту кода легче увидеть мои изменения, сделанные в этой ветки функций.

Ответ 16

Одна вещь, которую я хочу добавить здесь, я пытался подтолкнуть коммиты старого репо к вновь созданному, когда получил ту же ошибку. Я обошел его. Если в новом репо есть файл с тем же именем, что и старый, тогда u получит ошибку как я. У меня был тот же файл с именем README.md в обоих репозиториях. Вот что я получил при запуске git pull --rebase development

.
.
.
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
error: Failed to merge in the changes.
Patch failed at 0020 added readme
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

После исправления конфликта слияния mannually и внесения изменений, когда я запустил этот git rebase --continue, я получил:

Applying: added readme
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

Затем я запустил git rebase --skip для перемещения вперед и снова получил ту же ошибку слиянием конфликта для README.md. За каждый раз, когда я перешел на README.md, я получил эту ошибку, и каждый раз мне приходилось вручную удалять конфликт, фиксировать изменения и затем запускать, git rebase --continue и git rebase --skip. Поскольку в моем случае README.md был не так уж много обновлен, я обошел это. Быстрый рабочий стол состоял бы в том, чтобы переименовать все конфликтующие файлы имен нового репо в другое, а затем запустить git pull --rebase development.