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
Ответ 5
Для этого введите команду:
git pull origin branchname --allow-unrelated-histories
Например,
git pull origin master --allow-unrelated-histories
Ссылка:
GitHub проблема, связанная с историями
Ответ 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. Сказав это, вы должны сначала примерить ваш локальный репозиторий и нажать только, если он работает для вас, как ожидалось.
Итак, мой обычный рабочий процесс перебазирования выглядит следующим образом (но имейте в виду, что вы не должны использовать перебазирование в ветвях, которые вы не единственный комитет. Для таких веток используйте просто объединение и разрешение конфликтов, если применимо):
- убедитесь, что у вас есть чистое рабочее дерево (без случайных изменений)
- извлеките ветку, на которую хотите перебазировать (например, скажем,
master
; как однострочную команду): git checkout master && git pull origin master && git checkout development
- Сделайте острый ребаз:
git rebase master
- Если все готово и все работает как положено, отправьте его на пульт. Для этого вам необходимо принудительно выполнить это, поскольку удаленный хост уже имеет историю в другом порядке, удаленный будет отвечать, ничего не нажимая. Итак, мы должны сказать, что "моя локальная версия истории верна, перезаписать все в этой удаленной ветки, используя мою локальную версию истории":
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
.