Git merge vs rebase: farklar, örnekler ve hangisi ne zaman kullanılır

  1. Ana Sayfa
  2. Blog
  3. Yazılım Geliştirme
Yazılım Geliştirme

Git merge vs rebase: farklar, örnekler ve hangisi ne zaman kullanılır

Git merge ve rebase tercihi, projenizin geçmişinin nasıl görüneceğini belirler. İkisini aynı örnekte gerçek log çıktısıyla görün, felaketleri önleyen tek kuralı öğrenin ve güvenli bir ekip iş akışını kopyalayın.

7 dk okuma
Git merge vs rebase: farklar, örnekler ve hangisi ne zaman kullanılır
Öne çıkanlar
  • Merge, iki dalı yeni bir birleştirme commit’iyle bağlar ve geçmişi olduğu gibi korur.
  • Rebase, commit’lerinizi başka bir dalın üzerinde yeniden oynatır; düz bir çizgi ama yeni commit hash’leri verir.
  • Başkalarının zaten çektiği commit’leri asla rebase etmeyin.
  • Pull request açmadan önce kendi özellik dalınızı rebase edin, ana dala alırken merge kullanın.

Özellik dalınız main‘in gerisinde kaldı ve yeni işlere ihtiyacınız var. Git merge vs rebase, bunu elde etmenin iki yolu arasındaki seçimdir ve ikisi de doğrudur. Fark, sonrasında geçmişin nasıl göründüğündedir.

Küçük bir depo oluşturduk, iki komutu da çalıştırdık ve gerçek çıktıyı aşağıya yapıştırdık; böylece sonucu hayal etmek yerine karşılaştırabilirsiniz. Git’e yeni misiniz? Yeni başlayanlar için Git eğitimimizle (İngilizce) başlayın.

git merge ve git rebase ne yapar

git merge, iki dalın uçlarını alıp birleştirir. İkisinde de yeni commit varsa Git iki ebeveynli bir birleştirme commit’i oluşturur. Var olan hiçbir şey değişmez.

git rebase, yalnızca sizin dalınıza ait commit’leri alıp kenara koyar, dalınızı diğer dalın ucuna taşır ve ardından commit’lerinizi tek tek yeniden oynatır. Yeniden oynatılan commit’ler, değişiklikleri aynı olsa da yeni hash’lere sahip yeni commit’lerdir.

Uygulamada git merge

Başlangıç noktamız: main‘de A commit’i, feature‘da iki commit (F1, F2) ve sonradan main‘e eklenen bir commit daha (M1). Şimdi main‘i feature‘a merge ediyoruz.

git switch feature
git merge main
git log --oneline --graph

*   f507aab Merge main into feature
|\
| * 8842fb5 M1
* | 082cc6a F2
* | 5a71e3c F1
|/
* 8766865 A

Grafik gerçek hikâyeyi gösterir: birleştirilen iki iş hattı. Orijinal F1 ve F2 commit’leri hash’lerini korur. Bedeli fazladan bir birleştirme commit’idir ve yoğun bir projede grafik ağa dönüşür.

Uygulamada git rebase

Aynı başlangıç noktası, ama bu kez feature‘ı main‘in üzerine rebase ediyoruz.

git switch feature
git rebase main
git log --oneline --graph

* 1ff474b F2
* bf9149e F1
* 8842fb5 M1
* 8766865 A

Geçmiş, işe M1’den sonra başlamışsınız gibi tek bir düz çizgidir. Hash’lere bakın: F1 5a71e3c idi, şimdi bf9149e; F2 082cc6a‘dan 1ff474b‘ye değişti. Git onları yeniden yazdı ve rebase’in dikkat istemesinin nedeni budur.

Merge ve rebase yan yana

ÖzellikMergeRebase
Geçmişin biçimiBirleştirme commit’li dallanmış grafikTek düz çizgi
Mevcut commit’lerDeğişmezYeni hash’lerle yeniden yazılır
ÇakışmalarBirleştirme commit’inde bir kez çözülürYeniden oynatılan her commit için düzeltmek gerekebilir
Paylaşılan dallarda güvenli miEvetHayır
En uygun kullanımBiten işi main‘e almakİncelemeden önce kendi dalınızı güncellemek

İpucu: karar veremiyorsanız dalınıza başka kimin sahip olduğunu sorun. Kimse yoksa rebase güvenlidir. Bir meslektaşınız çektiyse merge kullanın.

Rebase’in altın kuralı

Kendi deponuzun dışında var olan commit’leri rebase etmeyin. Rebase’ten sonra dalınız sunucudaki kopyayla uyuşmaz, bu yüzden göndermek zorlama gerektirir. Bir meslektaşınız eski commit’ler üzerine iş kurduysa onun geçmişi artık sizinkiyle çelişir ve bunu düzeltmek zahmetlidir.

Özel özellik dalınızı rebase etmek sorun değildir. main‘i veya başkalarının kullandığı herhangi bir dalı rebase etmek öyle değildir.

Güvenli bir ekip iş akışı

Bu rutin kimseyi şaşırtmadan geçmişi temiz tutar. Çoğu ekip CI hattından önce bunu kullanır; örneğin GitHub Actions CI/CD rehberimizdeki (İngilizce) hat gibi.

git switch feature
git fetch origin
git rebase origin/main        # or: git pull --rebase
# fix conflicts, then: git add <file> && git rebase --continue
git push --force-with-lease   # only on your own branch

--force-with-lease, son fetch’inizden beri biri sunucudaki dala push yaptıysa üzerine yazmayı reddeder; düz --force ise bunu sessizce yok ederdi. Pull request onaylandığında main‘e merge edin.

Kötü bir rebase nasıl geri alınır

Rebase yıkıcı görünür ama eski commit’ler bir süre Git’in reflog‘unda kalır, böylece geri dönebilirsiniz.

git reflog                    # find the commit before the rebase
git reset --hard HEAD@{5}     # example position, check reflog first

Riskli bir rebase’ten önce git branch backup ile yedek dal oluşturun; kurtarma tek komuta iner. Konteynerlerde veritabanı veya araç mı çalıştırıyorsunuz? Yeni başlayanlar için Docker eğitimimize (İngilizce) bakın.

Son sözler

Merge gerçeği korur, rebase onu derli toplu tutar. Kendi dalınızı tazelemek için rebase, teslim etmek için merge kullanın ve başkalarının bağlı olduğu geçmişi asla yeniden yazmayın.

Sık sorulan sorular

git merge ile git rebase arasındaki fark nedir?

Merge iki dalı bir birleştirme commit’iyle birleştirir ve tüm mevcut commit’leri korur. Rebase commit’lerinizi başka bir dalın üzerine taşır ve yeniden yazar; sonuçta doğrusal bir geçmiş oluşur.

Merge mü rebase mi kullanmalıyım?

Güncel kalmak için kendi özellik dalınızı rebase edin, main gibi paylaşılan bir dala teslim ederken merge kullanın. Dalı başkaları paylaşıyorsa her zaman merge kullanın.

git rebase tehlikeli mi?

Özel dallarda güvenli, paylaşılan dallarda riskli; çünkü commit hash’lerini yeniden yazar. Bir şey ters giderse yedek dal ve reflog ile kurtarın.

force-with-lease ne yapar?

Uzak dal hâlâ en son gördüğünüz yerdeyse zorla push yapar; böylece bir meslektaşınızın yeni commit’lerinin üzerine yanlışlıkla yazmazsınız.

Rebase commit’lerimi siler mi?

Hayır. Aynı değişikliklerle yeni commit’ler oluşturur; eskiler Git temizleyene kadar reflog’da kalır.

Öğrenmeye devam edin (İngilizce makaleler)

Stack Quora ile çalışın

Test, WordPress veya SEO konusunda yardım mı lazım?

Ekiplerin daha iyi yazılım çıkarmasına ve sitelerini büyütmesine yardımcı oluyoruz. Üzerinde çalıştığınız konuyu anlatın, net bir sonraki adım önerelim.

Okumaya devam et

Daha fazla kılavuz test, yapay zeka ve modern geliştirme

Bu makaleyi beğendiniz mi? Bir konu seçin ve doğrudan en yeni eğitimlerimize geçin.

Yapay zekâ

Yapay Zeka Halüsinasyonları Açıklandı: Dil Modelleri Neden İşleri Düzeltiyor ve Nasıl Azaltılabilir?

Yapay zeka halüsinasyonları açıkladı: ne olduklarını, dil modellerinin bunları neden ürettiğini, yaygın türlerini, temellendirme ve yönlendirmelerle…

Makaleyi okuyun →
DevOps

Açıklanan Ortam Değişkenleri: .env Dosyaları, Sırlar ve Yapılandırma Doğru Yapıldı

Çalıştırdığımız Python örnekleriyle açıklanan ortam değişkenleri: bunları okumak ve ayarlamak, neden her değerin bir dize olduğu, .env dosyaları, sü…

Makaleyi okuyun →
Yazılım geliştirme

API Hız Sınırlamasının Açıklaması: Algoritmalar, Başlıklar ve 429 Hatalarının Ele Alınması

API hızı sınırlaması, çalıştırdığımız bir simülasyonla açıklanmıştır: belirteç kümesi, sabit pencere, kayan pencere, 429 yanıt, hız sınırı başlıklar…

Makaleyi okuyun →
Test otomasyonu

Python'da alay etme: Unittest.mock, patch ve Testleri Yalan Yapan Hatalar

Unittest.mock ile Python'da alay etme, test edildi: Sahte ve dönüş_değeri, yan_etki, bir adın kullanıldığı yerde yama uygulama, spesifikasyon ve oto…

Makaleyi okuyun →
Yazılım testi

Kod Kapsamının Açıklaması: Hat ve Şube Kapsamı ve %100'ün Gerçek Anlamı

Kod kapsamı gerçek bir kapsama.py çalışmasıyla açıklanmıştır: hat, şube ve durum kapsamı, bir raporun okunması, %100 kapsamın neden hâlâ hataları ka…

Makaleyi okuyun →
Veritabanları ve SQL

SQL'de DELETE vs TRUNCATE vs DROP: Farklılıklar, Geri Alma ve Her Biri Ne Zaman Kullanılmalı

DELETE vs TRUNCATE vs DROP test edilmiş SQL ile açıklandı: her birinin neyi kaldırdığı, geri aldığı, tetiklediği, kimlik sıfırlaması, hızı ve Postgr…

Makaleyi okuyun →
Veritabanları ve SQL

Açıklanan SQL Görünümleri: Örneklerle Tuzakları Oluşturun, Kullanın ve Önleyin

Çalıştırdığımız sorgularla açıklanan SQL görünümleri: görünüm oluşturma, canlı sonuçlar, sütunları gizleme, performans, güncellenebilir ve gerçekleş…

Makaleyi okuyun →
Yazılım geliştirme

TypeScript Arayüzü ve Tür: Gerçek Farklılıklar, Derleyiciyle Test Edildi

TypeScript arayüzü ve türü, gerçek derleyiciyle kontrol edildi: her ikisinin de yapabileceği, yalnızca birinin yapabileceği, bildirim birleştirme, g…

Makaleyi okuyun →
Yazılım geliştirme

Python *args ve **kwargs'ın Açıklaması: Açık Örneklerle Esnek Fonksiyonlar

Python *args ve **kwargs çalıştırdığımız kodla açıklanmıştır: paketleme ve paketten çıkarma, parametre sırası, yalnızca anahtar kelime ve yalnızca k…

Makaleyi okuyun →
Yazılım geliştirme

Python Lambda İşlevleri: Söz Dizimi, Gerçek Kullanımlar ve Ne Zaman Kullanılmaması Gerektiği

Çalıştırdığımız kodla açıklanan Python lambda işlevleri: sözdizimi, anahtarla sıralama, harita ve filtre, kapatmalar, geç bağlama tuzağı ve normal b…

Makaleyi okuyun →
Yapay zekâ

Yapay Zeka Ajanları Nelerdir? Çalıştırabileceğiniz Basit Bir Aracı Döngüsüyle Nasıl Çalışırlar?

Yapay zeka ajanları nedir? Aracı döngüsüne, araçlara, belleğe ve korkuluklara ilişkin basit bir kılavuz, çalıştırdığımız küçük bir Python döngüsü, g…

Makaleyi okuyun →
DevOps

İzleme ve Gözlemlenebilirlik: Günlükler, Metrikler ve İzlerle Gerçek Fark

İzleme ve gözlemlenebilirliğin açıklanması: bilinen ve bilinmeyen arızalar, günlükler, ölçümler ve izler, ödeme olayının gözden geçirilmesi, altın s…

Makaleyi okuyun →
DevOps

Docker Birimleri ve Bağlama Bağlantıları: Konteyner Verilerini Doğru Şekilde Kalıcılaştırın

Docker birimleri ile bağlama bağlamaları arasındaki karşılaştırma açıklandı: kapsayıcı verilerinin neden kaybolduğu, adlandırılmış birimler, bağlama…

Makaleyi okuyun →
Test otomasyonu

TDD ve BDD: Temel Farklılıklar, Her İki Şekilde Geliştirilmiş Bir Özellik ve Her Birinin Ne Zaman Kullanılacağı

TDD ve BDD, her iki yönde de oluşturulmuş bir indirim özelliğiyle açıklandı: çalıştırdığımız kodla kırmızı-yeşil-refactor, Verilen-Ne Zaman-O Zaman …

Makaleyi okuyun →
Yazılım geliştirme

Git merge vs rebase: farklar, örnekler ve hangisi ne zaman kullanılır

Git merge vs rebase; gerçek log çıktısı, karşılaştırma tablosu, rebase'in altın kuralı ve güvenli bir ekip iş akışıyla anlatılıyor.

Makaleyi okuyun →
Yazılım geliştirme

Python Liste Üreteci (List Comprehension): Sözdizimi, Örnekler ve Kaçınılacak Durumlar

Python list comprehension anlatımı: sözdizimi, filtreleme, if-else, iç içe döngüler, ölçülmüş süreler ve düz for döngüsünün daha iyi olduğu durumlar.

Makaleyi okuyun →
Veritabanları ve SQL

SQL JOIN Örneklerle Açıklama (Inner, Left, Right, Full)

SQL JOIN'leri örnek tablolar ve sorgularla adım adım öğrenin: INNER, LEFT, RIGHT, FULL, CROSS ve SELF; yaygın hatalar ve performans ipuçları.

Makaleyi okuyun →