Kurumsal Yazılım
Git push rejected hatası nasıl çözülür? Adım adım rehber

Kısa yanıt
Git push rejected hatası, uzak depodaki dal sizin yerel kopyanızda henüz bulunmayan yeni commit’ler içerdiğinde karşınıza çıkar; sistem veri kaybını önlemek için push işlemini durdurup terminalde failed to push some refs uyarısı gösterir. Sorunun temel çözümü basittir: önce git pull ile uzaktaki değişiklikleri indirip birleştirmek, ardından push işlemini güvenle tekrarlamaktır.
Git push rejected hatası neden oluşur ve mantığı nedir?
Git, dalların commit geçmişini daima doğrusal ve tutarlı bir çizgide tutmayı hedefler; bu sebeple push komutu verdiğinizde yerel dalınızın uzaktaki dal geçmişinin tam olarak neresine oturduğunu dikkatle inceler. Uzak sunucuda henüz kendi bilgisayarınıza çekmediğiniz yeni commit’ler varsa, mesela bir ekip arkadaşınız sizden birkaç dakika önce kod gönderdiyse ya da GitHub arayüzünden doğrudan bir dosya düzenlediyseniz, Git bu durumu non-fast-forward olarak işaretler. Gönderim işlemini durdurmasındaki asıl neden, sizin yerel kopyanızın uzaktaki mevcut çalışmaları sessizce ezmesini ve kalıcı biçimde yok etmesini önlemektir.
Geliştiricilerin bu uyarıyla karşılaşması genellikle belirli senaryolarda gerçekleşir. Aynı dal üzerinde birden çok kişinin eşzamanlı çalışıp farklı zamanlarda gönderim yapması bu senaryoların başında gelir. GitHub veya GitLab panelinden merge edilen bir pull request sonrasında yerel kopyanızı güncellemeden çalışmayı sürdürdüğünüzde de Git kapıyı kapatır. Kendi makinenizde git rebase, git commit --amend veya git reset gibi geçmişi yeniden yazan araçları çalıştırdığınızda yerel dalınız uzaktaki daldan tamamen kopar ve sistem iki tarafı birbiriyle uyumsuz kabul eder.
Terminal ekranındaki bildirimleri dikkatli okumak hatanın kök nedenini hızlıca gösterir. Ekranda gördüğünüz ! [rejected] main -> main (fetch first) satırı ve beraberindeki failed to push some refs uyarısı, uzaktaki depoda yerelde bulunmayan değişiklikler olduğunu açıkça belirtir. Buradaki fetch first ifadesi atmanız gereken ilk adımı zaten söyler; sunucudaki güncel durumu incelemeniz ve yerel kodunuzla harmanlamanız beklenir. Güncel dalın uç noktasının geride kaldığını bildiren behind varyasyonları da temelde aynı duruma işaret eder.
Sık görülen git push rejected mesajları
| Mesaj | Tipik neden | İlk çözüm |
|---|---|---|
! [rejected] main -> main (fetch first) |
Uzak dalda sizde olmayan yeni commit’ler var | git pull (veya git pull --rebase) |
Updates were rejected because the tip of your current branch is behind |
Yerel dal, uzak daldan geride kalmış | git fetch ile durumu kontrol edip git pull çalıştırın |
Updates were rejected because the remote contains work that you do not have locally |
Başka biri sizden önce push yaptı | git pull --rebase ile geçmişi düzenli tutun |
! [rejected] main -> main (non-fast-forward) |
Yerel geçmiş rebase/amend ile değişti, uzak dalla ayrıştı |
Durumu değerlendirip --force-with-lease kullanın |
error: failed to push some refs to '...' (dal adı uyuşmazlığı) |
Yanlış uzak dala push deneniyor | git branch -vv ile takip ilişkisini kontrol edin |
Git push rejected hatası nasıl çözülür? Adım adım
Uzak sunucudaki değişiklikleri güvenli biçimde yerel bilgisayara taşımak her zaman en sağlam başlangıç noktasıdır. Doğrudan yeniden push komutu çalıştırmak yerine terminale git pull yazmanız gerekir. Bu komut, uzaktaki dalı yerel kopyanızla birleştirirken varsayılan ayarlarda otomatik bir birleştirme commit’i üretir. Dosyalar arasında herhangi bir çakışma çıkmadığı sürece oluşan bu yeni commit’i sunucuya tekrar göndermeniz sorunu hemen çözer. İki tarafta da aynı satırlar değiştirilmişse bir çakışma doğar; böyle anlarda izlenecek yöntemleri git merge conflict nasıl çözülür rehberimizde paylaştığımız pratik adımlarla çözebilirsiniz.
Proje geçmişinin dallanıp budaklanmasını istemiyorsanız git pull --rebase seçeneğini tercih edebilirsiniz. Rebase komutu, uzaktaki commit’leri indirip sizin sonradan yazdığınız yerel commit’leri bu zincirin en ucuna sıralar. Bu sayede commit grafiği dümdüz, doğrusal bir hatta oturur. Rebase işlemi sırasında da çakışmalar çıkabilir ve bunları commit bazında tek tek çözmeniz gerekebilir. Ekiplerin merge ya da rebase tercihlerini projenin başında belirlemesi, çalışma boyunca rejected uyarılarının nasıl yönetileceğini standartlaştırır.
Zorla gönderme seçeneği olan git push --force komutu, uzaktaki dal geçmişini tamamen silip sizin yerel durumunuzu zorla geçerli kılar. Uzak sunucuda başkalarının yaptığı çalışmalar bu işlemle birlikte kalıcı olarak kaybolur. Dolayısıyla bu yaklaşım yalnızca kişisel geliştirme dallarında veya bilinçli geçmiş düzenlemelerinde tercih edilmelidir; ana dallarda çalıştırılması takım arkadaşlarının emeklerini geri dönülmez şekilde silebilir. Bu riski hafifletmek isteyenler için git push --force-with-lease çok daha güvenli bir alternatiftir. Komut, siz en son fetch yaptığınız andan itibaren sunucuya yeni bir commit girildiyse işlemi durdurur ve veri kaybını engeller.
Yanlış dala push etmek de rejected hatasına yol açabilir mi?
Gönderim reddi her zaman commit geçmişindeki uyuşmazlıklardan kaynaklanmaz. Çoğu zaman geliştiriciler farkında olmadan yanlış bir uzak dal adına veri göndermeye çalışır. Yerel ortamda main ismiyle açılan bir dalın uzaktaki eski master dalına itilmek istenmesi bu karışıklığın en yaygın örneğidir. Terminalde git branch -vv komutunu çalıştırarak yerel dalın hangi uzak dalı izlediğini saniyeler içinde görebilirsiniz. Takip ilişkisi kopmuşsa veya hiç kurulmamışsa, git push -u origin <dogru-dal-adi> komutunu kullanarak doğru bağlantıyı kurabilir ve hatayı ortadan kaldırabilirsiniz.
CI/CD boru hatlarında görülen push rejected hataları
Otomasyon süreçlerinde, özellikle GitHub Actions gibi CI/CD boru hatlarında bu hata geliştirici makinelerinden bağımsız olarak tetiklenebilir. Otomasyon senaryoları bir sürüm etiketi eklemek ya da otomatik changelog güncellemesi yapmak için depoya commit göndermeye çalıştığında yarış durumları meydana gelir. İş akışı çalışırken başka bir geliştirici depoya yeni kod gönderdiyse veya paralel bir işlem commit attıysa, otomasyonun push hamlesi sunucu tarafından reddedilir. Hatların kilitlenmesini engellemek adına CI/CD betiklerinin içine push komutundan hemen önce git pull --rebase adımı yerleştirilir ya da gönderimler sıraya dizilir.
Ekip halinde çalışırken bu hatayı azaltmanın yolları
Git sisteminin push rejected uyarısı vermesi bir arıza değil, güvenli çalışma mekanizmasının doğru işlediğini gösteren sağlıklı bir reflekstir. Asıl problem, geliştiricilerin ne olduğunu anlamadan kestirme yoldan force push kullanmaya yönelmesidir. Çalışma disiplini oturtulmuş ekiplerde push işlemine geçmeden önce mutlaka git fetch çalıştırılarak uzak sunucunun durumu kontrol edilir. Günlerce açık kalan uzun soluklu dallar rebase komutuyla ana daldan düzenli beslenir. Ortak kullanılan ana dallar sunucu ayarlarından korumaya alınarak zorla gönderme yetkileri tamamen sınırlandırılır.
Sık yapılan hatalar
Uyarının içeriğine hiç bakmadan --force parametresine sarılmak depodaki geçerli kodları sileceği için en tehlikeli alışkanlıktır. Benzer şekilde pull ile pull --rebase komutlarının çalışma mantığını ayırt etmeden rastgele kullanmak, git geçmişini karmaşık bir düğüme çevirebilir. Ana üretim dalında force push denemek tüm ekibi zor durumda bırakırken, uzak dal takip bağlantılarını (upstream) denetlemeyi unutmak da yapay uyuşmazlıklar türetir.
Kontrol listesi
Terminalinizdeki hata çıktısında “fetch first” uyarısını mı yoksa “non-fast-forward” ifadesini mi gördüğünüzü kontrol ederek işe başlayın. Ardından git fetch ile sunucudaki güncel durumu makinenize çekip aradaki farkı gözlemleyin. Takımınızın belirlediği kurala göre merge ya da rebase adımlarından birini tercih edin. Zorla gönderme mecburiyeti doğduysa düz force yerine daima --force-with-lease kullanmayı alışkanlık edinin. Son adım olarak git branch -vv yardımıyla yerel dalınızın doğru uzak dala bağlandığını mutlaka doğrulayın.
Sonraki adım
Git push rejected uyarısı, temelde sürüm kontrol mekanizmasının projeyi koruma yöntemidir ve doğru adımlarla dakikalar içinde çözüme kavuşturulur. Burada en kritik kural, hata mesajını anlamadan hiçbir koşulda zorla gönderme yapmamaktır. Şirketinizin yazılım geliştirme süreçlerini daha profesyonel temellere oturtmak veya projelerinizin dağıtım mimarisini baştan tasarlamak isterseniz, grup şirketimiz Web Tasarım Ofisi teknik altyapı ve kod yönetimi süreçlerinde uçtan uca danışmanlık sağlıyor.
Sürüm kontrolü ve kesintisiz dağıtım süreçlerinizi kapsayan projeleri profesyonel bir ekiple hayata geçirmek için özel yazılım hizmetimizi inceleyebilir ya da bizimle iletişime geçebilirsiniz. Dallanma süreçlerinde karşınıza çıkabilecek diğer yaygın pürüzleri ise git merge conflict nasıl çözülür rehberimizde ele alıyoruz.
Kaynaklar
- GitHub Docs, Dealing with non-fast-forward errors, non-fast-forward push hatalarının resmî açıklaması ve önerilen çözümler
Sıkça sorulan sorular
Git push rejected hatası ne anlama gelir?
Bu hata, push etmeye çalıştığınız uzak dalın, yerel kopyanızda bulunmayan commit'ler içerdiğini gösterir. Git, bu commit'lerin push sırasında sessizce kaybolmasını önlemek için işlemi durdurur ve önce uzak değişiklikleri almanızı önerir.
`git pull` ile `git pull --rebase` arasında hangisini seçmeliyim?
`git pull` uzak değişiklikleri alıp bir merge commit'i oluşturur; geçmiş dallanır ama daha güvenlidir. `git pull --rebase` ise commit'lerinizi uzak geçmişin üzerine yeniden uygulayıp tek bir doğrusal geçmiş oluşturur; tercih ekibin kuralına bağlıdır.
`--force` ile `--force-with-lease` arasındaki fark nedir?
`--force`, uzak dalı koşulsuz olarak yerel geçmişinizle değiştirir ve başkasının commit'lerini sessizce silebilir. `--force-with-lease`, yalnızca siz son fetch işleminizden beri uzak dalda başka kimse push yapmadıysa işlemi gerçekleştirir; aksi halde durdurup uyarır.
Force push'tan sonra kaybolan bir commit'i geri alabilir miyim?
Commit hâlâ birinin yerel makinesinde veya `git reflog` kaydında mevcutsa genellikle geri getirilebilir. Kimse o commit'i tutmuyorsa ve reflog süresi de dolmuşsa veri kalıcı olarak kaybolmuş olabilir; bu yüzden paylaşılan dallarda force push'tan kaçınmak önemlidir.
Git push rejected hatası CI/CD boru hattında neden ortaya çıkar?
Bir otomatik iş akışı depoya commit atıp push etmeye çalıştığında, aynı anda başka bir iş akışı veya geliştirici de depoyu güncellemişse push reddedilir. Çözüm genellikle push'tan önce bir `git pull --rebase` adımı eklemek veya eşzamanlı iş akışlarını sıraya almaktır.