Git “refusing to merge unrelated histories” hatası, yerel depondaki geçmiş ile uzak depodaki geçmiş arasında ortak bir başlangıç commit’i bulunmadığında ortaya çıkar. Çözüm için önce hangi uzak depoya ve hangi dala bağlı olduğunu doğrulamalı, ardından iki projenin geçmişlerini bilinçli biçimde birleştirmelisin.
Git’te commit, kaydedilmiş proje değişikliklerini temsil eder. Remote, uzak depo bağlantısıdır; dal ise proje üzerinde ayrı bir geliştirme çizgisidir. Git, ortak bir atası bulunmayan iki geçmişi varsayılan olarak birleştirmeyi reddeder ve şu hatayı gösterir:
fatal: refusing to merge unrelated histories
Bu Git hatası ne anlama gelir ve neden çıkar?
Bu hata, iki commit geçmişinin aynı başlangıç noktasından ilerlemediğini gösterir. Git belgelerinde, ortak bir ata paylaşmayan geçmişlerin varsayılan olarak birleştirilmesinin reddedildiği ve bağımsız başlayan iki projenin geçmişlerini birleştirmek için özel bir seçeneğin kullanılabileceği açıklanır.
Örneğin GitHub’da yeni bir depo oluştururken README.md dosyasını da oluşturduğunu düşünelim. GitHub bu işlem sırasında uzak depoya ilk commit’i ekler. Sen bilgisayarında aynı proje klasörü için ayrıca git init çalıştırıp dosyalarını ekler ve kendi ilk commit’ini oluşturursan iki ayrı geçmiş meydana gelir.
Bu iki geçmişte dosya adları benzer olsa bile Git açısından ortak başlangıç noktası yoktur. Uzak depodaki README.md commit’i GitHub üzerinde, yerel ilk commit’in ise bilgisayarında oluşturulması bu duruma yol açabilir. Ardından uzak depoyu yerel projeye bağlayıp git pull çalıştırdığında Git, hangi geçmişin korunacağını kendiliğinden varsaymak istemez ve işlemi durdurur.
Hatanın ortaya çıkması, projenin mutlaka bozulduğu anlamına gelmez. Önce uzak bağlantının gerçekten beklediğin GitHub deposunu gösterdiğini, yerel dalın doğru dal olduğunu ve uzak depodaki dal adının ne olduğunu kontrol etmelisin.
Birleştirmeden önce remote ve dalı nasıl doğrularsın?

İlk olarak terminalde proje klasörüne geç. Aşağıdaki komut, uzak depo bağlantısının adresini ve bu bağlantının veri alma veya gönderme için kullandığı adresleri gösterir:
cd proje-klasoru
git remote -v
Temsilî bir çıktı şu şekilde olabilir:
origin https://github.com/kullanici/proje.git (fetch)
origin https://github.com/kullanici/proje.git (push)
Buradaki adres, üzerinde çalıştığın GitHub deposunu göstermelidir. Başka bir projeye ait adres görüyorsan birleştirme işlemine devam etme. Temsilî çıktılar bilgisayarındaki kullanıcı adına, depo adresine ve yapılandırmaya göre değişebilir.
Şimdi hangi yerel dalda olduğunu ve uzak depoda hangi dalların bulunduğunu kontrol et:
git fetch origin
git branch --show-current
git branch -r
git branch --show-current komutu mevcut yerel dalın adını gösterir. git branch -r ise uzak depodan bilinen dalları listeler. Örneğin çıktı içinde origin/main, origin/master veya farklı bir dal adı görebilirsin. Bu nedenle doğrudan main ya da master varsaymak yerine listede görünen adı kullanmalısın.
Uzak deponun varsayılan dalını daha ayrıntılı görmek için şu komutu çalıştır:
git remote show origin
Temsilî çıktıda şu bölümler görülebilir:
* remote origin
Fetch URL: https://github.com/kullanici/proje.git
Push URL: https://github.com/kullanici/proje.git
HEAD branch: main
Remote branches:
main tracked
HEAD branch satırı, uzak deponun varsayılan dalını gösterir. Buradaki dal adı main olmak zorunda değildir. Önemli olan, komut çıktısında görünen uzak dal ile yerel dalını karşılaştırarak birleştirme işleminde doğru hedefi seçmendir.
İlişkisiz geçmişleri güvenli biçimde nasıl birleştirirsin?

Uzak depo adresini, üzerinde çalıştığın yerel dalı ve uzak depodaki dalı doğruladıktan sonra birleştirme komutunu çalıştır. origin, remote olarak tanımlanan uzak depo bağlantısının adı; main ise uzak depodaki dalın adıdır. Dal, projenin ayrı bir gelişim çizgisini tutar. Komut, uzak depodaki main dalını o anda açık olan yerel dala getirip birleştirir.
git pull origin main --allow-unrelated-histories
--allow-unrelated-histories bayrağı, ortak bir başlangıç commit’i bulunmayan iki geçmişin birleştirilmesine izin verir. Commit, projedeki dosyaların belirli bir andaki kaydıdır. Bu bayrak geçmişleri birleştirme engelini aşar; dosya içerikleri çakışırsa çakışmayı kendiliğinden çözmez. Git belgelerinde seçenek hem git merge hem de birleştirme yapan git pull kullanımıyla açıklanır.
main yerine doğruladığın uzak dalın adını yaz. Yerel dalın da hedeflediğin dal olduğundan emin ol; yanlış remote adresi veya yanlış dal, başka bir projedeki içeriği mevcut çalışmana katabilir. Remote ve dal bilgilerini doğrulayamıyorsan komutu çalıştırma.
Birleştirme başarılı olursa Git, birleştirme commit’i oluşturduğunu bildirebilir. README.md gibi aynı dosya iki geçmişte de oluşturulmuşsa çözmen gereken bir çakışma bildirimi görebilirsin. Aşağıdaki çıktılar örnektir; Git sürümüne, depo durumuna ve dosyaların geçmişine göre mesajlar değişebilir.
Merge made by the 'ort' strategy.
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
README.md çakışmasını nasıl tamamlayıp commit edersin?
Çakışma bildirimi alırsan önce hangi dosyaların beklediğini git status ile gör.
git status
Temsili çıktıda both added: README.md satırı, dosyanın iki geçmişte de eklendiğini ve içeriği uzlaştırman gerektiğini gösterir. Çıktının biçimi Git sürümüne ve depo durumuna göre değişebilir.
both added: README.md
README.md dosyasını açıp yerel açıklamanı ve uzak depodan gelen metni karşılaştır. Korunacak bölümleri elle düzenle; dosyada görünen <<<<<<<, ======= ve >>>>>>> çakışma işaretlerini kaldır. Çakışma işaretlerinin farklı durumlarda nasıl ele alınacağını “Git Conflict Çözme” yazısında bulabilirsin.
Düzenlemeyi kaydettikten sonra dosyayı birleştirme için hazırla:
git add README.md
Bu komut çoğu durumda ekrana çıktı vermez. Ardından git status çalıştırdığında README.md dosyasının çözümlenmiş ve commit için hazırlanmış olduğunu görmelisin.
git commit
Git, birleştirme commit’i için bir mesajı düzenleyicide açabilir. Mesajı kaydedip düzenleyiciyi kapattığında işlem tamamlanır. Temsili çıktıdaki dal adı, commit kimliği ve mesaj depoya göre farklı olur; önemli olan yeni commit’in oluşturulduğunun bildirilmesidir.
[main 4f2c9ab] Merge branch 'main'
Hatayı nasıl önler ve veri kaybından nasıl kaçınırsın?
Bu hatayı önlemenin en güvenli yolu, yerel proje ile uzak depoyu iki ayrı başlangıç geçmişi oluşturacak şekilde başlatmamaktır. Yeni bir uzak depo açarken README.md gibi başlangıç dosyalarını eklemeden boş oluşturabilir, ardından yerel projenin ilk commit’ini bu depoya gönderebilirsin. Diğer seçenek ise projeye doğrudan git clone ile başlamak, dosyalarını bu klasöre eklemek ve commit oluşturmaktır.
--allow-unrelated-histories bayrağı, ortak geçmişi bulunmayan iki projeyi birleştirmeye izin verir. Git belgeleri bu seçeneğin bağımsız başlayan iki projeyi birleştirmek için kullanılabileceğini, ancak varsayılan güvenlik kontrolünü devre dışı bıraktığını belirtir. Bu nedenle yanlış remote, yani uzak depo adresi doğrulanmadan bu bayrağı kullanmak, birbiriyle ilgisi olmayan iki projeyi aynı geçmişte birleştirebilir.
Birleştirme veya gönderme işleminden önce aşağıdaki son kontrolü yap:
- Doğru klasör:
pwdvegit statusile üzerinde çalıştığın klasörü ve yerel değişiklikleri kontrol et. - Doğru remote:
git remote -vya dagit remote get-url originkomutuyla adresin beklediğin uzak depoya ait olduğunu doğrula. - Doğru mevcut dal:
git branch --show-currentkomutuyla üzerinde çalıştığın dalı, yani projenin ayrı çalışma çizgisini kontrol et. - Doğru uzak dal:
git branch -rçıktısında beklediğin uzak dalın, örneğinorigin/mainveyaorigin/master, bulunduğunu incele. - README.md içeriği: Uzak depoda bulunan README.md dosyasının gerçekten birleştirmek istediğin projeye ait olduğunu kontrol et.
Bu kontroller tamamlanmadan git pull --allow-unrelated-histories çalıştırma. Uzak depodaki içerik yanlışsa işlemi durdurup remote adresini düzeltmek, sonradan oluşabilecek karmaşık birleştirme sorunlarını azaltır.
git push --force komutunu bu hatanın çözümü olarak kullanma. Force push, uzak dalın geçmişini yerel geçmişle zorla değiştirebilir ve uzak depodaki commit’lerin veya dosyaların üzerine yazılmasına yol açarak veri kaybı oluşturabilir. Önce doğru depoyu ve dalları doğrula, ardından birleştirme sonucunu inceleyerek normal bir commit ve normal bir push işlemi gerçekleştir.
Sık Sorulan Sorular
“--allow-unrelated-histories” bayrağı yerel dosyaları otomatik olarak siler mi?
--allow-unrelated-histories bayrağı tek başına yerel dosyaları otomatik olarak silmez; ortak geçmişi olmayan iki geçmişin birleştirilmesine izin verir. Aynı dosyada iki tarafta da değişiklik varsa Git bir çakışma gösterebilir ve hangi içeriğin korunacağını senin belirlemen gerekir.
GitHub deposunun varsayılan dalının main mi master mı olduğunu nasıl kontrol ederim?
GitHub deposunun varsayılan dalını yerel klasörde git remote show origin komutuyla kontrol edebilirsin. Çıktıda genellikle HEAD branch: main veya HEAD branch: master benzeri bir satır görünür; ayrıca git branch -r komutunda origin/HEAD işaretinin hangi dala yöneldiğini de inceleyebilirsin.
Yanlış remote adresine bağlı olduğumu nasıl anlarım?
Yanlış remote adresini git remote -v veya git remote get-url origin komutlarının çıktısını beklediğin depo adresiyle karşılaştırarak anlayabilirsin. Adres farklı bir projeyi gösteriyorsa birleştirme ya da push işlemine devam etmeden önce remote yapılandırmasını düzeltmelisin.
Doğru klasörü, remote adresini, mevcut dalı, uzak dalı ve README.md içeriğini kontrol etmek, bu hatayla çalışırken güvenli bir başlangıç sağlar.