İletişim

Branch (Dal) Nedir?

Kısa tanım

Branch (dal), Git'te bir commit'i gösteren ve üzerine yeni commit eklendikçe ileri kayan hafif bir işaretçidir. Ana koddan bağımsız bir çalışma hattı açar: yeni bir özellik ya da düzeltme ayrı bir branch'te geliştirilir ve hazır olduğunda merge ile ana branch'e birleştirilir. Aynı satırlar iki tarafta farklı şekilde değiştirilmişse merge conflict oluşur; hangi değişikliğin kalacağına bir insan karar verir.

Diğer adları: dal, Git branch, feature branch, merge, merge conflict, branching stratejisi

Ana daldan ayrılan bir özellik dalında commit'lerin bağımsız ilerlediği ve iş bitince yeniden ana dala birleştirildiği Git dal diyagramı

Branch aslında bir işaretçi

Branch denince akla kodun bir kopyası gelir, ama Git'te branch yalnızca bir commit'in kimliğini tutan küçük bir referanstır. Yeni bir branch açmak dosyaları kopyalamaz; bu yüzden anlık ve neredeyse bedavadır. Siz o branch'teyken attığınız her commit, işaretçiyi bir adım ileri taşır. HEAD ise o anda hangi branch'te olduğunuzu gösterir.

git switch -c ozellik/iletisim-formu   # yeni branch aç ve ona geç
git branch                             # yerel branch'leri listele
git switch main                        # ana branch'e dön

Bu ucuzluk, çalışma biçimini belirler: her iş için ayrı bir branch açılır, ana branch (main) her zaman yayına alınabilir durumda tutulur ve yarım işler oraya karışmaz.

Merge: iki hattı birleştirmek

Branch'teki iş bittiğinde ana branch'e birleştirilir. İki temel durum vardır:

  • Fast-forward: Siz çalışırken ana branch'e yeni commit gelmediyse, Git işaretçiyi sizin son commit'inize kaydırır. Ayrı bir birleştirme commit'i oluşmaz.
  • Üç yönlü merge: İki taraf da ilerlediyse Git, ortak ata commit'i ve iki ucu karşılaştırır, değişiklikleri birleştirir ve iki ebeveynli bir merge commit'i oluşturur.

Alternatif olarak rebase, sizin commit'lerinizi ana branch'in güncel ucunun üzerine yeniden yazarak düz bir geçmiş üretir. Rebase, başkalarıyla paylaşılmış commit'lerin kimliğini değiştirdiği için ortak branch'lerde dikkatli kullanılmalıdır.

Merge conflict neden çıkar, nasıl çözülür?

Git, iki branch'in farklı dosyalara ya da aynı dosyanın farklı bölgelerine yaptığı değişiklikleri kendisi birleştirir. Ama iki taraf aynı satırları farklı biçimde değiştirmişse hangisinin doğru olduğunu bilemez ve kararı size bırakır:

<<<<<<< HEAD
const MAX_DOSYA_MB = 10;
=======
const MAX_DOSYA_MB = 25;
>>>>>>> ozellik/buyuk-dosya-yukleme
  1. İki değişikliğin amacını anlayın; çoğu zaman doğru sonuç ikisinin bileşimidir, birini körlemesine seçmek değil.
  2. Dosyayı düzenleyip çakışma işaretlerini (<<<<<<<, =======, >>>>>>>) tamamen kaldırın.
  3. Testleri çalıştırın; derlenen ama yanlış davranan bir birleştirme, conflict'in kendisinden daha tehlikelidir.
  4. git add ile çözümü işaretleyip merge'i tamamlayın.

En iyi önlem conflict'i küçük tutmaktır: kısa ömürlü branch'ler, ana branch'ten sık güncelleme almak ve küçük pull request'ler. Haftalarca yaşayan bir branch'in birleştirilmesi, her gün biraz birleşen beş branch'ten çok daha zahmetlidir.

Branching stratejileri

StratejiNasıl işler?Uygun olduğu durum
Trunk-based developmentHerkes ana branch'e çok sık, küçük değişikliklerle birleştirir; branch'ler saatler veya birkaç gün yaşar, yarım özellikler feature flag ile gizlenirOlgun test otomasyonu ve sürekli dağıtım yapan ekipler
GitHub flowTek uzun ömürlü branch (main); her iş için bir branch ve pull request, onaydan sonra merge ve yayınWeb uygulamalarının çoğu, küçük ve orta ekipler
Git Flowdevelop, release ve hotfix gibi ek uzun ömürlü branch'lerNumaralı sürümlerle dağıtılan, birden çok sürümü aynı anda destekleyen yazılımlar

Sürekli yayına alınan bir web sitesi için Git Flow çoğu zaman gereğinden ağırdır; ek branch'ler birbirinden uzaklaştıkça birleştirme maliyeti artar.

Branch'ler ve ortamlar

Pek çok ekipte branch'ler doğrudan ortamlara bağlanır: her pull request için otomatik bir önizleme ortamı kurulur, main'e yapılan merge CI/CD hattı üzerinden önce staging ortamına, onaydan sonra canlıya gider. Her ortam için ayrı ve uzun ömürlü branch tutmak (ör. staging ve production branch'leri) ise zamanla ortamlar arasında fark edilmeyen kod farklılıklarına yol açabilir; aynı commit'in ortamlar arasında terfi ettirildiği bir deployment düzeni genellikle daha öngörülebilirdir.

İlgili terimler

← Sözlüğe dön