Git menolak untuk menggabungkan sejarah yang tidak terkait pada rebase


2151

Selama git rebase origin/developmentpesan kesalahan berikut ditunjukkan dari Git:

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

Versi Git saya adalah 2.9.0. Dulu bekerja dengan baik di versi sebelumnya.

Bagaimana saya bisa melanjutkan rebase ini memungkinkan sejarah yang tidak berhubungan dengan bendera paksa yang diperkenalkan dalam rilis baru?


12
@Shishya Dengan segala hormat, jawaban yang paling banyak dipilih tidak menyelesaikan pertanyaan ini secara langsung. Pertanyaannya menanyakan git-rebasesituasi sementara jawabannya memberi bendera untukgit-merge
Shubham Chaudhary

13
@AsifMohammed bukan itu jawaban yang diterima untuk. Orang akan secara otomatis menemukan jawaban dengan suara terbanyak karena penyortiran default berdasarkan suara.
Glorfindel

2
Dalam hal orang lain membuat kesalahan yang sama, saya punya kesalahan ini setelah sengaja menggunakan git pull [repo URL]bukannyagit clone [repo URL]
rsoren


35
Kekacauan telah dibuat di sini oleh fakta bahwa judul tidak menentukan bahwa ini dalam konteks rebase, jadi pertanyaan Anda adalah menggambar di Google yang mendapatkan kesalahan ini dalam konteks yang berbeda dan memilih jawaban yang tidak benar-benar jawaban berlaku untuk pertanyaan yang Anda ajukan. Itu tidak dapat dengan mudah dibersihkan sekarang, sehingga pasangan tanya jawab yang tidak koheren akan tetap berada di situs dan tinggi dalam hasil pencarian Google selamanya. Moral cerita adalah bahwa judul pertanyaan itu penting!
Mark Amery

Jawaban:


2617

Perilaku default telah berubah sejak Git 2.9:

"git merge" digunakan untuk memungkinkan penggabungan dua cabang yang tidak memiliki basis umum secara default, yang menyebabkan sejarah baru dari proyek yang ada dibuat dan kemudian ditarik oleh pengelola yang tidak curiga, yang memungkinkan sejarah paralel yang tidak perlu digabung ke dalam proyek yang ada . Perintah telah diajarkan untuk tidak mengizinkan ini secara default , dengan --allow-unrelated-historiesopsi pintu darurat untuk digunakan dalam peristiwa langka yang menggabungkan sejarah dua proyek yang memulai kehidupan mereka secara mandiri.

Lihat changelog Git release untuk informasi lebih lanjut.

Anda bisa menggunakan --allow-unrelated-historiesuntuk memaksa penggabungan terjadi.


18
Ketahui perubahan penggabungan tetapi opsi ini tidak akan bekerja dengan rebase
Shubham Chaudhary

3
Apakah ada opsi yang akan menyala --allow-unrelated-historiessecara permanen?
jmarceli

4
@ jmarceli "Karena" penggabungan dua proyek "semacam itu adalah peristiwa yang jarang terjadi, opsi konfigurasi untuk selalu mengizinkan penggabungan seperti itu tidak ditambahkan.". Jadi tidak.
blue112

2
Saya mencoba untuk menggabungkan cabang untuk repo yang berbeda dengan cara ini tetapi itu menciptakan komit baru pada cabang saya saat ini dan tidak menyimpan sejarah dari repo yang lain. Kemudian saya memeriksa cabang lokal dari repo lain dan baru kemudian menggabungkannya dan tiba-tiba komit gabungan normal muncul. Aneh.
mgol

13
Luar biasa, bekerja dengan git pullbaik juga. Apakah dalam "peristiwa langka yang menggabungkan sejarah dua proyek yang memulai hidup mereka secara mandiri". git --work-tree="." pull --allow-unrelated-histories
Petru Zaharia

1191

Dalam kasus saya, kesalahan hanya terjadi fatal: refusing to merge unrelated historiespada setiap percobaan, terutama permintaan tarikan pertama setelah menambahkan repositori Git dari jarak jauh.

Menggunakan --allow-unrelated-historiesbendera berfungsi dengan permintaan tarik dengan cara ini:

git pull origin branchname --allow-unrelated-histories

232
Saya selalu melihat kesalahan ini jika ketika saya membuat repositori Github baru dengan README.md, kemudian tarik ke repositori lokal pada saat pertama. Sangat mengganggu.
Tien Do

29
Untuk repo baru, tarikan pertama, biasanya lebih baik memulai dengan git clone.
Payung


2
Ini menghentikan saya selama beberapa jam, sebelum saya menyadari harus ada resolusi yang jelas untuk menggabungkan file seperti ini jika itu terjadi untuk file default - Saya senang saya bukan satu-satunya yang setidaknya memiliki masalah ini!
Zibbobz

3
Dalam kasus saya itu terjadi karena saya menambahkan file lisensi di github. Perintah yang disebutkan di atas (dan di bawah, mereka sama) berfungsi.
uudaddy

582

Coba perintah berikut:

git pull origin master --allow-unrelated-histories

Ini harus menyelesaikan masalah Anda.


266

Saya mendapatkan kesalahan ini ketika saya mengatur repositori lokal terlebih dahulu. Lalu saya pergi ke GitHub dan membuat repositori baru. Lalu aku berlari

git remote add origin <repository url>

Ketika saya mencoba mendorong atau menarik, saya mendapatkan fatal: unrelated_historieskesalahan yang sama setiap kali.

Inilah cara saya memperbaikinya:

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

Saya pikir kita berada di kapal yang sama. Untuk menambahkan sesuatu: Masalah saya adalah sudah ada sesuatu di repo jarak jauh. Jadi di folder saya, itu menghapus .gitfolder, berlari git initdan melakukan apa yang dikatakan Adithya, kecuali untuk bagian gabungan.
codepleb

1
Bagaimana cara menekan tombol INSERT di mac? Sebenarnya, saya harus mengetikkan pesan commit dan melakukan penggabungan dari baris perintah, Tapi saya tidak tahu bagaimana melakukannya dari baris perintah.
Shajeel Afzal

Apakah itu vim terbuka? Jika ya, itu hanya SHIFT +:
Adithya Bhat

Bahkan saya telah membuat repo GitHub terlebih dahulu dan sedang melalui perintah menambahkan repo itu.
Tn. Suryaa Jha

1
Ini jawaban yang sangat bagus. Intinya adalah bahwa Anda harus memaksa menarik kemudian menggabungkan repo lokal dan jarak jauh.
alanwsx


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

Anda akan diarahkan ke jendela edit Vim:

  • Sisipkan pesan komit
  • Kemudian tekan Esc(untuk keluar dari mode "Sisipkan"), lalu :(titik dua), lalu x(kecil "x") dan akhirnya tekan Enteruntuk keluar dari Vim
  • git push --set-upstream origin <branch>

5
Ctrl + X tidak akan membuat Anda keluar dari Vim
Ruben

tetapi :x<Enter>akan
webKnjaZ

101

Saya memiliki masalah yang sama. Coba ini:

git pull origin master --allow-unrelated-histories 

git push origin master

47

Mencoba git pull --rebase development


Ini menyelesaikan masalah saya. Di sinilah masalahnya dimulai
Harlan Nelson

1
Ini mungkin seharusnya:git pull --rebase=preserve --allow-unrelated-histories development
Riccardo Murri

3
@RiccardoMurri Baru saja mencobanya, saya tidak akan melakukannya lagi. Repo baru saya memiliki beberapa file inisialisasi sampel di dalamnya, dan komitmen repo bulan lokal saya bernilai. Menjalankan ini (dengan newOrigin branchalih - alih development) menambahkan komit awal ke atas cabang lokal saya, secara efektif menghapus hampir semua darinya. Saya ingin komit awal dari remote baru berada di bagian bawah.
redOktober13

42

Untuk Android Studio dan IntelliJ:

Pertama, lakukan semuanya dan selesaikan konflik.

Kemudian buka terminal dari bawah IDE dan masukkan:

git pull origin master --allow-unrelated-histories

Sekarang Anda bisa mendorong.


38

PERINGATAN INI AKAN POTENSIAL MENGATASI PERLENGKAPAN REMOTE

Ini bekerja untuk saya:

git push origin master --force

1
Tetapi apa yang sebenarnya terjadi dengan file lokal dan jarak jauh?
Prathamesh More

Seperti yang saya tahu dan alami, file lokal masih utuh. File jarak jauh yang ingin Anda tambahkan di folder tertentu akan ditambahkan.
Aniket Patil

5
Jangan lakukan ini! Ini menimpa semua file jarak jauh .
Finomnis

Cukup sertakan penafian bahwa perintah ini mengesampingkan semua file di cabang master . Bekerja baik untukku. Terima kasih.
Flavio

1
Ini bekerja tetapi agak keras, --allow-unrelad-histories lebih spesifik dan tepat
bdulac

32

Karena semua jawaban lain sebenarnya tidak menjawab pertanyaan, inilah solusi yang terinspirasi oleh jawaban ini pada pertanyaan terkait.

Jadi Anda melakukan kesalahan git rebase:

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

Kesalahan ini sebenarnya tidak membatalkan rebase, tetapi Anda sekarang di tengah-tengahnya:

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

Jadi sekarang Anda dapat melakukan penggabungan dengan tangan. Cari tahu komitmen induk dari komit gabungan asli:

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

    test merge commit

Cari tahu yang mana dari kedua orang tua yang menggabungkan adalah yang digabungkan ke yang sekarang (mungkin yang kedua, verifikasi dengan git log 222222222), dan kemudian lakukan penggabungan dengan tangan, menyalin pesan komit dari komit gabungan asli:

$ 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

Saya memiliki masalah yang sama. Masalahnya adalah remote memiliki sesuatu yang mencegah ini.

Saya pertama kali membuat repositori lokal. Saya menambahkan LICENSEdan README.mdmengajukan ke lokal saya dan berkomitmen.

Lalu saya ingin repositori jarak jauh jadi saya membuatnya di GitHub. Di sini saya membuat kesalahan dengan memeriksa "Inisialisasi repositori ini dengan README" , yang membuat README.md di remote juga.

Jadi sekarang ketika saya berlari

git push --set-upstream origin master

Saya mendapatkan:

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.

Sekarang untuk mengatasi ini saya lakukan

git pull origin master

Yang mengakibatkan kesalahan di bawah ini:

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

Saya mencoba:

git pull origin master --allow-unrelated-histories

Hasil:

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.

Larutan:

Saya menghapus repositori jarak jauh dan membuat yang baru (saya pikir hanya menghapus file yang READMEbisa berfungsi) dan setelah itu yang di bawah ini berfungsi:

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

25
membuat repositori baru bukanlah solusi
Zach

3
git pull origin master --allow-unrelated-histories bekerja untuk saya .. Terima kasih
SKalariya

git push --force ... akan menjadi solusi yang tepat pada langkah 1 dalam kasus khusus ini
Konstantin Pelepelin

2
Ini bukan solusi. Jika Anda pemula, maka Anda bisa melakukannya, tetapi Jika Anda bekerja dengan beberapa proyek nyata, Anda harus berurusan dengan cara yang tepat.
Prathamesh Lebih Banyak

27

Ini biasanya terjadi ketika Anda mengkomit pertama kali ke repositori jarak jauh. Seperti kesalahan dengan jelas mengatakan "menolak untuk menggabungkan sejarah yang tidak terkait", kita perlu menggunakan flag --allow-unrelated-histories.

git pull origin master  --allow-unrelated-histories

Sekarang akan ada beberapa konflik yang harus kita selesaikan secara manual. Setelah itu cukup komit kode dan dorong.


Seperti yang disebutkan dalam pertanyaan, saya mencoba melakukan git-rebase dan bukan git-pull, git-rebase tidak memiliki --allow-unrelated-historiesbendera.
Shubham Chaudhary

25

Dua kemungkinan kapan ini bisa terjadi -

  1. Anda telah mengkloning proyek dan, entah bagaimana, direktori .git terhapus atau rusak. Hal ini membuat Git tidak mengetahui sejarah lokal Anda dan karenanya, akan menyebabkannya membuang kesalahan ini ketika Anda mencoba mendorong atau menarik dari repositori jarak jauh.

  2. Anda telah membuat repositori baru, menambahkan beberapa commit, dan sekarang Anda mencoba menarik dari repositori jauh yang sudah memiliki beberapa commit. Git juga akan melempar kesalahan dalam kasus ini, karena tidak tahu bagaimana kedua proyek terkait.

LARUTAN

git pull origin master --allow-unrelated-histories

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


12

Saya berjuang dengan ini juga, tetapi saya berhasil menemukan solusi.

Saat Anda mengalami kesalahan di atas, cukup ceri-pilih komit gabungan dan kemudian lanjutkan rebase:

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

3
Tolong, dalam bahasa inggris pesawat?
Agen Zebra

@ AgentZebra Untuk setiap disk di bidang kompleks, integral jalur tertutup kontinu adalah 0.
Addem

12

Pertama-tama tarik perubahan jarak jauh ke lokal Anda menggunakan perintah berikut:

git pull origin branchname --allow-unrelated-histories

** branchname adalah master dalam kasus saya.

Ketika perintah tarikan selesai, konflik terjadi. Anda harus menyelesaikan konflik. Saya menggunakan Android Studio untuk menyelesaikan konflik. masukkan deskripsi gambar di sini

Ketika konflik diselesaikan, penggabungan dilakukan!

Sekarang Anda bisa mendorong dengan aman.


Saya telah mencari tombol Resolve Conflictdi AS. Terkadang popup / ballon kanan bawah menghilang & saya tidak dapat melakukan apa-apa. Terima kasih @oiyio
mochadwi


7

Ketika melakukan git pull, saya mendapat pesan ini fatal: refusing to merge unrelated histories untuk modul repo di mana saya belum memperbarui salinan lokal untuk sementara waktu.

Saya menjalankan perintah ini hanya untuk menyegarkan lokal dari asal. Saya hanya ingin yang terbaru dari jarak jauh dan tidak memerlukan perubahan lokal.

git reset --hard origin/master

Ini memperbaikinya dalam kasus saya.


12
PERINGATAN: Ini menghapus SEMUA file saya. Hati-hati jika Anda tidak tahu apa yang Anda lakukan!
Salvi Pascual

2
Ini akan menghapus semua perubahan yang tertunda!
Orestis P.


1

Saya menggunakan rebase selama bertahun-tahun dan saya tidak pernah mengalami masalah seperti itu. Namun, masalah pertama Anda adalah, bahwa Anda mencoba melakukannya secara langsung pada cabang jarak jauh developmentdari repositori jarak jauh, yang disebut origin. Itu benar-benar salah karena rebase adalah perintah berbahaya, yang merestrukturisasi sejarah git. Karena itu, Anda harus terlebih dahulu mencoba repositori lokal Anda dan hanya mendorongnya, jika itu bekerja untuk Anda seperti yang diharapkan.

Jadi, alur kerja rebase saya yang biasa terlihat seperti berikut (tetapi harap diingat, bahwa Anda tidak boleh menggunakan rebase di cabang, yang bukan hanya Anda satu-satunya komite. Untuk cabang seperti itu, gunakan hanya menggabungkan dan menyelesaikan konflik, jika berlaku):

  1. pastikan Anda memiliki pohon kerja yang bersih (tidak ada perubahan yang tidak dikomit)
  2. checkout ke cabang tempat Anda ingin rebase (misalnya, katakan saja master; sebagai perintah satu baris):git checkout master && git pull origin master && git checkout development
  3. Lakukan rebase yang sebenarnya: git rebase master
  4. Jika sudah selesai dan semuanya berfungsi seperti yang diharapkan, dorong ke remote Anda. Untuk melakukannya, Anda harus memaksanya, karena host jarak jauh sudah memiliki sejarah dalam urutan lain, remote akan menjawab tanpa ada yang mendorong. Jadi, kita perlu mengatakan "versi lokal saya dari sejarah sudah benar, menimpa semua yang ada di cabang jauh menggunakan versi lokal saya dari sejarah":git push -f origin development

Seperti yang sudah saya sebutkan, perlu diingat, rebase memanipulasi sejarah git, itu biasanya hal yang buruk. Namun, dimungkinkan untuk melakukan itu di cabang, di mana tidak ada orang lain yang berkomitmen. Untuk menjaga agar cabang tetap dapat dikembangkan oleh pengembang lain, gunakan strategi penggabungan lainnya seperti penggabungan itu sendiri, squash, atau cherrypick. Jadi, dengan kata lain: Rebase seharusnya tidak menjadi alat Anda dalam pengembangan terdistribusi. Ini berfungsi dengan baik untuk Anda jika Anda adalah satu-satunya yang bekerja di repositori ini.

Kami menggunakan strategi cabang fitur. Dalam hal ini, saya biasanya menggunakan rebase untuk mendapatkan "pembaruan" dari pengembang lain, yang terjadi sementara itu di cabang utama. Melakukannya, itu mengurangi ukuran komit yang terlihat dalam permintaan tarik. Oleh karena itu, lebih mudah bagi peninjau kode untuk melihat perubahan yang saya buat di cabang fitur ini.


Dalam hal ini, saya sebenarnya ingin melanjutkan rebase dan jawabannya tidak membahasnya. Saya tahu risiko rebasing dan kapan saya harus & tidak seharusnya menggunakan git-rebase. Ini adalah pedoman umum (pendapat) untuk alur kerja git dan tidak langsung menjawab pertanyaan. Sejauh menggunakan rebase selama bertahun-tahun, kesalahan khusus ini ditambahkan dalam v2.9.0 git dan aliran yang digunakan berfungsi dengan baik sebelum rilis itu. Apa yang Anda posting dalam jawaban ini di sini sudah dijawab dalam pertanyaan yang jauh lebih tua seperti stackoverflow.com/a/11566503/2670370 dan git-scm.com/book/en/v2/Git-Branching-Rebasing
Shubham Chaudhary
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.