Git: Branch Silme, Birleştirme ve Yanlış Push'u Geri Alma

August 2, 2026 · ziyaretçi

Bu üç durum sürekli karşına çıkıyor ama komutlar bir türlü akılda kalmıyor. Burada komutları sade haliyle bulabilirsin.

Branch Silme

git branch -d ozellik-x

Bu güvenli versiyon — Git önce kontrol eder, ozellik-x'te mevcut branch'ine hiç girmemiş commit'ler varsa silmeyi reddeder. Eminsen, üzerine basabilirsin: (1)

git branch -D ozellik-x

Ama bu sadece yerelde siler. Branch uzak sunucuda da varsa (mesela GitHub'da), orayı ayrıca silmen gerekiyor:

git push origin --delete ozellik-x

Bilmekte fayda var: bir branch'i silmek, içindeki commit'leri gerçekten silmiyor. Sadece referanssız kalıyorlar ve Git'in garbage collector'ı bir gün gelip onları temizleyene kadar repoda öylece duruyorlar — ki bu bazen epey uzun sürebiliyor. Yani git branch -D, göründüğünden daha affedici: yanlış branch'i silersen genelde geri dönüş yolu hâlâ vardır (aşağıdaki reflog kısmına bak). Buna bir plan olarak güvenmem ama orada olduğunu bilmek iyi.

Branch Birleştirme

Genel akış şöyle: içine birleştirmek istediğin branch'e geç, sonra diğerini oraya al.

git checkout main
git merge ozellik-x

Sonrasında ne olacağı, sen branch'i ayırdığından beri main'in ilerleyip ilerlemediğine bağlı. İlerlememişse Git sadece main işaretçisini ozellik-x'e kaydırır — bir fast-forward, merge commit'i falan yok. main bu arada ilerlediyse, Git iki geçmişi birbirine bağlayan gerçek bir merge commit'i oluşturur (2).

Bazen fast-forward mümkün olsa bile o merge commit'ini istersin — böylece bir feature branch'in var olduğu ve birleştirildiği tarihte görünür kalır, değişiklik sessizce içine karışmaz. Bunun için:

git merge --no-ff ozellik-x

Aynı satırlara iki taraftan da dokunulmuşsa, Git durur ve çözümü sana bırakır:

git status

Bu, hangi dosyaların çakıştığını listeler. Her birini aç, rakip değişikliklerin etrafında <<<<<<<, =======, >>>>>>> işaretleri göreceksin — gerçekten kalması gerekeni seç, işaretleri sil, sonra:

git add cozulen-dosya.txt
git commit

İşler değmeyecek kadar karışırsa, tüm işten çekilebilirsin:

git merge --abort

Bu, her şeyi merge'e başlamadan önceki haline tam olarak geri döndürür.

Yanlış Push'u Geri Alma

İnsanların en çok panik yaptığı kısım burası, ama açıkçası panik genelde gereksiz — asıl önemli olan hangi çözüme başvurduğun.

Branch'i başka birinin çekmiş olma ihtimali varsa, geçmişe dokunma. Onun yerine eskisini geri alan yeni bir commit ekle:

git revert <hatali-commit-sha>
git push

Bu, sıkıcı ama her zaman güvenli olan seçenek. Hiçbir şeyi yeniden yazmıyor — sadece hatayı iptal eden bir commit üstüne ekliyor, böylece herkesin geçmişi senkron kalıyor, karşı taraf bir şey yapmak zorunda kalmadan (3).

Branch gerçekten sadece sanaysa ve kimse henüz çekmediyse, geri sarıp yeniden yazabilirsin: (4)

git reset --hard <son-dogru-commit-sha>
git push --force-with-lease

Düz --force yerine --force-with-lease kullan, alışkanlık olsun diye bile olsa. Aradaki fark göründüğünden önemli: --force-with-lease, son fetch'inden beri o branch'e başka birinin push yapıp yapmadığını kontrol eder, yaptıysa reddeder. Düz --force hiçbir şeyi kontrol etmez — başkasının işini uyarı bile vermeden ezer (5).

Ve terminale bakıp son doğru commit'in hangisi olduğunu hatırlamaya çalışıyorsan — git log burada işe yaramaz, çünkü sadece şu an bulunduğun yerden ulaşılabilen commit'leri gösterir, reset ile geride bıraktıkların bunun içinde değildir. İhtiyacın olan:

git reflog

Bu, branch'inin son zamanlarda işaret ettiği her konumu gösterir, normal geçmişten düşmüş olanlar dahil. İşler ters gitmeden önceki noktaya kadar geri git, sonra: (6)

git reset --hard HEAD@{2}

(kendi durumuna uyan konumu ya da SHA'yı yaz). Reflog sadece kendi makinende tutulur ve genelde kayıtları yaklaşık 90 gün saklar — yani bu "yanlış push'lar için acil durum tuşu" olmaktan çok, "sanırım bir şeyi az önce bozdum" anları için genel bir güvenlik ağı. Bu durumun dışında da aklında tutmaya değer.

Kapanış Düşüncesi

Bu üçü de aynı gerçeğe dayanıyor: Git neredeyse hiçbir şeyi hemen atmıyor. Silinmiş branch'ler, reset'lenmiş commit'ler, eski konumlar — hepsi göründüğünden daha uzun süre ortalıkta kalıyor. -D, reset --hard ve force-push'u günlük kullanım için yeterince güvenli kılan da tam olarak bu; yeter ki bir şey ters giderse nereye bakacağını bil.

İlgili Yazılar

Kaynakça

  1. git-branch — branch oluşturma, listeleme ve silme.
  2. git-merge — merge stratejileri ve çakışma çözümü.
  3. git-revert — yeni commit'ler oluşturarak commit'leri geri alma.
  4. git-reset — branch işaretçisini taşımak, --soft, --mixed ve --hard arasındaki farkla birlikte.
  5. git-push: --force-with-lease — neden --force'tan daha güvenli olduğu.
  6. git-reflog — normal geçmişte artık görünmeyen commit'leri kurtarma.

Yorumlar