Yan yana
MergevsRebase
git merge ile git rebase arasındaki fark nedir?
Güncellendi 2 dk okuma7 fark
Kısaca
Git merge iki dalı, tüm geçmişi koruyan bir merge commit'iyle birleştirir; git rebase ise commit'lerinizi başka bir dalın üstüne taşıyıp düz bir geçmiş üretir.
Merge
Git'te merge, bir branch'teki değişiklikleri başka bir branch'e katarak ayrı geliştirme hatlarını tek ve ortak bir geçmişte yeniden birleştirir.
Merge sayfasını okuRebase
Git'te rebase, bir branch'in commit'lerini başka bir commit'in üzerine yeniden uygular; geçmişi yeniden yazıp merge commit'siz, temiz ve doğrusal kılar.
Rebase sayfasını okuMerge ve Rebase karşılaştırması
| Özellik | Merge | Rebase |
|---|---|---|
| Ne yapar | İki dalı yeni bir merge commit'iyle birleştirir | Commit'lerinizi başka bir dalın üstünde yeniden oynatır |
| Geçmişin biçimi | İşin nerede ayrılıp birleştiğini gösteren dallanan geçmiş | Tek, düz, doğrusal bir geçmiş |
| Mevcut commit'ler | Değişmeden kalır | Yeni commit kimlikleriyle yeniden yazılır |
| Çakışmalar | Bir kez, merge commit'inde çözülür | Yeniden oynatılan her commit için ayrı ayrı çözülebilir |
| Paylaşılan dallarda güvenli mi | Evet, geçmişi asla yeniden yazmaz | Hayır, başkalarında commit'lerin eski kopyaları kalır |
| Sonrasında push | Normal bir git push çalışır | Daha önce push edildiyse git push --force-with-lease gerekir |
| En uygun olduğu yer | Bitmiş işi paylaşılan dallara entegre etmek | Özel bir özellik dalını güncellemek ve commit'leri derlemek |
Fark, açıklamalı
git merge ve git rebase, ikisi de bir daldaki değişiklikleri başka bir dala getirir. Merge, iki geçmişi iki ebeveyni olan yeni bir merge commit'iyle birbirine bağlar. Rebase ise yalnızca sizin dalınızda bulunan commit'leri alır, hedef dalın üstünde tek tek yeniden oynatır ve yeni commit kimlikleriyle kopyalarını oluşturur.
Fark, geçmişe ne olduğudur. Merge yıkıcı değildir: mevcut commit'ler asla değişmez, böylece bir dalın ne zaman ayrılıp geri döndüğünü her zaman görebilirsiniz; ama günlük merge commit'leriyle dolabilir. Rebase, okuması ve aranması daha kolay, dümdüz doğrusal bir geçmiş verir; ama commit'leri yeniden yazar ve bu, eski hâllerine zaten sahip olan herkes için sorun çıkarır.
Birçok ekip ikisini de kullanır: geliştiriciler kendi özellik dallarını güncel ve derli toplu tutmak için en son main üzerine rebase eder, sonra onu bir pull request aracılığıyla merge eder. Altın kural, başkalarının zaten çektiği commit'leri, örneğin paylaşılan bir main dalındakileri, asla rebase etmemektir.
Sık yapılan bir yanlış, rebase'in merge çakışmalarını önlediği düşüncesidir. Aynı satırlar değiştiyse çakışmalar her iki durumda da olur; rebase ile bunları tüm merge için bir kez değil, yeniden oynatılan her commit için ayrı ayrı çözmeniz bile gerekebilir.
Hangisini kullanmalısınız?
Merge şu durumlarda doğru seçim:
- Dal, diğer geliştiricilerle paylaşılıyor.
- İşin ne zaman ayrılıp birleştirildiğinin gerçek bir kaydını istiyorsunuz.
- Tüm çakışmaları tek adımda çözmeyi tercih ediyorsunuz.
Rebase şu durumlarda doğru seçim:
- Kendi özellik dalınızı en son
mainile güncelliyorsunuz. - Okuması kolay, temiz ve doğrusal bir geçmiş istiyorsunuz.
- Pull request açmadan önce commit'leri derlemek istiyorsunuz.
Bir özellik dalını main ile güncellemek
# Bring the latest main into your feature branch
git switch feature
git merge main
# Result: existing commits stay as they are, plus one
# new merge commit with two parents (feature and main)
git log --oneline --graph# Replay your feature commits on top of main
git switch feature
git rebase main
# Result: your commits get new IDs and follow
# main's latest commit in one straight line
git log --oneline --graph
# Already pushed the branch? Update it safely
git push --force-with-leaseSık sorulan sorular
Rebase, merge'den daha mı iyi?
Genel olarak hiçbiri diğerinden iyi değildir. Rebase özel dallarda geçmişi doğrusal ve derli toplu tutar; merge ise commit'leri asla yeniden yazmadığı için paylaşılan dallarda daha güvenlidir.
git rebase ne zaman kullanılmamalı?
Başkalarının zaten çektiği commit'leri, örneğin main ya da başka bir paylaşılan daldakileri rebase etmeyin. Onları yeniden yazmak, herkesi yerel kopyalarını onarmak zorunda bırakır.
Rebase ile squash merge arasındaki fark nedir?
Squash merge, bir dalın tüm commit'lerini hedef dalda tek bir yeni commit'te birleştirir; rebase ise her commit'i ayrı tutar ama onları yeni bir tabana taşır.