Bölüm 9 · Yazılımın içi · Ders 45
Git: commit, dal ve birleştirme
İki geliştirici aynı robot yazılımına aynı anda özellik ekliyor
Veri. Robotun hareket kodu robot.py 7 satır. Ayşe 'engel' dalında LiDAR engel kontrolü ekliyor (2 commit), Can aynı sırada main dalında pil sınırını ekliyor (2 commit). İkisi de aynı commit'ten (hız 0,6) yola çıktı. Akşam iki dal birleşecek: Git hangi satırı kimden alacağını nasıl biliyor, ikisi aynı satırı değiştirdiyse ne oluyor?
def ozet(s, h=0): # basit özet (hash)for ch in s: h = (h * 31 + ord(ch)) % 2**32return format(h, '08x')[:7] # 7 haneli kimlikG = {} # kimlik -> (ebeveynler, içerik)def commit(ust, d):G[k := ozet(str(ust) + str(d))] = (ust, d); return k # içerik + ebeveyndef degis(c, i, s):d = list(G[c][1]); d[i] = s; return commit([c], d) # bir satırı değiştirdef atalar(c):return {c}.union(*[atalar(u) for u in G[c][0]]) # kendisi + atalarıD = ['HIZ = 0.5', 'ESIK = 0.30', 'PIL_MIN = 0.0', # robot.py'def adim(r):', ' r.oku()', ' pass', ' r.git(HIZ)']main = degis(commit([], D), 0, 'HIZ = 0.6') # iki commitengel = degis(main, 5, ' if r.lidar < ESIK: r.dur()') # Ayşe: yeni dalengel = degis(engel, 1, 'ESIK = 0.25')main = degis(main, 2, 'PIL_MIN = 11.1') # Can: mainCAKISMA = False # kaydırıcı: senaryomain = degis(main, 1, 'ESIK = 0.40') if CAKISMA else \degis(main, 6, ' r.git(HIZ, PIL_MIN)')ortak = atalar(main) & atalar(engel)o = max(ortak, key=lambda k: len(atalar(k))) # en yeni ortak ataR = [a if b in (x, a) else b if a == x else '<<<' # üç yönlüfor x, a, b in zip(G[o][1], G[main][1], G[engel][1])]print(o, R)
Sahnedeki her sayı, aynı algoritmanın tarayıcında yapılan gerçek çalıştırmasından gelir (sabit tohum, her seferinde aynı sonuç). Python kodunu kendi bilgisayarında çalıştırırsan rastgele başlangıçlar farklı olacağı için sayılar biraz değişebilir.
Veri seti
Tüm veri setleri →Bu dersin kodu verisini kendi içinde üretir; indirilecek dosya yok. Kodu yine de aşağıda tarayıcında çalıştırabilirsin.
Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide
Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.
Çıktı
Çıktı burada görünecek.Nasıl çalışır
- Commit, dosyanın o anki tam hâli ve ebeveyninin kimliğidir. Kimliği bu ikisinin özetidir (hash): içerik bir harf değişse kimlik de değişir.
- Dal yalnızca bir commit'e işaretçidir; yeni dal açmak kopya yapmaz. HEAD, şu an hangi dalda çalıştığımızı gösterir.
- Birleştirmede Git iki ucun atalarını çıkarır, ortak olanların en yenisini (ortak ata) bulur ve her satıra bakar: yalnız bir taraf değiştirdiyse onu alır.
- İki taraf aynı satırı farklı biçimde değiştirdiyse Git karar veremez: çakışma bildirir ve bir insanın seçmesini bekler.
- Şunu dene: senaryoyu 1 (çakışmalı) yap; Can da ESIK satırını değiştirir ve birleştirme o satırda durur.
Neden önemli
Robot ekiplerinde algılama, kontrol ve arayüz kodunu farklı kişiler aynı anda yazar; dallar herkesin işini ayrı tutar, birleştirme hepsini tek sürümde toplar. Aynı satırı iki kişinin değiştirmesi gerçek bir anlaşmazlıktır: Git bunu sessizce çözmek yerine durdurur, çünkü yanlış eşik değeri sahada çarpışma demektir.
ESOF 323, 11. hafta: robotlarda derin öğrenme →