Kurs
Sürüm kontrolü, modern yazılım geliştirmesinin en önemli unsurlarından biridir. Değişiklikleri izlemenizi, verimli şekilde iş birliği yapmanızı ve kod geçmişini korumanızı sağlar. Mevcut çeşitli araçlar arasında Git, kod değişikliklerini yönetmek için en yaygın kullanılan sistemlerden biri olarak öne çıkar.
Bizim Git’e Giriş kursumuzdan da göreceğiniz gibi, Git; ana kod tabanını etkilemeden farklı özellikler veya düzeltmeler üzerinde çalışmak için dallanmalar sunar. Dallanma geliştirmeyi esnekleştirirken, dalları düzenli tutmak zaman zaman zor olabilir. İşte burada Git rebase devreye girer.
Git Dallarını Anlamak
Bizim Git ve GitHub rehberimizde ele aldığımız gibi, dallar yeni özellikler veya hata düzeltmeleri üzerinde ana kod tabanından bağımsız çalışmanıza olanak tanır. Diğer dallardaki devam eden çalışmaları aksatmadan değişiklik yapabileceğiniz yalıtılmış bir ortam sağlarlar.
Yaygın dallanma iş akışlarından bazıları şunlardır:
- Özellik dalları (feature branches): Yeni işlevler geliştirilip ana dala birleştirilmeden önce kullanılır.
- Sürüm dalları (release branches): Yeni bir sürümden önce kodu stabilize etmek için kullanılır.
- Acil düzeltme dalları (hotfix branches): Kritik sorunları gidermek için oluşturulur.
Bu dalları etkili şekilde yönetmek, temiz ve düzenli bir kod geçmişi sürdürmek için kritik öneme sahiptir.

Git Rebase Nedir?
Git rebase, bir daldaki commit’leri başka bir dalın üzerine taşımaya veya yeniden uygulamaya yarayan bir komuttur. Farklı dallardaki değişiklikleri birleştirerek yeni bir commit oluşturan merge’ün aksine, rebase değişiklikleri hedef dalın üzerine tek tek uygular. Bu da gereksiz birleştirme commit’leri olmadan doğrusal bir geçmişle sonuçlanır.
Rebase sırasında Git, kaynak daldaki her commit’i alır ve hedef dalın en son commit’inin üzerine uygular. Bu, commit geçmişini okumayı ve takip etmeyi kolaylaştırır. Bir deponun tüm commit geçmişini nasıl göreceğimiz hakkında daha fazla bilgiyi Git Diff Rehberi’nde ele alıyoruz.

Neden Git Rebase Kullanılır?
Rebase’in yararlı olmasının birkaç nedeni vardır:
- Doğrusal bir commit geçmişi oluşturur. Birden çok birleştirme commit’inin yer aldığı bir geçmiş yerine, rebase commit günlüğünü temiz ve anlaşılır tutar.
- İş birliğini ve kod incelemesini iyileştirir. Açık bir commit geçmişi, ekiplerin değişiklikleri daha etkili şekilde incelemesine yardımcı olur.
- Gereksiz birleştirme commit’lerinden kaçınır. Merge yerine rebase yaparak dalları güncel tutabilir ve commit günlüğünü kalabalıklaştırmaktan kaçınabilirsiniz.
Bununla birlikte rebase, commit geçmişini yeniden yazdığı ve çatışmalara yol açabileceği veya değişiklikleri takip etmeyi zorlaştırabileceği için özellikle paylaşılan dallarda riskli olabilir. Genel erişime açık dallarda rebase’ten kaçınmak ve iş birliğine dayalı iş akışlarında dikkatli kullanmak en iyisidir.
Git Rebase Ne Zaman Kullanılır
Git rebase’in doğru tercih olduğu birkaç durum vardır. Aşağıda her birini ayrıntılı olarak inceledik.
Yerel özellik dallarını rebase etmek
Bir özellik dalında çalışırken, onu ana daldaki en son değişikliklerle güncellemek yaygındır. Özellik dalı commit’lerini en güncel ana dalın üzerine yerleştiren rebase, merge’e alternatif olarak temiz bir commit geçmişi korumanıza yardımcı olur.
Özellik dallarını güncel tutmak
Aynı depoda birden fazla geliştirici çalıştığında ana dal sık sık değişir. Rebase, gereksiz birleştirme commit’leri eklemeden özellik dalını güncel tutmaya yardımcı olur.
Ekip iş birliğinde rebase
Ekip içinde çalışırken rebase, çatışmaları oluşmadan önce önlemeye yardımcı olabilir. Bir özellik dalını düzenli olarak ana dalın üzerine rebase ederek değişiklikleri kademeli olarak entegre edebilir, ileride yaşanacak birleştirme çatışmalarının riskini azaltabilirsiniz.
Git Rebase İçin Adım Adım Kılavuz
Bu bölümde sizi Git ile rebase sürecinde adım adım yönlendirecek, bilmeniz gereken her şeyi anlatacağız.

Rebase’e hazırlanma
Rebase’e başlamadan önce çalışma dizininin temiz olduğundan emin olun. Bu, rebase’ten önce yaptığınız değişiklikleri commit etmeniz veya geçici olarak saklamanız (stash) gerektiği anlamına gelir.

Ayrıca, aşağıdaki komutu çalıştırarak doğru dalda olduğunuzu kontrol edin:
git branch
En son değişiklikleri çekmek
Rebase’ten önce yerel deponuzun uzak depodaki en son değişikliklere sahip olduğundan emin olun:
git fetch origin
Özellik dalına geçmek
Rebase edilmesi gereken özellik dalına geçin:
git checkout your-feature-branch
Ana dalın üzerine rebase etmek
Özellik dalı commit’lerini en güncel ana dalın üzerine uygulamak için şunu çalıştırın:
git rebase main
Git, özellik dalındaki her commit’i güncellenmiş ana dalın üzerine yeniden uygular.

git rebase main komutunu çalıştırdığınızda Git, ana daldaki değişiklikleri alır ve özellik dalınızın commit’lerinden önce uygular. Bu, geçmişinizi temiz ve doğrusal tutar. Bu süreç, commit’lerinizi main’in en son durumu üzerine tekrar oynatarak birleştirme commit’leri olmadan doğrusal bir proje geçmişi oluşturur.
Örneğin ana dalda A ve B commit’leri olsun. Özellik dalınız A’dan ayrıldı ve C ile D commit’lerini içeriyor olsun.
A---B (main)
\
C---D (feature)
git rebase main sonrasında, özellik dalınız main’den gelen commit’lerin ve ardından kendi commit’lerinizin yer aldığı şekilde güncellenir:
---B---C'---D' (feature)
Burada C ve D, özgün değişikliklerinizi temsil eden ve artık B’nin üzerine dayanan yeni commit’lerdir.
Çatışmaları çözmek (varsa)
Rebase sırasında çatışmalar ortaya çıkarsa Git durur ve onları çözmenize izin verir.
Çözdükten sonra çatışmaları çözüldü olarak işaretleyin:
git add .
git rebase --continue
Gerekirse rebase’i şu komutla iptal edebilirsiniz:
git rebase --abort
Rebase’i tamamlama
Başarılı bir rebase’ten sonra dalı doğrulayın ve her şeyin doğru çalıştığından emin olmak için kodu test edin.
Git’te etkileşimli rebase
Önceki bölümde yaptığınız yaygın rebase’in yanı sıra etkileşimli rebase de yapabilirsiniz. Aşağıda göreceğiniz üzere bu yöntem size daha fazla kontrol sağlar.
Etkileşimli rebase nedir?
Etkileşimli rebase git rebase -i, commit’leri uygulamadan önce değiştirmenize izin verir. Bu mod; commit’leri yeniden sıralama, düzenleme, birleştirme (squash) ve kaldırma gibi seçenekler sunar.
Neden etkileşimli rebase kullanılır?
Etkileşimli rebase, commit geçmişini iyileştirirken kullanışlıdır. Birden fazla commit’i birleştirmenize, commit mesajlarını düzenlemenize ve ana dala birleştirmeden önce gereksiz commit’leri kaldırmanıza yardımcı olur.
Etkileşimli rebase’in yaygın kullanımları
- Commit’leri yeniden sıralama. Geçmişi daha anlaşılır kılmak için commit’lerin sırasını değiştirin.
- Birden çok commit’i birleştirme. Birkaç küçük commit’i anlamlı tek bir commit’te toplayın.
- Commit mesajlarını düzenleme. Değişiklikleri göndermeden önce commit mesajlarını değiştirin. Kodda nelerin güncellendiğini netleştirmek için uygun commit mesajları yazmak önemlidir; bunu GIT Push ve Pull eğitimimizde gösteriyoruz.
Etkileşimli rebase nasıl yapılır
Etkileşimli rebase’i başlatmak için şunu çalıştırın:
git rebase -i HEAD~n
n değerini değiştirmek istediğiniz commit sayısıyla değiştirin. Etkileşimli arayüz, her commit’i nasıl ele alacağınızı seçmenize olanak tanır.
En iyi uygulamalar ve dikkat edilmesi gerekenler
Rebase yaparken bazı en iyi uygulamalara uymak önemlidir. Bu bölümde bunların bazılarını ele alalım.
Paylaşılan dalları rebase etmekten kaçının
Başkalarının üzerinde çalıştığı bir dalı rebase etmek çatışmalara ve kafa karışıklığına yol açabilir. Paylaşılan bir dal zaten gönderildiyse (push), rebase etmekten kaçının.
Düzenli olarak fetch ve rebase yapın
Bir özellik dalını ana daldaki en son değişikliklerle güncel tutmak, çatışmaları önlemeye yardımcı olur ve birleştirmeyi daha sorunsuz hale getirir.
Rebase’ten önce yedek alın
Rebase, commit geçmişini değiştirdiğinden, başlamadan önce yedek almak iyi bir uygulamadır. git stash kullanmak veya geçici bir dal oluşturmak, kazara veri kaybını önleyebilir.
Yaygın tuzaklar ve bunlardan nasıl kaçınılır
Rebase yaparken karşılaşılan yaygın zorluklara ve bunlardan nasıl kaçınılacağına bakalım.
Yanlışlıkla herkese açık bir dalı rebase etmek
Daha önce paylaşılmış bir dalı rebase etmek, diğer katkıda bulunanlar için çatışmalar yaratabilir. Böyle bir durumda, kaybolan commit’leri kurtarmak için git reflog kullanın.
Çatışmaları çözmede zorluklar
Çatışmalar oluştuğunda, bunları dikkatlice çözmek için zaman ayırın. git mergetool gibi araçları kullanmak süreci kolaylaştırabilir.
Commit geçmişini kaybetmek
Rebase’ten sonra commit’ler kaybolursa, onları bulup geri yüklemek için git reflog kullanın.
Sonuç
Git rebase, temiz bir commit geçmişi sürdürmek ve iş birliğini geliştirmek için güçlü bir araçtır. Bunu doğru şekilde kullanarak—paylaşılan dalları rebase etmekten kaçınarak, güncellemeleri düzenli olarak çekip rebase ederek ve değişiklikleri yedekleyerek—sürüm kontrolünü kolaylaştırabilir ve birleştirme çatışmalarını azaltabilirsiniz.
Bu teknikleri uygulayarak depolarınızı düzenli, iş akışlarınızı verimli tutun. Git uzmanlığınızı derinleştirmek ister misiniz? Orta Düzey Git kursumuza göz atın ve yazılım ile veri projelerinizde sürüm kontrolünün temellerini keşfedin.
Git Rebase SSS
Git rebase ile Git merge arasındaki fark nedir?
Git merge, iki daldaki değişiklikleri birleştiren yeni bir commit oluşturur ve her iki geçmişi de olduğu gibi korur. Git rebase ise bir daldaki commit’leri alıp başka bir dalın üzerine ardışık olarak uygular; böylece ekstra birleştirme commit’leri olmadan doğrusal bir commit geçmişi elde edilir.
Git merge yerine ne zaman Git rebase kullanmalıyım?
Özellikle özellik dalları için temiz ve doğrusal bir commit geçmişi korumak istediğinizde Git rebase kullanın. Özellik dalını ana dala birleştirmeden önce gereksiz birleştirme commit’lerinden kaçınmak için özellikle uygundur. Ancak paylaşılan dallarda rebase yapmaktan kaçının; commit geçmişini yeniden yazdığı için ekip arkadaşlarınız için sorunlara neden olabilir.
Git rebase sırasında çatışmalarla karşılaşırsam ne olur?
Rebase sırasında bir çatışma oluşursa Git durur ve sizi çatışmaları çözmeniz için yönlendirir. Çatışmalı dosyaları elle düzeltmeniz, git add . ile sahnelemeniz ve ardından git rebase --continue ile rebase’e devam etmeniz gerekir. Çatışmalar çok karmaşıksa, git rebase --abort komutuyla rebase’i iptal edip baştan başlayabilirsiniz.
Uzak depoya gönderilmiş bir dalı rebase etmek güvenli midir?
Hayır, başkalarıyla paylaşılıp uzak depoya gönderilmiş bir dalı rebase etmek güvenli değildir; çünkü commit geçmişini yeniden yazar. Paylaşılan bir dalı mutlaka rebase etmeniz gerekiyorsa, ekibinizle iletişim kurun ve başkasının değişikliklerinin üzerine yazmamak için git push --force-with-lease komutunu dikkatli kullanın.
Bir şeyler ters giderse Git rebase’i nasıl geri alabilirim?
Rebase’in sorun yarattığını fark ederseniz, rebase’ten önceki commit’i bulmak için git reflog kullanabilir ve git reset --hard <commit-hash> ile geri dönebilirsiniz. Başka bir seçenek de rebase hâlâ devam ediyorsa ve henüz tamamlanmadıysa git rebase --abort kullanmaktır.
