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.
- 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
| Özellik | Merge | Rebase |
|---|---|---|
| Geçmişin biçimi | Birleştirme commit’li dallanmış grafik | Tek düz çizgi |
| Mevcut commit’ler | Değişmez | Yeni hash’lerle yeniden yazılır |
| Çakışmalar | Birleştirme commit’inde bir kez çözülür | Yeniden oynatılan her commit için düzeltmek gerekebilir |
| Paylaşılan dallarda güvenli mi | Evet | Hayır |
| En uygun kullanım | Biten 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)
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.
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 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 →DevOpsAçı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ştirmeAPI 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 otomasyonuPython'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 testiKod 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 SQLSQL'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 SQLAçı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ştirmeTypeScript 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ştirmePython *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ştirmePython 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 →DevOpsDocker 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 otomasyonuTDD 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ştirmeGit 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ştirmePython 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 SQLSQL 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 →