Fast-Forward Merge
İleri Sarma Birleştirmesi
- Okunuşu
- fest forvırd mörc
Kısaca
Fast-forward merge, hedef branch'te diğer branch ayrıldığından beri yeni commit yoksa olur; Git merge commit'i oluşturmaz, işaretçiyi yalnızca ileri taşır.
Fast-forward merge nedir?
main'den bir feature branch'i oluşturduğunuzu, üç commit yaptığınızı ve bu arada kimsenin main'e bir şey eklemediğini düşünün. Geçmiş düz bir çizgidir: main, feature'ın hemen gerisindedir. feature'ı main'e birleştirmek hiçbir şeyi birleştirmeyi gerektirmez; bu yüzden Git main işaretçisini son feature commit'ine taşır. Buna fast-forward denir ve sonuç fazladan merge commit'i olmayan doğrusal bir geçmiştir.
Branch oluşturulduktan sonra main ilerlemişse iki çizgi ayrışmıştır ve fast-forward mümkün değildir. Git o zaman ya iki ebeveynli bir merge commit'i oluşturur ya da siz önce branch'i yeni main'in üzerine rebase edersiniz; bu da onu yeniden fast-forward yapılabilir hâle getirir. git pull da yerel branch'iniz ile uzaktaki branch ikisi birden değiştiğinde aynı seçimle karşılaşır.
Ekipler politikalarını bayraklarla seçer. git merge --ff-only, fast-forward yapamıyorsa birleştirmeyi reddeder ve geçmişi kesinlikle doğrusal tutar. git merge --no-ff ise fast-forward mümkün olsa bile her zaman bir merge commit'i oluşturur; böylece her özellik görünür bir commit grubu olarak durur. Barındırma platformları da GitHub'ın merge, squash ve rebase düğmeleri gibi benzer seçimler sunar.
Sık yapılan bir yanlış, fast-forward merge'ün bilgi kaybettirdiğini düşünmektir. Hiçbir commit değiştirilmez ya da silinmez; yalnızca branch işaretçisi hareket eder. Kaybolan şey, commit'lerin ayrı bir branch'te geliştirildiğine dair kayıttır; bazı ekiplerin özellikler için merge commit'lerini, küçük güncellemeler için fast-forward'ları tercih etmesinin nedeni budur.
Önemli noktalar
- Fast-forward, merge commit'i oluşturmak yerine branch işaretçisini taşır.
- Yalnızca hedef branch ayrışmamışsa mümkündür.
- Bir branch'i en son main üzerine rebase etmek onu fast-forward yapılabilir kılar.
- --ff-only doğrusal geçmişi zorunlu kılar; --no-ff her zaman bir merge commit'i kaydeder.
- Hiçbir commit kaybolmaz, yalnızca bir feature branch'inin görünür gruplaması kaybolur.
Örnek
git switch main
git merge feature
# Updating 41d0e77..9f2c1ab
# Fast-forward ← main simply moved to feature's last commit
git merge --ff-only hotfix # merge only if it can fast-forward, otherwise stop
git merge --no-ff feature # always create a merge commit for the feature
git config --global pull.ff only # make 'git pull' refuse non-fast-forward mergesSık sorulan sorular
Git ne zaman fast-forward merge yapar?
Birleştirilen branch'te diğer branch'te olmayan commit yoksa, yani geçmiş ayrışmamışsa. Git o zaman varsayılan olarak merge commit'i oluşturmak yerine işaretçiyi ileri taşır.
--no-ff ne işe yarar?
Fast-forward mümkün olsa bile Git'i bir merge commit'i oluşturmaya zorlar; böylece özelliğin commit'leri geçmişte tek bir merge altında gruplu kalır.
Fast-forward mı merge commit'i mi: hangisi daha iyi?
Bu bir ekip tercihidir. Fast-forward'lar ve rebase'ler okunması ve bisect yapılması kolay, temiz ve doğrusal bir geçmiş verir. Merge commit'leri ise özelliklerin ne zaman ve nasıl entegre edildiğini korur. Birçok ekip küçük değişiklikleri squash ya da rebase eder, büyük özellikler için merge commit'leri kullanır.
İlgili sayfalar
- MergeSürüm Kontrolü, s. 29Git'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.
- RebaseSürüm Kontrolü, s. 33Git'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.
- BranchSürüm Kontrolü, s. 2Git'te branch, bir özellik ya da düzeltme üzerinde, birleştirene kadar ana kodu etkilemeden çalışmanızı sağlayan bağımsız bir geliştirme hattıdır.
- Squash MergeSürüm Kontrolü, s. 36Squash merge, bir branch'teki tüm commit'leri hedef branch üzerinde tek bir yeni commit'te birleştirir; böylece ana geçmiş kısa ve okunması kolay kalır.
- Git PullSürüm Kontrolü, s. 17Git pull, uzak bir depodan yeni commit'leri indiren ve bunları hemen mevcut yerel branch'inize entegre eden bir Git komutudur.
- Trunk-Based DevelopmentSürüm Kontrolü, s. 39Trunk-based development, geliştiricilerin küçük değişiklikleri en az günde bir kez ortak ana branch'e birleştirip onu hep yayımlanabilir tuttuğu stratejidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin