Git'te rebase mi, merge mi? Ekipte kavga çıkarmadan karar vermek
Rebase temiz bir geçmiş verir ama yanlış yerde kullanılırsa ekip arkadaşınızın işini siler. Merge güvenlidir ama geçmişi karmaşıklaştırır. İkisinin farkını, altın kuralı ve pratikte kullandığım düzeni anlatıyorum.
Ana daldaki yeni değişiklikleri kendi dalınıza almanın iki yolu var ve ikisinin de hararetli savunucuları var. Aslında ikisi farklı işler için.
Merge: geçmişi olduğu gibi korur
git switch ozellik
git merge main
İki dalın birleştiği yerde bir birleştirme commit'i oluşur. Hiçbir commit değişmez. Güvenlidir, ama çok sayıda birleştirme commit'i geçmişi okumayı zorlaştırır.
Rebase: commit'lerinizi yeniden yazar
git switch ozellik
git rebase main
Sizin commit'leriniz, ana dalın en ucuna taşınmış gibi yeniden oluşturulur. Geçmiş düz bir çizgi olur. Ama commit'lerin kimliği (hash) değişir.
Altın kural
Başkalarının da üzerinde çalıştığı, paylaşılmış bir dalı rebase etmeyin. Commit'ler değiştiği için ekip arkadaşınızın elindeki geçmişle sizinki uyuşmaz ve zorla gönderim (force push) onların işini ezebilir.
Kendi dalınızı yine de zorla göndermeniz gerekirse --force yerine şunu kullanın:
git push --force-with-lease
Bu, uzak dalda sizin görmediğiniz bir değişiklik varsa gönderimi reddeder.
Pratikte kullandığım düzen
git config --global pull.rebase true:git pullher seferinde gereksiz birleştirme commit'i üretmez.- Yalnızca bana ait özellik dalını, ana dala göndermeden önce rebase ederim.
- Dağınık commit'leri (
düzeltme,yine düzeltme) göndermeden önce etkileşimli rebase ile toparlarım. - Ana dala birleştirmeyi pull request üzerinden yaparım; ekip "squash" mı "merge" mi kullanacağına bir kez karar verir ve herkes ona uyar.
Bir şey ters giderse
git reflog
Rebase sonrası "commit'lerim kayboldu" panikleri için kurtarıcı. Git, dalın son haftalarda gösterdiği her noktayı burada tutar; eski hâle git reset --hard <kayıt> ile dönebilirsiniz.
Sonuç
Doğru cevap "ikisi de" ama yerine göre: kendi dalınızda rebase, paylaşılan dallarda merge. Asıl önemli olan, ekibin tek bir kurala uyması.