Git Repository’de Commit History Temizleme Nasıl Yapılır? (Adım Adım Rehber)

Git Repository’de Commit History Temizleme Nasıl Yapılır? (Adım Adım Rehber)
audio-thumbnail
Git Repository’de Commit History Temizleme Nasıl Yapılır? (Adım Adım Rehber)
0:00
/0

Git Repository’de Commit History Temizleme Nasıl Yapılır? (Adım Adım Rehber)

Yazılım geliştirme sürecinde Git kullanırken, bazen commit geçmişimiz (commit history) kontrolden çıkabilir. "Fix", "typo", "test 2", "düzenleme" gibi tekrar eden ve anlamsız commit’ler, projenin geçmişini okumayı zorlaştırır. Daha da kötüsü, yanlışlıkla commit edilen API anahtarları veya şifreler gibi hassas veriler ciddi güvenlik açıklarına yol açar.

Neyse ki Git, geçmişi düzenlemek ve temizlemek için bize güçlü araçlar sunar. Bu rehberde, Git repository'de commit history temizleme işlemlerini farklı senaryolara göre adım adım inceleyeceğiz.


⚠️ Önemli Uyarı: Force Push Tehlikesi!

Geçmişi temizleme işlemlerinin neredeyse tamamı Git geçmişini yeniden yazar. Eğer bu projede başkalarıyla birlikte çalışıyorsanız, geçmişi değiştirdikten sonra yapacağınız bir git push --force işlemi, takım arkadaşlarınızın çalışma alanlarını bozabilir.

Kural: Ortak kullanılan (main, master, develop gibi) dallarda (branch) zorunlu olmadıkça geçmişi değiştirmeyin. Eğer yapacaksanız, mutlaka ekibinize haber verin.


Senaryo 1: Son Birkaç Commit'i Birleştirmek (Squash)

En sık karşılaşılan durum, birbirini takip eden küçük commit’leri tek bir anlamlı commit haline getirmektir. Bunun için Interactive Rebase kullanırız.

Adım Adım git rebase -i Kullanımı:

  1. Terminali açın ve projenizin dizinine gidin.
  2. Birleştirmek istediğiniz commit sayısını belirleyin (Örneğin son 3 commit için): bash git rebase -i HEAD~3
  3. Karşınıza varsayılan metin editörünüzde (genellikle Vim veya Nano) bir liste çıkacaktır: text pick a1b2c3d İlk commit mesajı pick e4f5g6h Ufak düzeltme pick i7j8k9l typo giderildi
  4. Birleştirmek istediğiniz commit'lerin başındaki pick kelimesini squash (veya kısaca s) ile değiştirin. En üstteki (en eski) commit pick olarak kalmalıdır: text pick a1b2c3d İlk commit mesajı squash e4f5g6h Ufak düzeltme squash i7j8k9l typo giderildi
  5. Dosyayı kaydedip kapatın.
  6. Git size yeni ve tek bir commit mesajı yazmanız için yeni bir ekran açacaktır. Buraya birleştirilmiş commit için temiz bir mesaj yazın ve kaydedin.
  7. Değişiklikleri uzak sunucuya (remote) göndermek için: bash git push origin <branch-adi> --force-with-lease (Not: --force-with-lease, standart --force komutuna göre daha güvenlidir; sizden habersiz yapılan uzak değişikliklerin ezilmesini önler).

Senaryo 2: Commit Geçmişini Tamamen Sıfırlamak (Yepyeni Bir Başlangıç)

Bir projeyi açık kaynaklı hale getirmek istiyor ama geçmişteki tüm "karalama" commit'lerinizi gizlemek mi istiyorsunuz? Projenin mevcut durumunu koruyarak tüm geçmişi tek bir "Initial Commit" haline getirebilirsiniz.

Adım Adım Temiz Bir Başlangıç:

  1. Geçici ve bağımsız (orphan) bir branch oluşturun: bash git checkout --orphan gecici-branch
  2. Tüm dosyaları bu yeni branch'e ekleyin: bash git add -A
  3. İlk commit'inizi oluşturun: bash git commit -m "Initial commit (Proje başlangıcı)"
  4. Eski ana branch'inizi (örneğin main) yerelde silin: bash git branch -D main
  5. Bulunduğunuz geçici branch'in adını main olarak değiştirin: bash git branch -m main
  6. Bu yeni ve temiz geçmişi uzak sunucuya zorla (force) push edin: bash git push -f origin main

Artık repository'nizde sadece tek bir commit görünecektir!


Senaryo 3: Belirli Bir Commit'e Geri Dönmek (Reset)

Yaptığınız son birkaç commit'ten tamamen vazgeçmek ve projeyi belirli bir ana geri döndürmek istiyorsanız git reset kullanabilirsiniz.

  • Soft Reset (Kodları kaybetmeden geçmişi siler): Değişiklikleriniz bilgisayarınızda (Staging area) kalır, sadece commit'ler silinir. bash git reset --soft HEAD~2 # Son 2 commit'i geri alır, kodlar kalır.
  • Hard Reset (Kodlarla birlikte geçmişi siler - Geri dönüşü yoktur!): Hem commit'leri hem de o commit'lerle gelen kod değişikliklerini tamamen siler. bash git reset --hard HEAD~2 # Son 2 commit'i ve kodları tamamen yok eder.

Senaryo 4: Geçmişten Hassas Verileri Silmek (Şifre, API Key vb.)

Eğer yanlışlıkla bir şifreyi commit ettiyseniz ve bunu sonraki commit'lerde sildiyseniz, o şifre hala Git geçmişinde duruyor demektir.

Bunu temizlemek için eski yöntem olan git filter-branch yerine, artık çok daha hızlı ve güvenli olan git-filter-repo aracını kullanmanız önerilir.

git-filter-repo ile Hassas Dosya Silme:

  1. Öncelikle bu aracı bilgisayarınıza yükleyin (Python gerektirir): bash pip install git-filter-repo
  2. Şifre içeren dosyanızı tüm Git geçmişinden tamamen silmek için: bash git filter-repo --path secret.txt --invert-paths
  3. Bu işlemden sonra uzak sunucu bağlantınız (remote) silinebilir. Remote adresinizi tekrar ekleyin: bash git remote add origin <repository-url>
  4. Değişiklikleri uzak sunucuya zorla gönderin: bash git push origin --force --all

Özet ve En İyi Pratikler (Best Practices)

  • Commit'lerinizi küçük ve anlamlı tutun: "Atomic commits" yaklaşımını benimseyerek her commit'te sadece tek bir işi tamamlayın.
  • Commit mesajı standartları kullanın: Conventional Commits standartlarını kullanarak (feat:, fix:, docs:) daha okunabilir bir geçmiş oluşturun.
  • .gitignore dosyasını aktif kullanın: Hassas verilerin (env dosyaları, API anahtarları) yanlışlıkla commit edilmesini en baştan önleyin.

Git repository'nizde commit history temizleme işlemleri, projenizin profesyonelliğini ve okunabilirliğini artırır. Yukarıdaki yöntemlerden ihtiyacınıza en uygun olanını seçerek hemen temizliğe başlayabilirsiniz!