Ana içeriğe geç

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ı oku

Rebase

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ı oku

Merge ve Rebase karşılaştırması

ÖzellikMergeRebase
Ne yaparİki dalı yeni bir merge commit'iyle birleştirirCommit'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'lerDeğişmeden kalırYeni commit kimlikleriyle yeniden yazılır
ÇakışmalarBir kez, merge commit'inde çözülürYeniden oynatılan her commit için ayrı ayrı çözülebilir
Paylaşılan dallarda güvenli miEvet, geçmişi asla yeniden yazmazHayır, başkalarında commit'lerin eski kopyaları kalır
Sonrasında pushNormal bir git push çalışırDaha önce push edildiyse git push --force-with-lease gerekir
En uygun olduğu yerBitmiş 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 main ile 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

Mergebash
# 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
Rebasebash
# 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-lease

Sı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.

Daha fazla

Ayarlar