Git відмовляється об'єднати споріднені історії на Rebase


2144

Під 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

4
Можливий дублікат дозволити злиття
споріднених

35
Тут було зроблено безлад через те, що в заголовку не вказано, що це в контексті перезавантаження, тому ваше запитання втягується в Google, які отримують цю помилку в різних контекстах і викликають відповідь, яка насправді не відповідає застосувати до поставленого питання. Наразі це неможливо легко прибрати, тому непослідовна пара запитань і запитів назавжди залишиться на сайті та буде високою в результатах пошуку Google. Мораль історії полягає в тому, що заголовки питань мають значення!
Марк Амері

Відповіді:


2613

Поведінка за замовчуванням змінилася після Git 2.9:

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

Для отримання додаткової інформації див. Журнал змін Git випуску .

Ви можете використовувати, --allow-unrelated-historiesщоб змусити злиття відбутися.


18
Знайте зміни злиття, але ця опція не працюватиме з базою даних
Shubham Chaudhary

3
Чи є якийсь варіант, який увімкнеться --allow-unrelated-historiesназавжди?
jmarceli

4
@jmarceli "Оскільки таке" об'єднання двох проектів "є рідкісною подією, опція конфігурації, яка завжди дозволяє таке об'єднання, не додається." Так ні.
blue112

2
Я намагався таким чином об'єднати гілку для іншого репо, але це створило нову команду для моєї поточної гілки та не зберігало історію з іншого репо. Потім я перевірив місцеве відділення з іншого репо і лише потім об'єднав його і раптом з'явився звичайний комітет злиття. Дивно.
мгмоль

13
Відмінно, працює і з git pull. Був у тій "рідкісній події, яка об'єднує історії двох проектів, які самостійно розпочали своє життя". git --work-tree="." pull --allow-unrelated-histories
Петру Захарію

1188

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

Використовуючи --allow-unrelated-historiesпрапор, що працює із запитом на тягнення таким чином:

git pull origin branchname --allow-unrelated-histories

231
Я завжди бачу цю помилку, якщо коли створюю нове сховище Github з README.md, то перетягую його до локального сховища в перший раз. Так дратує.
Тянь-ду

29
Для нових репостів, спочатку тягніть, як правило, краще почати з а git clone.
Парасолька

3
@PardeepJain Будь ласка, дивіться це github.com/git/git/blob/master/Documentation/RelNotes/…
adi

2
Це зупинило мене на кілька годин, перш ніж я зрозумів, що повинно бути очевидне рішення для злиття таких файлів, якщо це відбувається для файлів за замовчуванням - я радий, що я не єдиний, хто мав цю проблему принаймні!
Zibbobz

3
У моєму випадку це сталося тому, що я додав файл ліцензії в github. Команда, згадана вище (і нижче, вони однакові) спрацювала.
uudaddy

579

Спробуйте виконати таку команду:

git pull origin master --allow-unrelated-histories

Це повинно вирішити вашу проблему.


264

Я отримав цю помилку, коли спершу створив локальне сховище. Потім я зайшов до 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 +:
Адітія Бхат

Навіть я створив репо в GitHub першим і переглядав ці команди додавання репо.
Містер Сур’я Джа

1
Це дійсно гарна відповідь. Справа в тому, що вам потрібно змусити тягнути, а потім об'єднати локальну та віддалену репо.
alanwsx


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

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

  • Вставити повідомлення про фіксацію
  • Потім натисніть Esc(для виходу з режиму "Вставити"), потім :(двокрапка), потім x(маленький "х") і, нарешті, натисніть, Enterщоб вийти з Vim
  • git push --set-upstream origin <branch>

5
Ctrl + X не виведе вас з Vim
Ruben

але :x<Enter>буде
webKnjaZ

101

У мене була така ж проблема. Спробуйте це:

git pull origin master --allow-unrelated-histories 

git push origin master

47

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


Це вирішило мою проблему. Ось як почалася проблема
Харлан Нельсон,

1
Мабуть, це повинно бути:git pull --rebase=preserve --allow-unrelated-histories development
Ріккардо Муррі

3
@RiccardoMurri Щойно спробувавши це, я б більше не робив цього. У моєму новому репо було вміщено кілька зразкових файлів ініціалізації, а мій місцевий репо-місяць вартує комітів. Запуск цього ( newOrigin branchа не замість цього development) додав початкову комісію до вершини моєї місцевої гілки, фактично видаляючи з неї майже все. Я хотів, щоб початкова комісія з нового пульта була внизу.
redO жовтня13

41

Для Android Studio та IntelliJ:

По-перше, вчинити все і вирішити будь-які конфлікти.

Потім відкрийте термінал знизу IDE і введіть:

git pull origin master --allow-unrelated-histories

Тепер ви можете натиснути.


38

ПОПЕРЕДЖЕННЯ ЦЕ БУДЕ ПОТЕНЦІАЛЬНО ЗВЕРНІТЬ ДИСТАНЦІЙНУ РЕПОЗИТОРІЮ

Це працювало для мене:

git push origin master --force

1
Але що насправді відбувається з локальними та віддаленими файлами?
Пратамеш Більше

Як я знаю і досвід, локальні файли є неушкодженими. Додано віддалені файли, які потрібно додати в певну папку.
Анікет Патіл


Просто включіть застереження, що ця команда перекриває всі файли в головній гілці . Добре працював для мене. Дякую.
Флавіо

1
Це працює, але досить суворе, - Дозвольте нерегламентовані історії більш конкретні та доречні
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 master master
Дозвольте

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

2
Це не рішення. Якщо ви початківець, то можете це зробити, але якщо ви працюєте з якимись реальними проектами, вам слід мати справу з належним чином.
Пратамеш Більше

27

Зазвичай це відбувається, коли ви вперше здійснюєте віддалене сховище. Оскільки помилка чітко говорить про "відмову в об'єднанні споріднених історій", нам потрібно використовувати - прапорець "Незалежно від історії".

git pull origin master  --allow-unrelated-histories

Зараз виникли б деякі конфлікти, які нам доведеться вирішувати вручну. Після цього просто введіть код і натисніть його.


Як згадувалося в запитанні, я намагаюся зробити git-rebase, а не git-pull, git-rebase не має --allow-unrelated-historiesпрапора.
Shubham Chaudhary

24

Дві можливості, коли це може статися -

  1. Ви клонували проект і, якось, каталог .git видалили або пошкодили. Це призводить до того, що Git не знає про свою краєзнавчу історію, а тому спричинить цю помилку, коли ви намагаєтесь натиснути або витягнути з віддаленого сховища.

  2. Ви створили нове сховище, додали до нього кілька комісій, і тепер ви намагаєтеся витягнути з віддаленого сховища, у якого вже є деякі власні комісії. Git також видасть помилку в цьому випадку, оскільки не має уявлення про те, як пов'язані два проекти.

РІШЕННЯ

git pull origin master - дозволити неспоріднені історії

Ref - https://www.educative.io/edpresso/the-fatal-refusing-to-merge-unrelated-histories-git-error


12

Я також боровся з цим, але мені вдалося знайти вирішення.

Коли ви зіткнетесь з помилкою, наведеною вище, просто виберіть команду злиття та продовжуйте ребайт

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

3
Англійською літаком, будь ласка?
Агент Зебра

@AgentZebra Для будь-якого диска в складній площині неперервний інтеграл замкнутого шляху дорівнює 0.
Addem

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. Це буквально неправильно, оскільки перезавантаження - це небезпечна команда, яка реструктурує історію git. Сказавши це, спершу слід спробувати своє місцеве сховище та натиснути його, лише якщо воно працює для вас, як очікувалося.

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

  1. переконайтеся, що у вас є чисте робоче дерево (без невмілих змін)
  2. підписка на гілку, на яку потрібно повторно базуватись (наприклад, скажімо, це master; як однорядкова команда):git checkout master && git pull origin master && git checkout development
  3. Зробіть фактичну ребазу: git rebase master
  4. Якщо це зроблено, і все працює, як очікувалося, відсуньте його на пульт. Для цього вам потрібно це змусити, оскільки віддалений хост вже має історію в іншому порядку, віддалений відповість, нічого не натискаючи. Отже, нам потрібно сказати "моя локальна версія історії правильна, перезаписати все на цій віддаленій гілці, використовуючи мою локальну версію історії":git push -f origin development

Як я вже згадував, майте на увазі, що база даних маніпулює історією 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 Чаудхари

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.