Git, ilgisiz geçmişleri rebase üzerinde birleştirmeyi reddediyor


2148

git rebase origin/developmentGit sırasında aşağıdaki hata mesajı gösterilir:

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

Git sürümüm 2.9.0. Önceki sürümde iyi çalışırdı.

Yeni sürümde tanıtılan zorunlu bayrakla ilgisiz geçmişlere izin vererek bu yeniden pazarlamaya nasıl devam edebilirim?


12
@Shishya Tüm bu saygıyla en çok oy alan cevap bu soruyu doğrudan çözmez. Soru bir git-rebasecevap verirken durum soruyorgit-merge
Shubham Chaudhary

13
@ AsifMohammed kabul edilmiş bir cevap için değildir. Kullanıcılar , oylara göre varsayılan sıralama nedeniyle cevabı otomatik olarak en fazla oyla bulacaktır.
Glorfindel

2
Durumda başkasının yanlışlıkla kullandıktan sonra bu hata var, aynı hatayı yaptı git pull [repo URL]yerinegit clone [repo URL]
rsoren


35
Başlığın bunun bir rebase bağlamında olduğunu belirtmemesi nedeniyle bir karmaşa yapıldı , bu nedenle sorunuz bu hatayı farklı bağlamlarda alan ve aslında olmayan bir cevabı iptal eden Google çalışanlarında çizim yapıyor sorduğunuz soruya başvurun. Artık kolayca temizlenemiyor, bu nedenle tutarsız Soru-Cevap çifti sitede kalacak ve Google arama sonuçlarında sonsuza kadar yüksek kalacak. Hikayenin ahlaki, soru başlıklarının önemli olduğu!
Mark Amery

Yanıtlar:


2614

Varsayılan davranış Git 2.9'dan bu yana değişti:

"git merge" varsayılan olarak ortak bir temeli olmayan iki şubenin birleştirilmesine izin vermek için kullanılır, bu da mevcut bir projenin yepyeni bir geçmişinin yaratılmasına ve ardından var olmayan bir paralel tarihin mevcut projeye birleştirilmesine izin veren şüphesiz bir sürdürücü tarafından çekilmesine yol açar. . Komuta, hayatlarına bağımsız olarak başlayan iki projenin tarihlerini birleştiren nadir bir olayda kaçış kapağı seçeneği ile varsayılan olarak buna izin vermemesi öğretildi --allow-unrelated-histories.

Daha fazla bilgi için Git sürümü değişiklik günlüğüne bakın .

--allow-unrelated-historiesBirleştirmeyi zorlamak için kullanabilirsiniz .


18
Birleştirme değişikliğini bilin, ancak bu seçenek rebase ile çalışmaz
Shubham Chaudhary

3
--allow-unrelated-historiesKalıcı olarak açılacak herhangi bir seçenek var mı ?
jmarceli

4
@jmarceli "Böyle bir" iki proje birleştirme "nadir bir olay olduğundan, böyle bir birleştirmeye her zaman izin verecek bir yapılandırma seçeneği eklenmez." Yani hayır.
blue112

2
Bir şubeyi bu şekilde farklı bir repo için birleştirmeye çalıştım ama mevcut şubemde yeni bir taahhüt yarattı ve tarihi diğer repodan tutmadı. Sonra diğer repodan yerel bir şubeyi kontrol ettim ve ancak daha sonra birleştirdim ve aniden normal birleştirme taahhüdü ortaya çıktı. Tuhaf.
mgol

13
Mükemmel, ile git pullde çalışır . "Hayatlarını bağımsız olarak başlatan iki projenin tarihlerini birleştiren nadir bir olay" idi. git --work-tree="." pull --allow-unrelated-histories
Petru Zaharia

1189

Benim durumumda, hata sadece fatal: refusing to merge unrelated historiesher denemede, özellikle bir Git deposu uzaktan eklendikten sonra ilk çekme isteği.

Kullanımı --allow-unrelated-historiesbu şekilde bir çekme isteği ile çalıştı bayrağı:

git pull origin branchname --allow-unrelated-histories

231
Bir README.md ile yeni bir Github havuzu oluşturduğumda, ilk kez yerel bir depoya çektiğimde bu hatayı her zaman görüyorum. Çok rahatsız edici.
Tien Do

29
Yeni depolar için, önce çeker, genellikle a ile başlamak daha iyidir git clone.
Şemsiye


2
Varsayılan dosyalar için bu gibi dosyaları birleştirmek için bariz bir çözüm olması gerektiğini fark etmeden önce bu beni birkaç saat durdurdu - En azından bu sorunu yaşayan tek kişi ben değilim sevindim!
Zibbobz

3
Benim durumumda github'a lisans dosyası eklediğim için oldu. Yukarıda belirtilen komut (ve aşağıda aynıdır) çalıştı.
uudaddy

580

Aşağıdaki komutu deneyin:

git pull origin master --allow-unrelated-histories

Bu probleminizi çözmeli.


265

Önce yerel bir depo kurduğumda bu hatayı aldım. Sonra GitHub'a gittim ve yeni bir depo oluşturdum. Sonra koştum

git remote add origin <repository url>

İtmeye veya çekmeye çalıştığımda, fatal: unrelated_historiesher seferinde aynı hatayı aldım .

İşte nasıl düzelttim:

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

Sanırım aynı gemideydik. Bir şey eklemek için: Benim sorunum, uzak depoda zaten bir şey olmasıydı. Klasörümde klasörü sildi .git, koştu git initve birleştirme kısmı dışında Adithya'nın söylediklerini yaptı.
codepleb

1
Mac'te INSERT düğmesine nasıl basılabilir? Aslında, taahhüt mesajını yazmak ve komut satırından birleştirmek zorundayım, ama komut satırından nasıl yapacağımı bilmiyorum.
Shajeel Afzal

Vim açar mı? Eğer öyleyse, sadece SHIFT +:
Adithya Bhat

Ben bile önce GitHub repo'yu yaratmıştım ve bu repo ekleme komutlarından geçiyordum.
Bay Suryaa Jha

1
Bu gerçekten iyi bir cevap. Buradaki nokta, çekmeyi zorlamanız ve ardından yerel ve uzak repoyu birleştirmeniz gerektiğidir.
alanwsx

151

Bunun için şu komutu girin:

git pull origin branchname --allow-unrelated-histories

Örneğin,

git pull origin master --allow-unrelated-histories

Referans:

GitHub ilgisiz geçmiş sorunu


ilk kez teşekkürler benim için çalışmalarını çekin "git çekme kökeni usta - allow-ilgisiz-geçmişler"
Ankitkumar Makwana

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

Bir Vim düzenleme penceresine yönlendirileceksiniz:

  • Tamamlama mesajı ekle
  • Sonra Esc("Ekle" modundan çıkmak için), sonra :(iki nokta üst üste), ardından x(küçük "x") tuşlarına basın ve sonunda EnterVim'den çıkmak için vurun
  • git push --set-upstream origin <branch>

5
Ctrl + X sizi Vim'den çıkarmayacak
Ruben

but :x<Enter>will
webKnjaZ

101

Ben de aynı problemi yaşadım. Bunu dene:

git pull origin master --allow-unrelated-histories 

git push origin master

47

Deneyin git pull --rebase development


Bu benim sorunumu çözdü. Sorun şu şekilde başladı
Harlan Nelson

1
Bu muhtemelen şöyle olmalıdır:git pull --rebase=preserve --allow-unrelated-histories development
Riccardo Murri

3
@RiccardoMurri Bunu denedikten sonra tekrar yapmam. Yeni repo'mda bazı örnek başlatma dosyaları ve yerel repo aylarım taahhüt edildi. Bunu ( newOrigin branchyerine development) çalıştırmak , yerel şubemin üst kısmına ilk taahhüdü ekledi ve neredeyse her şeyi etkili bir şekilde kaldı. Yeni uzaktan kumandanın ilk taahhüdünün en altta olmasını istedim.
redOctober13

42

Android Studio ve IntelliJ için:

İlk olarak, taahhüt her şey ve herhangi çatışmaları çözmek.

Ardından IDE'nin altından terminali açın ve şunu girin:

git pull origin master --allow-unrelated-histories

Şimdi itebilirsiniz.


38

UYARI BU UZAKTAN TEKLİFİ POTANSİYEL OLARAK YAZAR

Bu benim için çalıştı:

git push origin master --force

1
Ancak yerel ve uzak dosyalarda gerçekte ne olur?
Prathamesh Daha fazla

Bildiğim ve deneyimlediğim gibi, yerel dosyalar sağlam. Belirli bir klasöre eklemek istediğiniz uzak dosyalar eklenir.
Aniket Patil


Bu komutun ana daldaki tüm dosyaları geçersiz kıldığı bir sorumluluk reddi beyanı eklemeniz yeterlidir . Benim için iyi çalıştı. Teşekkürler.
Flavio

1
Çalışıyor ama oldukça sert, --allow-unrelad-history'leri daha spesifik ve uygun
bdulac

32

Diğer tüm cevaplar aslında soruyu cevaplamadığından , ilgili bir soru üzerine bu cevaptan esinlenen bir çözüm .

Böylece hatanızı alırsınız git rebase:

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

Bu hata aslında rebase'i iptal etmez, ancak şimdi ortasındasınız:

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

Böylece birleştirmeyi elle yapabilirsiniz. Orijinal birleştirme taahhüdünün ana taahhütlerini öğrenin:

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

    test merge commit

İki birleştirme ebeveynden hangisinin geçerli olanla birleştirildiğini öğrenin (muhtemelen ikincisi, ile doğrulayın git log 222222222) ve ardından birleştirmeyi el ile yapın ve orijinal birleştirme taahhüdünün taahhüt mesajını kopyalayın:

$ 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

Ben de aynı problemi yaşadım. Sorun uzaktan bunu önleyen bir şey vardı.

İlk önce yerel bir depo oluşturdum. Yerel ve kararlı bir LICENSEve README.mddosya ekledim .

Sonra uzak bir depo istedim, bu yüzden GitHub'da bir tane oluşturdum. Burada "Bu deposu bir README ile başlat" ı kontrol eden bir hata yaptım, bu da uzaktan bir README.md oluşturdu.

Şimdi koştuğumda

git push --set-upstream origin master

Bende var:

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.

Şimdi bunun üstesinden gelmek için yaptım

git pull origin master

Bu aşağıdaki hatayla sonuçlandı:

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

Denedim:

git pull origin master --allow-unrelated-histories

Sonuç:

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.

Çözüm:

Uzak depoyu kaldırdım ve yeni bir dosya oluşturdum (sadece dosya kaldırmanın READMEişe yaradığını düşünüyorum ) ve bundan sonra aşağıdakiler çalıştı:

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

25
yeni bir havuz oluşturmak bir çözüm değildir
Zach

3
git pull origin master - allow-ilgisiz-geçmişler benim için çalıştı .. Teşekkürler
SKalariya

git push --force ... Bu özel durumda 1. adımda uygun bir çözüm olacaktır
Konstantin Pelepelin

2
Bu bir çözüm değil. Yeni başlayan biriyseniz, bunu yapabilirsiniz, ancak bazı gerçek projelerle çalışıyorsanız, doğru yolla uğraşmanız gerekir.
Prathamesh

27

Bu genellikle uzak depoya ilk kez giriş yaptığınızda olur. Hata açıkça "ilişkisiz geçmişleri birleştirmeyi reddetmek" der, --allow-ilgisiz-geçmiş bayrağı kullanmak gerekir.

git pull origin master  --allow-unrelated-histories

Şimdi el ile çözmemiz gereken bazı çatışmalar olacaktır. Bundan sonra kodu taahhüt edin ve itin.


Soruda belirtildiği gibi, git-pull değil git-rebase yapmaya çalışıyorum, git-rebase --allow-unrelated-historiesbayrağı yok.
Shubham Chaudhary

24

Bunun olabileceği iki olasılık -

  1. Bir projeyi klonladınız ve bir şekilde .git dizini silindi veya bozuldu. Bu Git'in yerel geçmişinizin farkında olmamasına neden olur ve bu nedenle uzak depoya gitmeye veya buradan çekmeye çalıştığınızda bu hatayı atmasına neden olur.

  2. Yeni bir depo oluşturdunuz, buna birkaç taahhüt eklediniz ve şimdi zaten kendi taahhütlerine sahip olan uzak bir depodan çekmeye çalışıyorsunuz. Git de bu durumda hatayı atar, çünkü iki projenin nasıl ilişkili olduğu hakkında hiçbir fikri yoktur.

ÇÖZÜM

git pull origin master - allow-ilgisiz-geçmişler

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


12

Ben de bununla mücadele ettim, ama bir çözüm bulmayı başardım.

Yukarıdaki hatayla karşılaştığınızda, birleştirme taahhüdünü seçerek yeniden başlayın:

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

3
Uçakta lütfen?
Ajan Zebra

@AgentZebra Karmaşık düzlemdeki herhangi bir disk için sürekli bir kapalı yol integrali 0'dır.
Addem

12

İlk önce aşağıdaki komutu kullanarak yerel değişikliklerinizi yerel ayarınıza çekin:

git pull origin branchname --allow-unrelated-histories

** şube adı benim durumumda ustadır.

Çekme komutu tamamlandığında çakışma oluşur. Çatışmaları çözmelisin. Android Studio'yu çakışmaları çözmek için kullanıyorum. resim açıklamasını buraya girin

Çatışmalar çözüldüğünde birleştirme yapılır!

Artık güvenle itebilirsiniz.


Resolve ConflictAS butonunu arýyordum . Bazen sağ alt açılır pencere / balon kaybolur ve hiçbir şey yapamıyorum. Thanks @oiyio
mochadwi


7

Bunu yaparken , yerel kopyayı bir süredir güncellemediğim bir repo modülü için git pullbu mesajı aldım fatal: refusing to merge unrelated histories.

Ben sadece yerel kökenli yerel yenilemek için bu komutu çalıştırdım. Sadece uzaktan en son istedim ve herhangi bir yerel değişiklik gerek yoktu.

git reset --hard origin/master

Bu benim durumumda düzeltildi.


12
UYARI: Bu TÜM dosyalarımı sildi. Ne yaptığınızı bilmiyorsanız dikkatli olun!
Salvi Pascual

2
Bu, bekleyen tüm değişiklikleri silecek!
Orestis P.

1

Rebase'i yıllardır kullanıyorum ve hiç böyle bir sorunla karşılaşmadım. Ancak, ilk sorununuz development, denilen uzak depodan doğrudan uzak dalda yapmaya çalışmanızdır origin. Kelimenin tam anlamıyla yanlış, çünkü rebase git tarihini yeniden yapılandıran tehlikeli bir komut. Bunu söyledikten sonra, önce yerel deponuzu denemeli ve sadece sizin için beklendiği gibi çalışıyorsa itmelisiniz.

Bu nedenle, normal rebase iş akışım aşağıdaki gibi görünüyor (ancak unutmayın ki, tek bir komite olmadığınız şubelerde rebase kullanmamalısınız. Bu tür şubeler için, varsa çatışmaları birleştirin ve çözün).

  1. temiz bir çalışma ağacınız olduğundan emin olun (kesintisiz değişiklik yok)
  2. yeniden oluşturmak istediğiniz şubeye ödeme yapın (örneğin diyelim ki master; tek satırlık bir komut olarak):git checkout master && git pull origin master && git checkout development
  3. Gerçek rebase'i yapın: git rebase master
  4. Yapıldıysa ve her şey beklendiği gibi çalışıyorsa uzaktan kumandanıza itin. Bunu yapmak için zorlamanız gerekir, çünkü uzak ana bilgisayar zaten başka bir sırayla geçmişe sahiptir, uzaktan kumanda itmek için hiçbir şeyle cevap vermez. Bu nedenle, "tarihin yerel sürümümün doğru olması, tarihin yerel sürümümü kullanarak o uzak daldaki her şeyin üzerine yaz" dememiz gerekir:git push -f origin development

Daha önce de belirttiğim gibi, rebase git tarihini manipüle eder, bu genellikle kötü bir şeydir. Ancak bunu, başka hiç kimsenin taahhüt etmediği dallarda yapmak mümkündür. Şube diğer geliştiriciler için çekilebilir tutmak için, birleştirme kendisi, squash veya cherrypick gibi başka bir birleştirme stratejisi kullanın. Yani başka bir deyişle: Rebase, dağıtılmış geliştirme için aracınız olmamalıdır. Bu depoda çalışan tek kişi sizseniz işinize yarayacaktır.

Özellik branş stratejisini kullanıyoruz. Burada, genellikle ana dalda bu arada gerçekleşen diğer geliştiricilerden "güncellemeleri" almak için rebase kullanıyorum. Bunu yapmak, bir çekme isteğinde görünen taahhütlerin boyutunu azaltır. Bu nedenle, kod inceleyenin bu özellik dalında yaptığım değişiklikleri görmesini kolaylaştırır.


Bu durumda, aslında geri dönmeye devam etmek istedim ve cevap buna değinmiyor. Yeniden basmanın risklerini ve git-rebase'i ne zaman kullanmam gerektiğini ve kullanmamam gerektiğini biliyorum. Bu, git iş akışı için genel (görüşlü) bir kılavuzdur ve soruyu doğrudan yanıtlamaz. Rebase'i yıllarca kullandığımız sürece, bu özel hata git'in v2.9.0'ına eklenmiş ve akış bu sürümden önce iyi çalışıyordu. Bu cevaba burada yazdıklarınız stackoverflow.com/a/11566503/2670370 ve git-scm.com/book/en/v2/Git-Branching-Rebasing
Shubham Chaudhary

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.