---
title: 'Dal Adlandırma'
source: 'https://academia.sh/tr/kurslar/dallanma-ve-isbirligi/dal-adlandirma'
course: 'Dallanma ve İşbirliği'
language: tr
updated: '2026-08-17T18:10:43+00:00'
license: 'CC BY-SA 4.0'
---

# Dal Adlandırma

Dal adlandırma düzeni tarihçenin birinci sorusuna dal kaydının yapamadığını ekler: iki tümleştirme biçimi ile dört ad düzeninin sekiz bileşiminden yalnız 3'ünde grup gerçekten okunur, çünkü kayıt ile okunabilir ad ayrı iki koşuldur.

Önceki ders geçişin hangi dosyaya dokunacağını iki dalın farkından hesapladı ve bu hesap
dalların adına hiç bakmadı. `kimlik` dalından `rapor` dalına geçiş üç dosya yazıyordu;
dallar `yeni` ile `deneme` diye adlansaydı aynı üç dosyayı yazacaktı. Araç bakımından ad bir
etikettir ve hiçbir davranışı değiştirmez.

Ad başka bir soruya hizmet eder. Aynı depoda otuz dal varken hangisinin hangi işe ait
olduğu, hangisinin kapatılabileceği, hangisinin ay boyunca yaşayacağı yalnız adlardan
okunur. Kursun ölçü ekseninde bunun karşılığı **birinci sorudur**: hangi işlemeler hangi işe
ait? Bu ders o sorunun iki ayrı koşulu olduğunu gösterir. Tarihçenin dal kaydını tutması
gerekir — ve kaydın taşıdığı adın bir şey söylüyor olması gerekir. İkisi birbirinin yerine
geçmez ve ölçüm bunu sayar.

## Adın İki İşi

Bir dal adı önce bir **yoldur**. `refs/heads/olcum` başvurusunun adı `olcum`'dur ve ad,
başvurunun nerede aranacağını belirler. Eğik çizgi bu yolda bir ayraçtır: `ozellik/olcum`
adı `refs/heads/ozellik/olcum` başvurusuna karşılık gelir ve `ozellik` bir hiyerarşi
basamağı olur. Araç bu basamağı tanır — desen eşleştiren her komut eğik çizgiyi bir sınır
gibi kullanabilir.

Ad ikinci olarak bir **bildirimdir**. Aracın okumadığı, insanın okuduğu bir alandır. Bir
işleme mesajı gibi, sonradan sorulacak sorulara yanıt taşımak üzere yazılır ya da yazılmaz.
**Dal adlandırma düzeni (branch naming convention)** bu ikinci işi düzenli hâle getirir:
adın hangi alanları hangi sırayla taşıyacağını belirler.

Alanlar tipik olarak üçtür. **Tür** işin sınıfını verir (özellik, düzeltme, bakım) ve eğik
çizgiden önce durur. **İş kaydı** adı dışarıdaki bir kayda bağlar; bir numara ya da kısa
kod olur. **Kısa ad** işin kendisini bir iki kelimeyle söyler. Ölçüm bu üç alanı ayrı ayrı
sayar, çünkü her biri ayrı bir soruya yanıt verir ve bir düzen üçünü birden taşımak zorunda
değildir.

## Adın Geçerliliği

Ad bir dosya yolu olarak yazıldığı için biçimi serbest değildir. Araç geçerliliği ayrı bir
alt komutla sınar.

```text
# öğretilen komut ve örnek döküm — çalıştırılmamıştır

$ git check-ref-format --branch 'ozellik/olcum'
ozellik/olcum
$ git check-ref-format --branch 'ozellik olcum'
fatal: 'ozellik olcum' is not a valid branch name

$ git branch --list 'ozellik/*'
  ozellik/214-olcum
  ozellik/215-rapor
  ozellik/216-kimlik
```

Kuralların çoğu iki kaygıdan doğar. Birincisi kabuk ve komut satırı: boşluk, `*`, `[`, `?`
ve ters eğik çizgi kabukta anlam taşır ve tırnaklanmadan yazıldığında başka bir şeye
dönüşür. İkincisi aracın kendi başvuru sözdizimi: `~`, `^`, `:`, `..` ve `@{` işaretleri bir
işlemeyi ada göre çözerken kullanılan operatörlerdir. `ozellik/olcum~1` bir dal adı olsaydı
"bu dalın bir önceki işlemesi" ifadesi okunamaz hâle gelirdi. `.lock` uzantısı ise başvuru
yazarken kullanılan kilit dosyalarıyla çakışır.

Bir kural daha var ve ötekilerden ayrı bir yerden gelir. `refs/heads` altında bir ad hem
dosya hem dizin olamaz; bu yüzden `ozellik` adında bir dal, `ozellik/olcum` adında bir dal
varken açılamaz.

```text
# öğretilen komut ve örnek döküm — çalıştırılmamıştır

$ git branch ozellik
fatal: cannot lock ref 'refs/heads/ozellik': 'refs/heads/ozellik/olcum' exists

$ git branch --merged ana
  ozellik/214-olcum
$ git branch -d ozellik/214-olcum
Deleted branch ozellik/214-olcum (was 6e2d70b).
```

Bu, düzenin doğrudan bir sonucudur: bir öneki dal adı olarak da kullanmak, o önek altındaki
her adı engeller. Önek yalnız önek olarak kalmalıdır.

## Düzenin Ödediği İşler

Ad düzeninin karşılığını verdiği üç günlük iş vardır ve üçü de listeleme komutlarıyla
yapılır.

Birincisi **süzmedir**. `git branch --list 'ozellik/*'` yalnız o öneki taşıyan dalları
listeler. Düzensiz adlarda bu desen hiçbir şey seçmez; otuz dallık bir depoda hangi dalın
hangi türe ait olduğunu ancak tek tek okuyarak öğrenirsiniz.

İkincisi **kapatmadır**. `git branch --merged ana` ana dala alınmış dalları listeler; bunlar
silinebilecek olanlardır. `git branch -d` yalnız birleşmiş bir dalı siler ve birleşmemişse
reddeder. Zorlayan biçimi bu kontrolü atlar ve önceki dersin ölçüsü bunun bedelini vermişti:
bir dal başvurusu silindiğinde o daldan erişilen dört işleme hiçbir başvurudan erişilemez
hâle gelir. Ad düzeni burada dolaylı ama gerçek bir katkı yapar — hangi dalın kısa ömürlü
olduğu adından okunuyorsa, silinecek dal listesi bir tahmin olmaktan çıkar.

Üçüncüsü **ömür ayrımıdır**. **Uzun ömürlü dal (long-lived branch)** deponun yaşadığı sürece
duran, silinmeyen ve tek bir işe ait olmayan daldır; adı sabittir ve tür öneki taşımaz.
**Kısa ömürlü dal (short-lived branch)** tek bir iş için açılır, iş tümleştirilince silinir;
adı tür önekini ve iş kaydını taşır. İki sınıfın ad biçimi ayrıldığında liste okunduğunda
hangisinin bir gün kapanacağı görülür. Ayrım burada yalnız adlandırma düzeyinde kurulur; dal
stratejilerinin karşılaştırması birleştirme konusunun son dersine bırakılmıştır.

Ölçümün varsayımları:

- **DL15** — Kurgu ortak tanımın on iki işlemesidir ve değiştirilmez. Ad düzeni kurguya
  eklenen bir katmandır; **altı sorunun tanımına dokunmaz.**
- **DL16** — Ölçüm birinci soruyu, `s1_gruplama` işlevini ortak tanımdaki tanımıyla
  kullanır: tarihçedeki her işlemenin bir **dal kaydı** taşıyıp taşımadığına bakar. Bu ders
  öteki beş soruyu ölçmez; onlar birleştirme konusunda ölçülür.
- **DL17** — İki tümleştirme biçimi karşılaştırılır: birleştirme işlemesi dal kaydını tutar,
  ileri sarma tutmaz. Biçimlerin tanımı ortak tanımdan alınır ve değiştirilmez.
- **DL18** — Dört ad düzeni denenir: serbest, kısa ad, türe göre, türe ve kayda göre. Her
  düzen üç dala üç ad verir.
- **DL19** — **Addan iş okunur** ölçütü kâhinle karşılaştırmadır: adın içinde işin kurgudaki
  adı geçiyorsa okunur sayılır. **Addan tür okunur** ölçütü eğik çizgiden önceki parçanın
  bilinen tür listesinde bulunmasını arar; ayraçsız bir kelime tür sayılmaz. **İş kaydı**
  ölçütü adın parçaları arasında sayısal bir alan arar.
- **DL20** — **Grup okunur** ölçütü iki koşulun birleşimidir: tarihçe dal kaydını tutuyor
  **ve** üç adın üçü de işi veriyor. Koşullardan biri düşerse grup okunmaz.
- **DL21** — Ad geçerliliği aracın kural kümesinin bir alt kümesiyle sınanır; ölçüm bir
  ayrıştırıcı değil, kuralların hangi adayı neden reddettiğini gösteren bir sayımdır.

## Ölçüm

```python
"""Dal adlandirma duzeni: dal kaydi ile okunabilir ad ayri kosullardir.

Bolum 1 - dort ad duzeni, dort olcut: addan ne okunuyor.
Bolum 2 - bicim x duzen caprazi: birinci soru gercekten okunuyor mu.
Bolum 3 - ad gecerliligi ve onek cakismasi.
"""
TOHUM = 20260813
DALLAR = ("olcum", "rapor", "kimlik")
DOSYALAR = {"olcum": "olcum.py", "rapor": "rapor.py", "kimlik": "kimlik.py"}
KUSURLU = ("rapor", 2)
ORTAK_DOSYA = "ayar.py"
TURLER = ("ozellik", "duzeltme", "bakim")
DUZENLER = {
    "serbest": {"olcum": "yeni", "rapor": "deneme", "kimlik": "duzeltme"},
    "kısa ad": {"olcum": "olcum", "rapor": "rapor", "kimlik": "kimlik"},
    "türe göre": {"olcum": "ozellik/olcum", "rapor": "ozellik/rapor",
                  "kimlik": "ozellik/kimlik"},
    "türe ve kayda göre": {"olcum": "ozellik/214-olcum",
                           "rapor": "ozellik/215-rapor",
                           "kimlik": "ozellik/216-kimlik"}}
BICIMLER = ("birlestirme islemesi", "ileri sarma")


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def gelisim():
    r, kayit, zaman = uretec(TOHUM), [], 0
    for adim in range(1, 5):
        for dal in DALLAR:
            zaman += 1 + r(3)
            dosya = (ORTAK_DOSYA if adim == 3 and dal in ("olcum", "rapor")
                     else DOSYALAR[dal])
            kayit.append({"dal": dal, "sira": adim, "dosya": dosya,
                          "kusurlu": (dal, adim) == KUSURLU, "zaman": zaman})
    return kayit


def tumlestir(kayit, bicim):
    t = []
    if bicim == "birlestirme islemesi":
        for dal in DALLAR:
            for k in [x for x in kayit if x["dal"] == dal]:
                t.append({**k, "dal_kaydi": dal, "zaman_korundu": True})
            t.append({"dal": dal, "sira": 0, "dosya": None, "kusurlu": False,
                      "zaman": max(x["zaman"] for x in kayit
                                   if x["dal"] == dal),
                      "dal_kaydi": dal, "birlesme": True,
                      "zaman_korundu": True})
    elif bicim == "ileri sarma":
        for k in sorted(kayit, key=lambda x: x["zaman"]):
            t.append({**k, "dal_kaydi": None, "zaman_korundu": True})
    return t


def s1_gruplama(t):
    """Ortak tanimin birinci sorusu; tanimi degistirilmez."""
    return all(x.get("dal_kaydi") for x in t if not x.get("birlesme"))


def isi_verir(ad, dal):
    return dal in ad


def turu_verir(ad):
    return "/" in ad and ad.split("/")[0] in TURLER


def kayda_gider(ad):
    return any(p.isdigit() for p in ad.replace("/", "-").split("-"))


def suzulur(ad, onek="ozellik/"):
    return ad.startswith(onek)


YASAK = set(" ~^:?*[\\")


def gecerli(ad):
    if not ad or ad.startswith("/") or ad.endswith("/") or "//" in ad:
        return "eğik çizgi konumu"
    if ad.startswith("-"):
        return "tire ile başlıyor"
    if any(c in YASAK for c in ad):
        return "yasak karakter"
    if ".." in ad or "@{" in ad or ad.endswith(".lock"):
        return "yasak dizi"
    if any(p.startswith(".") for p in ad.split("/")):
        return "nokta ile başlayan parça"
    return "geçerli"


def onek_cakismasi(adlar):
    return [(a, b) for a in adlar for b in adlar
            if a != b and b.startswith(a + "/")]


kayit = gelisim()
T = {b: tumlestir(kayit, b) for b in BICIMLER}
print(f"kurgu: {len(kayit)} işleme, {len(DALLAR)} dal; ad düzeni kurguyu da "
      f"altı sorunun tanımını da değiştirmez")
print()
print(f"{'ad düzeni':<22s}{'addan iş':>9s}{'addan tür':>10s}"
      f"{'iş kaydı':>9s}{'önekle süzülen':>15s}")
for ad, kume in DUZENLER.items():
    print(f"  {ad:<20s}{sum(isi_verir(kume[d], d) for d in DALLAR):7d}/3"
          f"{sum(turu_verir(kume[d]) for d in DALLAR):8d}/3"
          f"{sum(kayda_gider(kume[d]) for d in DALLAR):7d}/3"
          f"{sum(suzulur(kume[d]) for d in DALLAR):15d}")
print()
print(f"{'biçim':<24s}{'ad düzeni':<20s}{'dal kaydı':<10s}{'addan iş':>9s}"
      f"{'grup okunur':>12s}")
okunur = 0
for b in BICIMLER:
    kayit_var = s1_gruplama(T[b])
    for ad, kume in DUZENLER.items():
        n = sum(isi_verir(kume[d], d) for d in DALLAR)
        g = kayit_var and n == len(DALLAR)
        okunur += g
        print(f"  {b:<22s}{ad:<20s}{('var' if kayit_var else 'yok'):<10s}"
              f"{(str(n) + '/3') if kayit_var else '-':>9s}"
              f"{('evet' if g else 'hayır'):>12s}")
print(f"birinci soru: dal kaydı {sum(s1_gruplama(T[b]) for b in BICIMLER)}"
      f" / {len(BICIMLER)} biçimde var; grup okunur "
      f"{okunur} / {len(BICIMLER) * len(DUZENLER)} satırda")
print()
ADAYLAR = ("ozellik/olcum", "ozellik olcum", "ozellik/olcum~1",
           "ozellik/..olcum", "ozellik/olcum.lock", "ozellik//olcum",
           "-olcum", "ozellik/olcum@{1}")
print(f"{'aday ad':<24s}sonuç")
for a in ADAYLAR:
    print(f"  {a:<22s}{gecerli(a)}")
KUME = ("ozellik", "ozellik/olcum", "ozellik/rapor", "ozellik/kimlik")
print(f"\nönek çakışması: {len(onek_cakismasi(KUME))} çift — "
      f"ozellik adı ozellik/ altındaki üç dalla birlikte var olamaz")
```

```
kurgu: 12 işleme, 3 dal; ad düzeni kurguyu da altı sorunun tanımını da değiştirmez

ad düzeni              addan iş addan tür iş kaydı önekle süzülen
  serbest                   0/3       0/3      0/3              0
  kısa ad                   3/3       0/3      0/3              0
  türe göre                 3/3       3/3      0/3              3
  türe ve kayda göre        3/3       3/3      3/3              3

biçim                   ad düzeni           dal kaydı  addan iş grup okunur
  birlestirme islemesi  serbest             var             0/3       hayır
  birlestirme islemesi  kısa ad             var             3/3        evet
  birlestirme islemesi  türe göre           var             3/3        evet
  birlestirme islemesi  türe ve kayda göre  var             3/3        evet
  ileri sarma           serbest             yok               -       hayır
  ileri sarma           kısa ad             yok               -       hayır
  ileri sarma           türe göre           yok               -       hayır
  ileri sarma           türe ve kayda göre  yok               -       hayır
birinci soru: dal kaydı 1 / 2 biçimde var; grup okunur 3 / 8 satırda

aday ad                 sonuç
  ozellik/olcum         geçerli
  ozellik olcum         yasak karakter
  ozellik/olcum~1       yasak karakter
  ozellik/..olcum       yasak dizi
  ozellik/olcum.lock    yasak dizi
  ozellik//olcum        eğik çizgi konumu
  -olcum                tire ile başlıyor
  ozellik/olcum@{1}     yasak dizi

önek çakışması: 3 çift — ozellik adı ozellik/ altındaki üç dalla birlikte var olamaz
```

## Sayıların Okunması

Üst tablo dört düzeni alan alan karşılaştırıyor. Serbest adlar dört ölçütün dördünde de
sıfır veriyor: `yeni`, `deneme` ve `duzeltme` adlarından hangisinin hangi işe ait olduğu
çıkarılamıyor. Üçüncü ad özellikle seçildi — `duzeltme` bir tür adı gibi görünüyor ama ayraç
taşımadığı için tür sayılmıyor, ve gösterdiği iş `kimlik`, yani ad yalnız susmuyor, yanlış
yönlendiriyor.

Kısa ad düzeni ilk sütunu **3/3** yapıyor ve tek başına en büyük sıçramayı burada
kazandırıyor. Tür öneki ikinci sütunu açıyor ve **önekle süzülen** sütununu **0**'dan
**3**'e çıkarıyor; süzmenin koşulu adın işi vermesi değil, ortak bir önek taşımasıdır. İş
kaydı alanı yalnız dördüncü düzende var ve yalnız üçüncü sütunu açıyor. Her alan bir sütun
açıyor, hiçbiri iki sütun açmıyor: alanlar birbirinin yerine geçmiyor.

Orta tablo dersin ana ölçüsü. Sekiz satırın **3**'ünde grup okunuyor ve okunmayan beş satır
iki ayrı nedenden okunmuyor.

Dört satır **dal kaydının yokluğundan** düşüyor. İleri sarma biçiminde dört ad düzeninin
dördü de aynı sonucu veriyor, çünkü ad tarihçeye hiç girmiyor: dal adı yalnız dal yaşadığı
sürece vardır, dal silindiğinde yok olur ve tarihçede ondan geriye bir iz kalmaz. En özenli
adlandırma düzeni bile kayıt tutulmayan bir biçimde sıfır katkı yapar.

Beşinci satır **adın boşluğundan** düşüyor. Birleştirme işlemesi biçiminde dal kaydı var;
tarihçe üç grubu ayırt ediyor ve `s1_gruplama` bu satırda da evet diyor. Ama kaydın taşıdığı
ad `yeni`, `deneme` ve `duzeltme`. Kaydın varlığı grubun **sınırını** verir, adı ise grubun
**adını** verir; ikincisi olmadan tarihçe "bu on iki işleme üç gruba ayrılıyor" der ve
grupların ne olduğunu söylemez. Ölçünün söylediği tam olarak budur: dal kaydı **1/2** biçimde
var, ama grup **3/8** satırda okunuyor.

Sekiz satırlık kümede ölçülebilen en küçük fark **1/8**'dir. Kayıt kaybının bedeli
**4/8**, ad kaybının bedeli **1/8**; ikisi aynı büyüklükte değildir ve sıralamaları
tersine çevrilemez. Kayıt tutmayan bir biçimde adlandırma düzeni tartışmasının karşılığı
yoktur; kayıt tutan bir biçimde ise düzenin bedeli tek bir satırdır ve o satır ödenmezse
kaydın kendisi yarı yarıya boşa gider.

Alt tablo adın biçim kurallarını veriyor. Sekiz adaydan **1**'i geçerli, **7**'si dört ayrı
nedenle reddediliyor. Reddedilenlerin hiçbiri bir yazım kusuru değil; her biri adın ya
kabukla ya aracın başvuru sözdizimiyle çakıştığı bir yerde duruyor. Son satırdaki **3**
çakışma ise düzenin kendi içinden gelen tek kısıttır: bir öneki dal adı olarak kullanmak, o
önek altındaki her adı imkânsız kılar.

## Özet

- Dal adı hem `refs/heads` altındaki bir yol hem insan için bir bildirimdir; eğik çizgi bu
  yolda bir hiyerarşi basamağı kurar ve desenle süzmeyi mümkün kılar.
- Ad düzeni üç alan taşıyabilir — tür, iş kaydı, kısa ad — ve ölçümde her alan yalnız bir
  ölçütü açar: alanlar birbirinin yerine geçmez.
- Sekiz bileşimin **3**'ünde grup okunur; düşen beş satırın **4**'ü dal kaydının
  yokluğundan, **1**'i adın hiçbir şey söylememesinden düşer.
- Kayıt tutmayan bir tümleştirme biçiminde ad tarihçeye hiç girmez ve adlandırma düzeninin
  katkısı **0**'dır; kayıt tutan biçimde düzensiz ad kaydın yarısını boşa çıkarır.
- Sekiz aday addan **1**'i geçerlidir; reddedilenler kabuk imleriyle ve aracın başvuru
  sözdizimiyle çakışır, ve bir önek dal adı olarak kullanıldığında altındaki **3** ad
  birden engellenir.

## Sonraki Adım

Ad, bir işlemeler kümesini bir işe bağlayan şeydir; kayıt onun sınırını, düzen onun anlamını
taşır. İkisi de `HEAD`in bir dal adını göstermesine dayanır — önceki derslerde kurulan
zincir üç halkalıydı: `HEAD` bir dal adını, dal adı bir işleme kimliğini, işleme kendi
öncülünü gösterir. Peki orta halka çıkarsa? `HEAD` bir dal adı yerine doğrudan bir işleme
kimliğini gösterdiğinde yapılan işlemeler hiçbir dala bağlanmaz. Sonraki ders bu durumun
nasıl oluştuğunu, orada yapılan işlemenin altı sorunun hangilerinin dışına düştüğünü ve
tarihçenin kaybettiğini bilmediği hâlde nasıl yanıt vermeyi sürdürdüğünü ölçer.
