1. Home
  2. Docs
  3. Utils
  4. Git
  5. Git Rebase ve Interactive Rebase (git rebase -i) ile Temiz Commit Geçmişi

Git Rebase ve Interactive Rebase (git rebase -i) ile Temiz Commit Geçmişi

Print

Yazılım geliştirme sürecinde bir özellik dalı (feature branch) üzerinde çalışırken sık sık ara kayıtlar alırız: “WIP: typo fix”, “küçük hata düzeltildi”, “test için console.log eklendi” gibi onlarca dağınık commit oluşur. Bu dalı ana dala (main / master) doğrudan merge etmek, proje geçmişini okunamaz bir commit çöplüğüne çevirir. Profesyonel yazılım ekiplerinde Git interactive rebase kullanımı (git rebase -i); commit geçmişini yeniden yazarak gereksiz commit’leri birleştirmeyi (squash), mesajları düzenlemeyi ve tertemiz bir git tarihçesi oluşturmayı sağlar.

Bu rehberde; Git Rebase ile Merge arasındaki farkları, git rebase -i komutunun komut setini (pick, reword, squash, fixup, drop), çakışma (conflict) çözme adımlarını ve tehlikeli force push kurallarını inceleyeceğiz.


Rebase vs Merge: Temel Mantık Farkı

  • Git Merge: İki dalın uçlarını birleştiren yeni bir “Merge Commit” oluşturur. Geçmişteki tüm dallanmaları korur ancak karmaşık projelerde örümcek ağı gibi bir git grafiği üretir.
  • Git Rebase: Mevcut dalın temelini (base) hedef dalın en son commit’inin üzerine taşır. Commit’leri sanki hedef dalın devamıymış gibi sırayla yeniden uygular (Re-play). Sonuç: Dümdüz, doğrusal (linear) ve okuması kolay bir geçmiş.
KriterGit MergeGit Rebase
Geçmiş YapısıDallı budaklı, merge commit’leri içerirTamamen doğrusal (Linear History)
Commit ID’leriOrijinal SHA’lar değişmezYeniden oluşturulduğu için SHA’lar değişir
Kullanım Yerimain dalına nihai birleştirmeÖzellik dalını güncelleme ve temizleme

İnteraktif Rebase: git rebase -i Nasıl Çalışır?

Son 4 commit’i incelemek ve düzenlemek istediğinizde:

git rebase -i HEAD~4

Varsayılan metin editörünüzde (Nano, Vim veya VS Code) en eskiden en yeniye doğru sıralanmış bir commit listesi ve komut kılavuzu açılır:

pick 1a2b3c4 feat: kullanıcı giriş formu tasarımı
pick 5d6e7f8 fix: şifre doğrulama regex hatası
pick 9a0b1c2 stil düzeltmesi yapıldı
pick 3d4e5f6 gereksiz loglar silindi

# Rebase 4e5f6a1..3d4e5f6 onto 4e5f6a1 (4 commands)
#
# Commands:
# p, pick <commit> = commit'i olduğu gibi kullan
# r, reword <commit> = commit'i kullan ama commit mesajını değiştir
# e, edit <commit> = commit'i kullan ama dosya içeriğini değiştirmek için duraklat
# s, squash <commit> = commit'i bir önceki commit ile BİRLEŞTİR ve mesajları koru
# f, fixup <commit> = commit'i bir önceki ile birleştir ama bu mesajı ÇÖPE AT
# d, drop <commit> = bu commit'i tamamen SİL

Pratik Komutlar ve Kullanım Senaryoları

1. Commit’leri Birleştirmek (Squash ve Fixup)

Üstteki örnekte 3 küçük commit’i tek bir temiz commit haline getirmek için pick kelimelerini squash (veya s) / fixup (veya f) ile değiştiririz:

pick 1a2b3c4 feat: kullanıcı giriş formu tasarımı
squash 5d6e7f8 fix: şifre doğrulama regex hatası
fixup 9a0b1c2 stil düzeltmesi yapıldı
fixup 3d4e5f6 gereksiz loglar silindi

Dosyayı kaydedip kapattığınızda:

  • 9a0b1c2 ve 3d4e5f6 mesajları sessizce ilk commit’e yedirilir.
  • Git sizden yeni birleşik commit için tek ve temiz bir mesaj girmenizi ister.

2. Geçmişteki Bir Commit Mesajını Değiştirmek (reword)

Pushlanmış Commit’in Mesajını Düzenlemek rehberimizde tek bir commit için git commit --amend kullanmıştık. Ancak 5 commit gerideki bir yazım hatasını düzeltmek için reword (veya r) kullanılır:

reword 1a2b3c4 feat: kullanıcı giriş formu tasarımı

Dosyayı kaydettiğinizde Git otomatik olarak durur ve sadece o commit’in mesajını düzenlemeniz için yeni bir ekran açar.

3. İstenmeyen Bir Commit’i Tarihten Silmek (drop)

İstemeden eklediğiniz bir commit’i ya satırını tamamen silerek ya da başına drop (veya d) yazarak yok edebilirsiniz.


Rebase Sırasında Çakışma (Conflict) Yönetimi

Rebase sırasında bir çakışma çıkarsa korkmayın; Git o commit’te duraklar:

# 1. Hangi dosyalarda çakışma olduğunu gör
git status

# 2. Dosyaları açıp conflict işaretlerini (<<<<<<<, =======, >>>>>>>) temizle

# 3. Çözülen dosyaları sahnele
git add .

# 4. Rebase'e kaldığı yerden devam et (ASLA git commit yapmayın!)
git rebase --continue

# Eğer işler sarpa sararsa ve eski haline dönmek isterseniz:
git rebase --abort

Altın Güvenlik Kuralı: Ortak Dallarda Rebase Yapmayın!

HAYATİ UYARI: main, master veya ekiple ortak kullanılan paylaşımlı dallarda asla rebase yapmayın! Rebase commit SHA kimliklerini değiştirdiği için diğer ekip arkadaşlarının yerel depolarıyla senkronizasyon kopar.
Rebase’i yalnızca kendi kişisel özellik dalınızda (feature branch) yapın. Temizledikten sonra ana dala gönderin.

Eğer uzak sunucuya önceden push yaptığınız bir dalda rebase yaptıysanız, uzak sunucudaki dalı güncellemek için git push --force-with-lease kullanın (bu bayrak, sizden habersiz başkası push yaptıysa kazara ezmenizi engeller).


Özet

git rebase -i, profesyonel bir yazılımcının kod kalitesini gösteren vitrinidir. Dağınık deneme commit’lerini tek bir mantıksal birimde toplayarak ekip arkadaşlarınıza ve açık kaynak topluluğuna pırıl pırıl bir çekme isteği (Pull Request) sunabilirsiniz.

Tags , , , ,

How can we help?