Merge — nedir, merge nasıl çalışır ve birleştirme stratejileri

Yazar: IT Sectr Yayınlanma: 2026-08-01 Okuma süresi: 9 dk

Merge, Git'te iki farklı geliştirme hattındaki değişiklikleri tek bir hedef dalda birleştiren bir dal birleştirme işlemidir. rebase'in aksine, merge iki ebeveynli özel bir merge commit oluşturarak tam dallanma geçmişini korur. Resmi Git dokümantasyonuna (2026) göre, merge geçmişi yeniden yazmadığı ve hangi dalların ne zaman birleştirildiğini takip etmeye izin verdiği için dalları birleştirmenin en güvenli yoludur. main, develop ve release gibi herkese açık dallarda birleştirme için standart seçimdir.

Anahtar Noktalar

  • Merge — her iki dalın geçmişini koruyan bir merge commit oluşturarak dalları birleştirme.
  • Merge commit — birleştirme olayını kaydeden iki ebeveynli özel bir commit.
  • Birleştirme stratejileri — recursive, octopus, ours, squash — her biri farklı senaryolar için uygun.
  • Çakışmalar — her iki dalda da aynı satırlar değiştirildiğinde oluşur ve manuel çözüm gerektirir.
  • Güvenlik — merge mevcut commit'leri değiştirmez, bu nedenle herkese açık dallar için güvenlidir.

Git'te merge nedir

Merge, belirtilen daldaki değişiklikleri mevcut dala birleştiren git merge komutudur. Git ortak atayı (temel commit) bulur, ataya göre her dalın diff'ini hesaplar ve birleştirilmiş değişiklik kümesini içeren bir merge commit oluşturur. Sonuç olarak, hedef dal birleştirilen daldaki tüm değişiklikleri alır.

Sözdizimi: hedef daldayken (örneğin main), git merge feature komutunu çalıştırın. Çakışma yoksa Git otomatik olarak bir merge commit oluşturur. Varsayılan merge commit mesajı: “Merge branch 'feature' into main” şeklindedir. Mesajı -m bayrağıyla değiştirebilir veya açılan düzenleyicide düzenleyebilirsiniz.

Merge tahribatsız bir işlemdir. rebase'in aksine, merge mevcut commit'lere dokunmaz: aynı hash'leri, yazarları ve tarihleri korurlar. Bu, merge'i birden fazla geliştiricinin aynı anda çalıştığı dalları birleştirmenin tek güvenli yolu yapar. Bir şey ters giderse, merge git merge --abort ile iptal edilebilir.

bash
# Hedef dala geç
git checkout main

# Özellik dalını birleştir
git merge feature

# Sonuç — iki ebeveynli merge commit
git log --oneline --graph

# Özel mesajla merge
git merge feature -m "feat: integrate authentication module"

Merge türleri: regular, squash, fast-forward

Git, istenen sonuca göre seçilen üç birleştirme modunu destekler. Düzenli merge (varsayılan) bir merge commit oluşturur. Squash merge, özellik dalındaki tüm commit'leri tek bir commit'te birleştirir. Fast-forward, mümkünse commit oluşturmadan dal işaretçisini ileri taşır. Mod seçimi, ekibin iş akışına ve geçmiş kurallarına bağlıdır.

Düzenli merge (--no-ff) — fast-forward olarak yapılabilecek olsa bile merge commit oluşturur. main dalı için önerilir: merge commit, özellik entegrasyon noktasını açıkça işaretler ve tek bir merge commit geri almasıyla özellik dalındaki tüm değişiklikleri kolayca geri almayı sağlar. GitHub, PR'ları Merge butonuyla birleştirirken varsayılan olarak bu modu kullanır.

Squash merge (--squash) — özellik dalındaki tüm commit'leri hedef dalda tek bir commit'te toplar. Özellik dalının taslak geçmişinin main'i kirletmemesi gerektiğinde kullanışlıdır. Dezavantajı: orijinal commit'lerle bağlantı kaybolur — özelliğin adım adım nasıl geliştirildiği görülemez. GitHub, bir PR'da “Squash and merge” seçildiğinde bu modu kullanır.

Fast-forward (--ff) — hedef dal, özellik dalı ayrıldıktan sonra yeni commit'lere sahip değilse, Git merge commit oluşturmadan işaretçiyi ileri taşır. Geçmiş doğrusal kalır. --no-ff bayrağı merge commit'i zorlar, --ff-only ise fast-forward mümkün değilse hata verir.

bash
# Merge commit'i zorla (main için önerilir)
git merge --no-ff feature

# Squash merge — tüm commit'ler tek bir commit'te
git merge --squash feature
git commit -m "feat: add authentication"

# Yalnızca mümkünse fast-forward
git merge --ff-only feature

# Çakışmalı merge'i iptal et
git merge --abort

Git birleştirme stratejileri

Birleştirme stratejileri, Git'in değişiklikleri birleştirmek için kullandığı algoritmayı belirler. Her strateji farklı senaryolar için uygundur. Git otomatik olarak uygun stratejiyi seçer, ancak geliştiriciler --strategy bayrağıyla açıkça belirtebilir. Stratejileri anlamak, karmaşık birleştirmelerde Git'in davranışını tahmin etmeye yardımcı olur.

Recursive — iki dalı birleştirmek için varsayılan strateji. Git ortak atayı bulur, her daldaki değişiklikleri hesaplar ve birleştirir. Ortak bir ata bulunursa, recursive dosya yeniden adlandırmalarını ve eklemelerini doğru şekilde işler. Çakışmalar sırasında recursive ek seçenekler kullanabilir: ours (otomatik olarak bizim sürümümüzü seç) ve theirs (onların sürümünü seç).

Octopus — aynı anda ikiden fazla dalı birleştirmek için: git merge feature1 feature2 feature3. Octopus çakışma çözümünü desteklemez — komut çağrılmadan önce tüm çakışmalar çözülmelidir. Nadiren kullanılır, esas olarak çakışmayacağı garanti edilen birden fazla bağımsız dalı (örneğin farklı modüller) birleştirmek için.

StratejiDal sayısıÇakışma çözümü
Recursive2Otomatik + ours/theirs seçenekleri
Octopus3+Hayır — tüm çakışmalar önceden çözülmeli
OursHerhangiHer zaman bizim sürümümüzü seçer, dış değişiklikleri yok sayar
Subtree2Alt ağaç birleştirmeleri (subtree merge) için

Ours — birleştirilen daldaki değişiklikleri tamamen yok sayan ve hedef dalın mevcut içeriğini koruyan özel bir stratejidir. Bir merge commit oluşturulur, ancak içerik değişmeden kalır. Geçmişte birleştirme olayını kaydetmeniz gerektiğinde ancak diğer daldaki tüm değişiklikleri reddetmek istediğinizde kullanışlıdır.

Merge çakışmalarını çözme

Merge çakışması, bir dosyanın aynı satırları her iki dalda farklı şekilde değiştirildiğinde oluşur. Git hangi sürümün doğru olduğunu otomatik olarak belirleyemez ve merge'i duraklatır. Bir dosyanın bir dalda yeniden adlandırılıp diğerinde değiştirilmesi veya aynı dosyanın aynı anda silinip değiştirilmesi durumunda da çakışma oluşabilir.

Çözüm süreci: Git çakışan dosyaları işaretleyicilerle işaretler. Dosyada <<<<<<< HEAD (bizim sürümümüz), ======= (ayırıcı) ve >>>>>>> feature (onların sürümü) olan bölümler görünür. Geliştirici, çakışan bölümü manuel olarak düzenler, her iki sürümden istenen satırları seçer, işaretleyicileri kaldırır, dosyayı kaydeder ve git add ile dizine ekler.

Görsel çakışma çözümü için Git, mergetool'ü destekler — harici bir karşılaştırma aracı. Popüler mergetool'ler: Meld, KDiff3, Beyond Compare, VS Code (yerleşik çakışma düzenleyicisi). Mergetool üç panel gösterir: bizim sürümümüz, onların sürümü ve sonuç. Geliştirici, son dosyaya dahil edilecek kod bloklarını görsel olarak seçer.

bash
# Merge'i başlat ve çakışmayı algıla
git merge feature
# ÇAKIŞMA (içerik): src/main.swift'te merge çakışması

# Çakışan dosyaları kontrol et
git status

# Görsel mergetool'ü aç
git mergetool

# Çözümden sonra — add ve commit
git add src/main.swift
git commit

# Merge'i iptal et
git merge --abort

rebase yerine merge ne zaman seçilmeli

Merge, rebase'e tercih edilir birkaç önemli durumda. Birincisi: diğer geliştiricilerin erişebildiği herkese açık dallarla çalışırken. Merge geçmişi yeniden yazmaz, bu nedenle meslektaşlar güvenle senkronize olabilir. Herkese açık bir dalda rebase yapmak, farklılaşan bir geçmiş oluşturur ve eski commit'lere sahip olan herkes için çakışmalara neden olur.

İkinci durum: özellik dalı tamamlanırken. Çoğu ekip, özellik entegrasyon anını yakalamak için main'e merge (--no-ff bayrağıyla) yapmayı tercih eder. Bu, geçmişte gezinmeyi basitleştirir ve merge commit'inin tek bir git revert'iyle tüm özelliği kolayca geri almayı sağlar. GitHub Flow varsayılan olarak üç merge seçeneği sunar: basit merge, squash merge ve rebase merge.

Üçüncü durum: incelenmiş bir pull request ile çalışırken. GitHub ve GitLab, farklı seçeneklerle bir merge butonu sunar. Merge (Create a merge commit) — merge commit ile tam geçmiş. Squash and merge — geliştirme detayları olmadan temiz geçmiş. Rebase and merge — merge commit olmadan doğrusal geçmiş, ancak commit yeniden yazma ile. Seçim, ekip kurallarına bağlıdır.

  • Herkese açık dallar (main, develop) — sadece merge, asla rebase yok.
  • PR tamamlama — entegrasyon noktasını işaretlemek için --no-ff ile merge.
  • Başkalarının commit'leri olan dallar — merge başkalarının çalışmalarını yeniden yazmaz.
  • Sürüm öncesi — merge daha az risk taşıdığı için daha güvenlidir.
  • Paylaşılan dal — birden fazla geliştirici bir dalda çalışıyorsa, merge zorunludur.

Dal birleştirme için en iyi uygulamalar

Birinci kural: birleştirmeden önce her zaman hedef dalın en son sürümünde olun. Özellik dalını birleştirmeden önce git checkout main && git pull komutunu çalıştırın. Bu, çakışmaları en aza indirir ve merge commit'inin tüm son değişiklikleri içermesini sağlar. Hedef dal önemli ölçüde ilerlediyse, önce özellik dalının içinde git merge main komutunu çalıştırarak çakışmaları kendi bağlamında çözün.

İkinci kural: birleştirmeden sonra kodu test edin. Birleştirme, çakışma olmasa bile davranışı değiştirebilir. CI/CD pipeline'ı, üretime göndermeden önce merge commit'inde testler çalıştırmalıdır. Bazı ekipler merge gate'leri kullanır — geçilene kadar merge'i engelleyen zorunlu kontroller.

Üçüncü kural: merge commit'lerini belgeleyin. Standart mesaj “Merge branch 'feature' into main” pek kullanışlı değildir. Neyin birleştirildiğine dair bir açıklama eklenmesi önerilir: “Merge authentication module: login, registration, password recovery”. Bu, geçmiş analizini ve regresyon aramasını basitleştirir. Büyük projelerde, merge commit'leri otomatik olarak PR başlığından oluşturulur.

  • Güncellik — birleştirmeden önce hedef dalın güncel olduğundan emin olun (git pull).
  • Test — CI/CD, sonuçtaki merge commit'inde testler çalıştırmalıdır.
  • Açıklayıcı mesajlar — merge commit'inde hangi özelliğin birleştirildiğini belirtin.
  • Sıklık — özellik dallarını mümkün olduğunca erken ve sık birleştirin (en fazla bir hafta).
  • Geri alma — bir merge commit'inin git revert'i tüm özelliği geri alır.

Sıkça Sorulan Sorular

Git'te dalları birleştirmek ne anlama gelir?

Birleştirmek, bir daldan diğerine değişiklikleri birleştirmek için git merge çalıştırmak anlamına gelir. Sonuç, birleştirme olayını kaydeden ve her iki daldaki değişiklikleri içeren bir merge commit'idir. Git Flow'da özellik dallarını main, develop veya release'e entegre etmenin birincil yoludur.

Squash merge'in normal merge'den farkı nedir?

Squash merge, özellik dalındaki tüm commit'leri hedef dalda tek bir commit'te birleştirir ve ara geliştirme geçmişini kaybeder. Normal merge, tüm özellik dalı commit'lerini koruyarak merge commit oluşturur. Squash merge temiz bir geçmiş sağlar ancak özelliğin adım adım gelişimini izlemeye izin vermez.

Git'te merge çakışması nasıl çözülür?

Çakışan dosyayı açın, <<<<<<< HEAD ve >>>>>>> işaretleyicileri olan bölümleri bulun. İçeriği düzenleyin, her iki sürümden gerekli satırları koruyun, işaretleyicileri kaldırın. Dosyayı kaydedin, git add ve git commit çalıştırın. Görsel çözüm için git mergetool kullanabilirsiniz.

rebase yerine merge ne zaman kullanılmalı?

Merge, geçmişi yeniden yazmadığı için her zaman herkese açık dallar (main, develop, release) için kullanılır. Rebase, kişisel özellik dallarında yayınlanmadan önce uygulanır. Bir dal paylaşılan deponun parçası haline geldikten ve meslektaşlar buna eriştikten sonra, yalnızca merge'e izin verilir.

Git'te merge nasıl geri alınır?

Merge tamamlanmadan önce (çakışma sırasında) — git merge --abort merge'i tamamen iptal eder. Tamamlandıktan sonra — git revert <merge-commit-hash> -m 1 geri alma commit'i oluşturur. -m 1 bayrağı, hangi ebeveyn dalın (hedef) korunacağını belirtir. Yayınlanan dallar için git revert, git reset'ten daha güvenlidir.

Özet

  • Merge — geçmişi koruyan ve iki ebeveynli merge commit oluşturan güvenli dal birleştirme.
  • Birleştirme modları — düzenli (--no-ff), squash (--squash) ve fast-forward (--ff) farklı amaçlar için.
  • Stratejiler — recursive (varsayılan), octopus (3+ dal), ours (dış değişiklikleri yok sayma).
  • Çakışmalar — işaretli bölümler düzenlenerek veya mergetool kullanılarak manuel olarak çözülür.
  • Güvenlik — merge mevcut commit'leri değiştirmez, bu nedenle herkese açık dallar için güvenlidir.
  • Squash merge — tüm commit'leri birleştirir, ara geliştirme geçmişini kaybeder.
  • Merge geri alma — yayınlanan değişikliklerin güvenli geri alınması için -m 1 bayrağıyla merge commit'inin git revert'i.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun