İçeriğe geç
XDD.baby Yazılım Öğrenme
Sözlük Hata rehberi 0/56

Blok 1 · Ders 7

Hata ayıklama, Git ve GitHub

Hataları sistemli avlamayı (console.log, VS Code hata ayıklayıcısı, kırma noktası) ve kodunu Git geçmişiyle GitHub'a koyup portföyünü başlatmayı öğreniyorsun.

Bu dersin sonunda

  • Yanlış sonuç veren bir programda tahmin et, ölç, daralt döngüsüyle hatanın yerini bulabilirsin
  • console.log'a etiket ekleyerek değerlerin izini sürebilirsin
  • VS Code hata ayıklayıcısında kırma noktası koyup programı adım adım yürütebilir, değişkenleri izleyebilirsin
  • git status, git diff ve git log çıktılarını okuyabilir; .gitignore ve anlamlı commit mesajı kullanabilirsin
  • GitHub'da depo açıp kodunu git push ile gönderebilirsin
  • Markdown ile projeni anlatan bir README.md yazabilirsin
Bu sayfada
  1. Hata mesajı vermeyen hata
  2. Tahmin et, ölç, daralt
  3. console.log ile iz sürmek
  4. Hata ayıklayıcı: programı durdurup bakmak
  5. Adım adım ilerlemek
  6. Hatayı küçült, kanıtla, düzelt
  7. Git ile geçmişine bakmak
  8. .gitignore: Git'in görmemesi gerekenler
  9. GitHub: kodunu internete koymak
  10. README.md ve Markdown
  11. Portföy: her proje GitHub'da, açıklamalı
  12. Sık hatalar
  13. Görevler
  14. Kendini sına
  15. Kayıt noktası

Bu dersin iki yarısı var. İlkinde hataları sistemli avlamayı öğreneceksin: tahmin etmek, ölçmek, daraltmak; console.log ile iz sürmek ve VS Code'un hata ayıklayıcısıyla programı satır satır yürütmek. İkincisinde commit'lerinin içine bakacak, kodunu GitHub'a koyacak ve onu anlatan bir README yazacaksın. Sonunda internette, adresi olan ilk portföy sayfan hazır olacak.

Hata mesajı vermeyen hata

Ders 1'den beri kırmızı hata mesajlarını okuyorsun. O hatalar aslında kibardır: nerede olduklarını söylerler. Asıl zor olanlar sessiz hatalardır: Ders 2'de tanıştığın mantık hataları. Program çökmez, hiçbir uyarı vermez ama yanlış sonuç üretir.

VS Code'da C:\kod\ogren klasörünün açık olduğu pencerede çalış: soldaki dosya listesinin başında OGREN yazmalı. Ders 6'da açtığın takim-savasi penceresini kapatabilirsin, ona Görev 5'te döneceksin.

ders7.js adında yeni bir dosya aç ve aşağıdaki programı yaz. Takımın toplam hasarını hesaplıyor. İçinde bilerek bırakılmış bir hata var; şimdilik arama, yalnızca yaz ve çalıştır.

ders7.js
function toplamHasar(liste) {    let toplam = 0    for (let i = 1; i < liste.length; i++) {        toplam = toplam + liste[i].hasar    }    return toplam} const takim = [    { isim: "Ahri", hasar: 120 },    { isim: "Garen", hasar: 90 },    { isim: "Jinx", hasar: 150 },    { isim: "Lux", hasar: 110 }] const sonuc = toplamHasar(takim)console.log("Toplam hasar:", sonuc)
Çıktı
Toplam hasar: 350

Hata mesajı yok, program sonuna kadar çalıştı. Ama hasarları elle topla: 120 + 90 + 150 + 110, yani 470. Program 350 diyor. Sessiz hataları yakalamanın ilk kuralı budur: beklediğin sonucu önceden bil, sonra programın sonucuyla karşılaştır.

Hata avına başlamadan önce bu hâli kaydet. Birazdan Git'in sana "neyi değiştirdin?" sorusunu nasıl cevapladığını göreceksin; bunun için elinde bir "önce" kaydı olmalı.

Terminal — PowerShell
PS C:\kod\ogren> git add .PS C:\kod\ogren> git commit -m "Ders 7: toplam hasar programı (hatalı)"[master c1ec183] Ders 7: toplam hasar programı (hatalı) 1 file changed, 17 insertions(+) create mode 100644 ders7.js

Köşeli parantezdeki master sözcüğünü Git bölümünde açıklıyoruz. c1ec183 bu kaydın kimliği; Ders 1'den bildiğin gibi seninki farklı olacak.

Tahmin et, ölç, daralt

Yeni başlayanlar hatayı genellikle rastgele arar: bir yeri değiştirir, çalıştırır, olmadıysa başka bir yeri değiştirir. Deneyimli yazılımcılar ise her seferinde aynı üç adımı izler.

Bulamadın mı? Yeni tahmin. 1. Tahmin et Hata nerede olabilir? Bir cümleyle söyle. 2. Ölç Değerlere bak: log, kırma noktası 3. Daralt Şüpheli alanı küçült Buldun: düzelt sınır değerleriyle doğrula Örnek: 470 yerine 350 çıkıyor. Tahmin: Ahri sayılmıyor (fark 120).
Şekil 7.1 Hata ayıklama döngüsü. Hatayı bulana dek tahmin et, ölç, daralt; bulunca düzelt ve doğrula.

Döngüyü bizim programa uygulayalım:

  1. Tahmin et. Tahmini tek cümleyle söyle. "470 yerine 350 çıkıyor. Fark 120, bu da tam Ahri'nin hasarı. Ahri toplama girmiyor olabilir."
  2. Ölç. Tahmini doğrulayacak ya da yanlışlayacak bir şeye bak: döngü hangi şampiyonlardan geçiyor? Birazdan bunu iki araçla ölçeceğiz.
  3. Daralt. Ölçüm tahmini doğrularsa şüpheli alanı küçült: döngünün başlangıcı mı, koşulu mu, toplama satırı mı? Ölçüm tahmini yanlışlarsa yeni bir tahmin yap ve başa dön.

Hatayı bulunca düzelt ve doğrula: programı yeniden çalıştır, sınır değerlerini de dene. Ders 2'den hatırla: "çalışıyor" ile "doğru" aynı şey değil.

console.log ile iz sürmek

Ölçmenin ilk aracını zaten biliyorsun: console.log. Programın şüpheli bir yerine yazdırma satırı koyarsan program oradan her geçtiğinde değerleri ekrana döker. Buna iz sürmek denir.

Akla ilk gelen, değerleri çıplak yazdırmaktır. Döngünün içine console.log(i, toplam) satırını eklersen şunu görürsün:

JavaScript
    for (let i = 1; i < liste.length; i++) {        console.log(i, toplam)        toplam = toplam + liste[i].hasar    }
Çıktı
1 02 903 240Toplam hasar: 350

Hangi sayı i, hangisi toplam? Şu an biliyorsun çünkü satırı yeni yazdın; ekranda on farklı iz satırı varken bilemezsin. Çözüm her değerin önüne bir etiket koymak. Ders 1'den hatırla: console.log'a virgülle birden çok şey verebilirsin, araya boşluğu kendisi koyar.

Çıplak satırı sil ve yerine iki etiketli iz satırı ekle (vurgulu satırlar). Biri döngüden önce listenin uzunluğunu, öbürü her turda i'yi, şampiyonun adını ve o ana kadarki toplamı yazsın. Şampiyonun adı kendini belli eder; etikete asıl sayıların ihtiyacı var.

ders7.js
function toplamHasar(liste) {    let toplam = 0    console.log("liste uzunluğu:", liste.length)    for (let i = 1; i < liste.length; i++) {        console.log("i:", i, liste[i].isim, "toplam:", toplam)        toplam = toplam + liste[i].hasar    }    return toplam} const takim = [    { isim: "Ahri", hasar: 120 },    { isim: "Garen", hasar: 90 },    { isim: "Jinx", hasar: 150 },    { isim: "Lux", hasar: 110 }] const sonuc = toplamHasar(takim)console.log("Toplam hasar:", sonuc)
Çıktı
liste uzunluğu: 4i: 1 Garen toplam: 0i: 2 Jinx toplam: 90i: 3 Lux toplam: 240Toplam hasar: 350

Çıktıyı yukarıdan aşağı oku:

  • Listede 4 şampiyon var ama döngü yalnızca 3 tur dönmüş.
  • İlk turda i zaten 1 ve şampiyon Garen. Ahri hiç görünmüyor.

Tahmin doğrulandı: Ahri toplama girmiyor. Alan da daraldı: sorun döngünün başlangıcında, let i = 1 yazan yerde. Ders 5'ten hatırla, dizinin ilk elemanı liste[0]'dır.

Ama hatayı henüz düzeltme. Aynı hatayı bir de koda tek satır eklemeden göreceksin. İki iz satırını sil ki dosya ilk hâline dönsün.

Hata ayıklayıcı: programı durdurup bakmak

console.log'un zayıf yanları var: kodu değiştirmen gerekir, yalnızca önceden aklına gelen değerleri gösterir ve yüz turluk bir döngüde ekranı yazıya boğar. Hata ayıklayıcı ise programı istediğin satırda dondurur ve o anki bütün değişkenleri gösterir, koda tek satır eklemeden.

İz satırlarını sildiğinden emin ol, sonra:

  1. Kırma noktası koy. ders7.js'te 4. satırın (toplam = toplam + ...) numarasının hemen soluna tıkla; kırmızı bir nokta belirir. İmleç o satırdayken F9 da aynı işi yapar. Noktaya yeniden tıklarsan kalkar.
  2. Run and Debug görünümünü aç. En soldaki etkinlik çubuğunda (Activity Bar) üçgen ve böcek simgesine tıkla ya da Ctrl+Shift+D'ye bas.
  3. Başlat. Düzenleyicide ders7.js açıkken Run and Debug düğmesine ya da F5'e bas; VS Code o an açık olan dosyayı çalıştırır. Hangi hata ayıklayıcıyı kullanacağını sorarsa (Select debugger) listeden Node.js'i seç. Düğmenin altındaki create a launch.json file bağlantısına şimdilik gerek yok.
  4. Bak. Program 4. satırda durur: satır sarıya boyanır, numaranın yanında sarı bir ok belirir. Ekranın üstünde küçük bir araç çubuğu açılır.
ders7.js — ogren — Visual Studio Code
ders7.js
function toplamHasar(liste) {    let toplam = 0    for (let i = 1; i < liste.length; i++) {        toplam = toplam + liste[i].hasar    }    return toplam} const takim = [    { isim: "Ahri", hasar: 120 },    { isim: "Garen", hasar: 90 },    { isim: "Jinx", hasar: 150 },    { isim: "Lux", hasar: 110 }] const sonuc = toplamHasar(takim)console.log("Toplam hasar:", sonuc)
Ln 1, Col 1Spaces: 4UTF-8JavaScript

Program 4. satırda durdu. Kırmızı nokta senin koyduğun kırma noktası; sarı şerit ve ok, programın şu an çalıştırmak üzere beklediği satır.

Şimdi Run and Debug görünümünün en üstündeki VARIABLES (değişkenler) paneline bak. Programın durduğu andaki değişkenler orada, gruplar hâlinde duruyor. İlk grup (Block: toplamHasar) açık gelir. Local: toplamHasar kapalıysa adına tıklayıp aç; sonraki duruşlarda açık kalır.

› VARIABLES › Block: toplamHasar i: 1 › this: global {…} › Local: toplamHasar › liste: (4) [{…}, {…}, {…}, {…}] toplam: 0 › Global ›WATCH ›CALL STACK ›BREAKPOINTS İlk turda i: 1 0 olmalıydı. toplam henüz 0 Sarı satır daha çalışmadı.
Şekil 7.2 Program ilk kez durduğunda Variables paneli, Local grubu açıldıktan sonra. i daha ilk turda 1.
  • Block: toplamHasar döngünün kendi değişkenleri. for'un parantezinde açılan i burada: i: 1, oysa ilk turda 0 olmalıydı. Hata, koda tek satır eklemeden yakalandı.
  • Local: toplamHasar fonksiyonun değişkenleri: liste (solundaki oka tıklayıp dört şampiyonu açabilirsin) ve toplam: 0.
  • this satırını ve Global bölümünü şimdilik görmezden gel.

Adım adım ilerlemek

Program durduğunda ekranın üstünde beliren araç çubuğu, programı nasıl ilerleteceğini seçmeni sağlar:

1 2 3 4 5 6 1 F5 Continue Sonraki kırma noktasına kadar sür 2 F10 Step Over Bir satır ilerle, fonksiyona girme 3 F11 Step Into Bir satır ilerle, fonksiyona gir 4 Shift+F11 Step Out Fonksiyondan çık, çağrıya dön 5 Ctrl+Shift+F5 Restart Programı baştan başlat 6 Shift+F5 Stop Hata ayıklamayı bitir
Şekil 7.3 Hata ayıklama araç çubuğu. Her düğmenin bir kısayolu var.

Döngüyü tur tur izle. F5'e bas: program bir tur çalışır, kırma noktasına yeniden gelir ve durur. Variables'da i: 2 ve toplam: 90 görürsün; bir kez daha basınca i: 3 ve toplam: 240. Ahri'nin 120 hasarı hiçbir turda eklenmiyor.

Bu sefer F10'a bas: 4. satır çalışır (toplam 350 olur) ve sarı şerit 3. satıra, döngünün başına çıkar. Sırada i++ var.

Bir kez daha F10'a bas: şerit yine 3. satırda kalır, çünkü bu sefer sırada koşul var (i artık 4). Bir kez daha basınca koşul yanlış çıkar (4 < 4) ve şerit 6. satıra, return toplam'a iner. Shift+F5 ile bitir.

F10 mu, F11 mi?

4. satırdaki kırmızı noktaya tıklayıp kaldır ve 16. satıra, const sonuc = toplamHasar(takim) satırına yeni bir kırma noktası koy. F5 ile başlat; program 16. satırda durur. Bu satır bir fonksiyon çağırıyor ve iki seçeneğin var:

  • F10 (Step Over) fonksiyonu tek seferde çalıştırır ve 17. satırda durur. Variables'da sonuc artık 350. Bu sefer listede module, require gibi Node'un kendi adları da görünür; onları şimdilik geç. Fonksiyonun içiyle ilgilenmiyorsan bunu seç.
  • F11 (Step Into) fonksiyonun içine girer ve 2. satırda (let toplam = 0) durur. Hatanın fonksiyonun içinde olduğunu düşünüyorsan bunu seç. İçeriden çıkmak için Shift+F11.
1 function toplamHasar(liste) { 2 let toplam = 0 3 for (let i = 1; …) { … 7 } 16 const sonuc = toplamHasar(takim) 17 console.log("Toplam hasar:", sonuc) F11 içine gir: 2. satırda dur F10 tek seferde çalıştır: 17. satırda dur
Şekil 7.4 Program 16. satırda dururken F10 çağrının üstünden geçer, F11 fonksiyonun içine girer.

Debug Console: programa soru sormak

Program dururken alt paneldeki DEBUG CONSOLE sekmesini aç. En alttaki > işaretli satıra bir ifade yazıp Enter'a basarsan o anki değerlerle hesaplanır: 4. satırda dururken i yazarsan 1, liste[0].isim yazarsan 'Ahri' görürsün. F5 ile başlattığın programın console.log çıktıları da terminale değil, bu sekmeye düşer.

Hatayı küçült, kanıtla, düzelt

Bizim programımız 17 satır. Takım savaşı gibi uzun bir programda her satırı izlemek çok zaman alır; iki teknik işini kolaylaştırır.

En küçük örnek

Şüphelendiğin parçayı programdan ayır ve en küçük girdiyle dene. deneme.js adında yeni bir dosya aç, yalnızca toplamHasar fonksiyonunu kopyala ve tek şampiyonlu bir takımla, bir de boş takımla çağır:

deneme.js
function toplamHasar(liste) {    let toplam = 0    for (let i = 1; i < liste.length; i++) {        toplam = toplam + liste[i].hasar    }    return toplam} console.log(toplamHasar([{ isim: "Ahri", hasar: 10 }]))console.log(toplamHasar([]))
Çıktı
00

Tek şampiyonlu bir takımın toplam hasarı 0 olamaz. Programın geri kalanı yokken hata duruyorsa sorun kesinlikle bu birkaç satırdadır. Üstelik tek elemanla döngü hiç dönmüyor: i 1'den başlıyor, 1 < 1 ise yanlış.

Teşhis kesinleşti. Şimdi iki dosyada da 3. satırı düzelt:

JavaScript✗ Yanlış
for (let i = 1; i < liste.length; i++) {
JavaScript✓ Doğru
for (let i = 0; i < liste.length; i++) {

Ve doğrula. deneme.js sınır değerlerini dener:

deneme.js
function toplamHasar(liste) {    let toplam = 0    for (let i = 0; i < liste.length; i++) {        toplam = toplam + liste[i].hasar    }    return toplam} console.log(toplamHasar([{ isim: "Ahri", hasar: 10 }]))console.log(toplamHasar([]))
Çıktı
100

Tek şampiyon 10, boş takım 0: ikisi de doğru. node ders7.js de artık Toplam hasar: 470 yazıyor. Hata bulundu, düzeltildi ve doğrulandı. Bu, Ders 5'te gördüğün "bir eksik tur" hatasıydı: döngü bir adım geç başlıyordu.

En küçük örnek yardım isterken de işe yarar. Bir arkadaşına, foruma ya da bir yapay zekâ aracına sorarken üç şey ver: en küçük örnek kod, beklediğin çıktı ve aldığın çıktı (ya da hata mesajının tamamı). "Kodum çalışmıyor" sorusuna kimse cevap veremez.

Lastik ördek

Bazen ölçtüğün hâlde hatayı göremezsin. O zaman kodu birine satır satır, sesli anlat. Karşında kimse yoksa masandaki bir eşyaya.

"Döngü i 1'den başlıyor ve liste[i]'nin hasarını topluyor. Yani ilk toplanan liste[1]… Dur, dizinin ilk elemanı liste[0]."

Kafanın içinde okurken atladığın adımı, sesli anlatırken atlayamazsın.

Git ile geçmişine bakmak

Ders 1'den beri her dersin sonunda commit attın ama kayıtların içine hiç bakmadın. Git yalnızca kaydetmez; "şu an ne durumdayım?", "tam olarak ne değişti?" ve "geçmişte ne yaptım?" sorularını da cevaplar. Bunun için üç komut var: status, diff ve log.

git status: şu an ne durumdayım?

ders7.js'i düzelttin, deneme.js'i de yeni yazdın. VS Code terminalinde, C:\kod\ogren klasöründeyken şunu yaz:

Terminal — PowerShell
PS C:\kod\ogren> git statusOn branch masterChanges not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git restore <file>..." to discard changes in working directory)        modified:   ders7.js Untracked files:  (use "git add <file>..." to include in what will be committed)        deneme.js no changes added to commit (use "git add" and/or "git commit -a")
  • On branch master: üzerinde çalıştığın dalın (branch) adı. GitHub bölümünde ona döneceğiz.
  • Changes not staged for commit altındaki modified: ders7.js: Git'in tanıdığı bir dosya değişmiş ama henüz kayda hazırlanmamış.
  • Untracked files altındaki deneme.js: Git bu dosyayı hiç tanımıyor (izlenmeyen dosya).
  • Parantez içindeki use "git …" satırları Git'in ipuçlarıdır. Windows'un Türkçe olsa da Git'in mesajları İngilizce çıkar.

Ders 1'den beri her commit'ten önce git add . yazdın. Sebebi şu: Git, çalışma klasörün ile geçmişin arasında bir ara durak tutar. git add değişikliği bu durağa koyar, git commit yalnızca orada bekleyenleri kaydeder.

Bir değişikliğin commit'e girene kadar geçtiği yol şöyle:

git add git commit Çalışma klasörü ders7.js deneme.js Hazırlık alanı sıradaki commit'e girecek değişiklikler Depo (geçmiş) her nokta bir commit status: modified, Untracked (kırmızı) status: Changes to be committed (yeşil) git log ile görürsün
Şekil 7.5 Bir değişikliğin yolu: çalışma klasöründen hazırlık alanına (git add), oradan geçmişe (git commit).

Terminalinde bu dosya adları kırmızı ("kayda hazır değil"), git add'den sonra yeşil ("sıradaki commit'e girecek") görünür.

git diff: tam olarak ne değişti?

Terminal — PowerShell
PS C:\kod\ogren> git diffdiff --git a/ders7.js b/ders7.jsindex 54951ac..7be3ff7 100644--- a/ders7.js+++ b/ders7.js@@ -1,6 +1,6 @@ function toplamHasar(liste) {     let toplam = 0-    for (let i = 1; i < liste.length; i++) {+    for (let i = 0; i < liste.length; i++) {         toplam = toplam + liste[i].hasar     }     return toplam
  • --- dosyanın eski hâli, +++ yeni hâli.
  • Başında - olan satır silindi, + olan eklendi. Bir satırı değiştirmek, eskisini silip yenisini eklemek olarak görünür.
  • Başında işaret olmayan satırlar, değişikliğin yerini anlaman için çevredeki bağlamdır. @@ -1,6 +1,6 @@ da bu bölümün dosyadaki yeridir (1. satırdan başlayan 6 satır).
  • deneme.js burada yok: git diff yalnızca Git'in tanıdığı dosyalardaki değişiklikleri gösterir.
  • git diff henüz git add ile hazırlamadığın değişiklikleri gösterir. git add'den sonra boş görünmesi bu yüzden normaldir.

Her şey yerindeyse kaydet:

Terminal — PowerShell
PS C:\kod\ogren> git add .PS C:\kod\ogren> git statusOn branch masterChanges to be committed:  (use "git restore --staged <file>..." to unstage)        new file:   deneme.js        modified:   ders7.js PS C:\kod\ogren> git commit -m "Toplam hasarda döngüyü 0'dan başlat"[master 56263f3] Toplam hasarda döngüyü 0'dan başlat 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 deneme.js

git add . komutundan sonra iki dosya da Changes to be committed altında, yani hazırlık alanında. 11 insertions(+), 1 deletion(-) eklenen ve silinen satır sayısıdır: deneme.js'in 10 satırı ve ders7.js'te değişen satırın yenisi eklendi, eskisi silindi.

git log: maç geçmişin

git log maç geçmişin gibidir: her satır bir kayıt, en yenisi en üstte.

Terminal — PowerShell
PS C:\kod\ogren> git log --oneline56263f3 (HEAD -> master) Toplam hasarda döngüyü 0'dan başlatc1ec183 Ders 7: toplam hasar programı (hatalı)a8c71ac Ders 6: return ve rastgele sayıbc9f981 Ders 5: diziler ve döngüler33a94e5 Ders 4: objelerde7d092 Ders 3: else if, mantık işaretleri ve fonksiyonlar341fcee Ders 2: karşılaştırma ve if/else562cc9d Ders 1: ilk program ve değişkenler
  • Soldaki kod commit'in kısaltılmış kimliğidir; seninkiler farklı olacak. Sağda her dersin sonunda yazdığın mesajlar duruyor.
  • (HEAD -> master) "şu an buradasın" demek.
  • --oneline her kaydı tek satırda gösterir. Yalnızca git log yazarsan yazarı, e-postayı ve tarihi de görürsün; -1 "yalnız son kayıt" demek:
Terminal — PowerShell
PS C:\kod\ogren> git log -1commit 56263f35b3aa55a056bd9a9e65585c2918317201 (HEAD -> master)Author: Deniz Yılmaz <deniz@example.com>Date:   Sun Oct 11 19:48:00 2026 +0300     Toplam hasarda döngüyü 0'dan başlat

Author satırına dikkat: her commit adını ve e-posta adresini taşır. Kodunu herkese açık bir yere koyduğunda bu bilgi de oraya gider. GitHub bölümünde adresini nasıl gizleyeceğini göreceksin.

İyi commit mesajı

Bir ay sonra git log --oneline'a baktığında "düzeltme", "son hâli" gibi mesajlar hiçbir şey anlatmaz. İyi mesaj, diff'e bakmadan ne yapıldığını söyler.

KötüNeden kötü?Daha iyi
düzelttimNeyi?Toplam hasarda döngüyü 0'dan başlat
ders7.js güncellendiDosyayı Git zaten biliyor; ne yaptığını söyleFaizi en fazla 5 ile sınırla
son hâli kesin buBir şey anlatmıyorTakım savaşına beraberlik durumunu ekle
asdasdHiçbir şey anlatmıyorREADME'ye çalıştırma adımlarını ekle
  • Ne yaptığını söyle, emir kipiyle: ekle, düzelt, başlat. Kısa tut: tek satır, 50 karakter civarı; 72'yi geçmesin.
  • Bir commit, bir iş. Hatayı düzelttin ve README'yi de yazdın mı? İki commit at. git add ders7.js yalnızca o dosyayı hazırlar.
  • Ekibin dilini kullan. Birçok şirkette mesajlar İngilizcedir (Fix loop start in total damage); bu kursta Türkçe yazıyoruz.

.gitignore: Git'in görmemesi gerekenler

Her dosya Git'e girmemeli: kendine aldığın notlar, şifreler, programların ürettiği geçici dosyalar. Kodun GitHub'a gidecekse bu daha da önemli. .gitignore adlı dosyaya adını yazdığın dosyaları Git görmezden gelir.

Klasörde notlar.txt adında bir dosya oluştur ve içine kendine birkaç not yaz. Sonra:

Terminal — PowerShell
PS C:\kod\ogren> git statusOn branch masterUntracked files:  (use "git add <file>..." to include in what will be committed)        notlar.txt nothing added to commit but untracked files present (use "git add" to track)

Şimdi VS Code'da yeni bir dosya oluştur, adını tam olarak .gitignore koy (başında nokta var, uzantısı yok) ve içine tek satır yaz:

.gitignore
notlar.txt
Terminal — PowerShell
PS C:\kod\ogren> git statusOn branch masterUntracked files:  (use "git add <file>..." to include in what will be committed)        .gitignore nothing added to commit but untracked files present (use "git add" to track)PS C:\kod\ogren> git add .PS C:\kod\ogren> git commit -m "Kişisel notları .gitignore ile Git dışında tut"[master cdc2a13] Kişisel notları .gitignore ile Git dışında tut 1 file changed, 1 insertion(+) create mode 100644 .gitignore

notlar.txt listeden kayboldu, yerine .gitignore geldi. .gitignore'u commit'le ki kural GitHub'da da dursun. Artık git add . yazsan bile notlar.txt kayda girmez.

.gitignore satırıAnlamı
notlar.txtBu adı taşıyan dosya
*.logSonu .log ile biten bütün dosyalar; * "ne olursa olsun" demek
node_modules/Bu klasörün tamamı (Ders 14'te göreceksin)

GitHub: kodunu internete koymak

Şu ana kadar her şey senin bilgisayarında: disk bozulursa geçmişin de gider, işverene de gösteremezsin. GitHub, Git depolarını internette saklayan bir site: yedeğin olur, kodunu paylaşırsın, işverenler profiline bakar.

Senin bilgisayarın C:\kod\ogren yeni GitHub denizyilmaz/ogren origin git push git pull: Ders 52 Push yalnızca commit'lenmiş değişiklikleri gönderir.
Şekil 7.6 git push, bilgisayarındaki ve GitHub'da olmayan commit'leri uzak depoya (origin) gönderir.

1. Hesap aç

github.com adresine git ve Sign up ile hesap aç. E-posta, şifre ve kullanıcı adı ister; sonra e-postana bir doğrulama kodu gönderir.

Kullanıcı adını dikkatle seç: onu CV'ne yazacaksın ve profil adresin github.com/kullaniciadi olacak. Oyun takma adı yerine adına yakın, sade bir ad seç (denizyilmaz, deniz-yilmaz); xXDenizProXx ya da deniz2007 gibi adlardan kaçın. Kullanıcı adında yalnızca İngilizce harf, rakam ve tire olabilir; tireyle başlayıp tireyle bitemez.

GitHub senden iki adımlı doğrulamayı (2FA) açmanı isteyebilir. İstediğinde adımları izle ve verdiği kurtarma kodlarını (recovery codes) güvenli bir yere kaydet; telefonunu kaybedersen hesabına onlarla girersin.

2. E-posta adresini gizle

Az önce git log -1'de gördün: her commit e-posta adresini taşıyor. Herkese açık bir depoya gönderdiğin commit'lerdeki adresi herkes görebilir. GitHub bunun için sana gizli bir adres verir:

  1. GitHub'da sağ üstteki profil resmine tıkla ve Settings'e gir.
  2. Soldaki menüden Emails'i aç.
  3. Keep my email addresses private kutusu işaretli değilse işaretle. Hemen altında 12345678+denizyilmaz@users.noreply.github.com gibi bir adres belirir; rakamlar ve ad sende farklı olur. Bu adresi kopyala.
  4. VS Code terminalinde Git'e bu adresi ver, sonra doğru kaydedildiğini denetle:
    Terminal — PowerShell
    PS C:\kod\ogren> git config --global user.email "12345678+denizyilmaz@users.noreply.github.com"PS C:\kod\ogren> git config --global user.email12345678+denizyilmaz@users.noreply.github.com

Bundan sonraki commit'lerin bu adresle atılır; GitHub onları yine senin hesabına bağlar.

3. Boş bir depo aç

  1. Sağ üstteki + düğmesine tıkla ve New repository'yi seç.
  2. Repository name kutusuna ogren yaz. İstersen kısa bir açıklama (Description) ekle.
  3. Public (herkes görebilir) ya da Private (yalnızca sen görürsün) seç.
  4. README, .gitignore ve lisans ekleme seçeneklerinin hepsini kapalı bırak. Bilgisayarındaki depoda zaten bir geçmiş var; GitHub kendi dosyasını eklerse iki geçmiş birbirini tutmaz ve push reddedilir.
  5. Create repository'ye bas.

4. Bağla ve gönder

Depo açılınca GitHub komutlar gösteren bir sayfa açar. Adresin yanında HTTPS ve SSH seçenekleri varsa HTTPS seçili olsun: adres https:// ile başlamalı.

…or push an existing repository from the command line (var olan bir depoyu komut satırından gönder) başlığının altındaki üç satır senin durumun. Kendi kullanıcı adınla, C:\kod\ogren klasöründe sırayla çalıştır. Üçüncü komut bir giriş penceresi açacak; ne yapacağın aşağıda.

Terminal — PowerShell
PS C:\kod\ogren> git remote add origin https://github.com/denizyilmaz/ogren.gitPS C:\kod\ogren> git branch -M mainPS C:\kod\ogren> git push -u origin main
  • git remote add origin <adres>: "Bu depoya origin adında bir uzak depo ekle, adresi şu." Hiçbir şey yazmaz; kaydı git remote -v gösterir.
  • git branch -M main: dalının adını master'dan main'e çevirir. Commit çıktılarında [master …] görüyordun; GitHub ise ana dala main diyor. Dalları Ders 52'de öğreneceksin; şimdilik commit zincirine verilmiş bir ad diye düşün.
  • git push -u origin main: main dalını origin'e gönder. -u ikisini birbirine bağlar; bundan sonra yalnızca git push yeter.
Terminal — PowerShell
PS C:\kod\ogren> git remote -vorigin  https://github.com/denizyilmaz/ogren.git (fetch)origin  https://github.com/denizyilmaz/ogren.git (push)

5. İlk push'ta tarayıcıyla giriş

İlk git push'ta Git, kim olduğunu kanıtlaman için Git'le birlikte kurulan Git Credential Manager'ın penceresini açar.

  1. Açılan pencerede Sign in with your browser'a bas.
  2. Tarayıcında GitHub açılır. Giriş yapmadıysan giriş yap, sonra Git Credential Manager'a izin ver (Authorize).
  3. Tarayıcı girişin başarılı olduğunu söyleyince sekmeyi kapat ve terminale dön. Push kendiliğinden devam eder.
Terminal — PowerShell
PS C:\kod\ogren> git push -u origin mainEnumerating objects: 29, done.Counting objects: 100% (29/29), done.Delta compression using up to 12 threadsCompressing objects: 100% (27/27), done.Writing objects: 100% (29/29), 3.02 KiB | 773.00 KiB/s, done.Total 29 (delta 9), reused 0 (delta 0), pack-reused 0 (from 0)To https://github.com/denizyilmaz/ogren.git * [new branch]      main -> mainbranch 'main' set up to track 'origin/main'.

Sayılar sende farklı olur; GitHub araya remote: ile başlayan satırlar da ekleyebilir. Önemli olan son iki satır: * [new branch] main -> main GitHub'da main dalının oluştuğunu, set up to track 'origin/main' de -u'nun işini yaptığını söyler. Giriş bilgin Windows'ta saklanır, bir daha sorulmaz.

Tarayıcıda depo sayfanı yenile: dosyaların ve Ders 1'den bu yana bütün commit geçmişin orada. Terminalden de denetle:

Terminal — PowerShell
PS C:\kod\ogren> git statusOn branch mainYour branch is up to date with 'origin/main'. nothing to commit, working tree clean

up to date with 'origin/main', GitHub'daki kopyayla aynı durumda olduğun anlamına gelir. Yeni bir commit atınca bu satır Your branch is ahead of 'origin/main' by 1 commit. olur: bir commit'in henüz gönderilmedi.

README.md ve Markdown

GitHub'da bir depoya giren herkes önce dosya listesinin altındaki yazıyı okur. O yazı deponun ana klasöründeki README.md dosyasından gelir. README yoksa ziyaretçi kodun ne işe yaradığını tahmin etmek zorunda kalır.

C:\kod\ogren klasöründe README.md adında bir dosya oluştur ve içine kendi bilgilerinle şuna benzer bir metin yaz:

README.md
# ogren Sıfırdan JavaScript öğrenirken yazdığım alıştırmalar. Her ders ayrı bir dosyada: `ders1.js`, `ders2.js` ve devamı. ## İçindekiler - **Ders 1–3:** değişkenler, if / else, fonksiyonlar- **Ders 4–5:** objeler, diziler ve döngüler- **Ders 6:** `return` ve rastgele sayılar- **Ders 7:** hata ayıklama örneği ## Nasıl çalıştırılır? Bilgisayarında [Node.js](https://nodejs.org) kurulu olmalı. Bu klasörde bir terminal aç ve bir dersi çalıştır: ```node ders1.js``` ## Kaynak Bu alıştırmaları [Yazılım Öğrenme](https://xdd.baby/ders) kursunu izleyerek yazdım.
YazdığınGördüğün
# ogrenBüyük başlık
## İçindekilerDaha küçük başlık
- maddeMadde işaretli liste
**kalın**kalın yazı
`ders1.js`Kod gibi görünen kısa yazı
[Node.js](https://nodejs.org)Bağlantı: köşeli parantezde yazı, normal parantezde adres
Üç ters tırnakla açılıp kapanan satırlarKod bloğu; açılışa dil adı yazarsan (```js) GitHub kodu renklendirir

# ve - işaretlerinden sonra bir boşluk bırak; boşluksuz #ogren başlık olmaz. Paragrafları boş bir satırla ayır.

README açıkken Ctrl+Shift+V'ye basarsan VS Code önizlemeyi açar; bir daha basınca yazıya dönersin. GitHub da aşağı yukarı böyle gösterir:

README.md # ogren Alıştırmalarım. ## İçindekiler - **Ders 1–3:** temeller - Ders 7: hata ayıklama [Kurs](https://xdd.baby/ders) ``` node ders1.js ``` Görünüşü ogren Alıştırmalarım. İçindekiler • Ders 1–3: temeller • Ders 7: hata ayıklama Kurs node ders1.js
Şekil 7.7 Solda yazdığın Markdown, sağda biçimlenmiş hâli.

Kaydet ve gönder. Bu sefer -u origin main yazmana gerek yok:

Terminal — PowerShell
PS C:\kod\ogren> git add README.mdPS C:\kod\ogren> git commit -m "README ekle"[main f52a1f8] README ekle 1 file changed, 22 insertions(+) create mode 100644 README.mdPS C:\kod\ogren> git pushEnumerating objects: 4, done.Counting objects: 100% (4/4), done.Delta compression using up to 12 threadsCompressing objects: 100% (3/3), done.Writing objects: 100% (3/3), 704 bytes | 704.00 KiB/s, done.Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)To https://github.com/denizyilmaz/ogren.git   cdc2a13..f52a1f8  main -> main

cdc2a13..f52a1f8 "GitHub'daki main, cdc2a13'ten f52a1f8'e ilerledi" demek. Depo sayfanı yenile: README dosya listesinin altında biçimlenmiş olarak duruyor.

Portföy: her proje GitHub'da, açıklamalı

Junior başvurularında işverenlerin baktığı ilk yerlerden biri GitHub profilindir. CV'ndeki "JavaScript biliyorum" cümlesini kanıtlayan şey oradaki projelerdir.

İyi bir portföy için:

  • Her proje ayrı bir depoda, adı ne olduğunu anlatsın: takim-savasi, ileride ansiklopedi.
  • Her deponun README'si olsun: ne yapar, nasıl çalıştırılır, örnek çıktı, bu projede ne öğrendin.
  • Geçmiş düzenli olsun: tek bir "hepsi" commit'i yerine adım adım, anlamlı mesajlı kayıtlar.
  • Gizli bilgi olmasın: şifreler ve kişisel notlar .gitignore'da.

Ders 6'daki takım savaşı (C:\kod\takim-savasi) ilk portföy projen; Görev 5'te onu kendi deposuna koyacaksın. ogren deposu da kalsın, öğrenme yolculuğunu gösterir. Profilinde en iyi projeleri öne çıkarmayı Ders 54'te göreceksin.

Sık hatalar

Bu derste karşılaşabileceğin hatalar. Hepsi bütün derslerin hatalarıyla birlikte hata rehberinde de duruyor.

Sık hataProgram kırma noktasında durmuyor

Ne zaman çıkar? Kırmızı noktayı koydun ama program durmadan sonuna kadar çalıştı. En sık sebep programı terminalde node ders7.js ile çalıştırmak: kırma noktaları yalnızca hata ayıklama oturumunda (F5) çalışır. Ctrl+F5 (Run Without Debugging) da kırma noktalarını görmezden gelir. Kırma noktası hiç çalışmayan bir yerde (örneğin hiç çağrılmayan bir fonksiyonda) ya da başka bir dosyada da olabilir.

Nasıl düzelir? Programı F5 ile başlat. Kırma noktasını çalıştığından emin olduğun bir satıra koy; emin değilsen programın ilk satırına koy ve F10 ile ilerle.

Sık hatafatal: not a git repository (or any of the parent directories): .git

Ne zaman çıkar? Git komutunu bir depo olmayan klasörde çalıştırınca. En sık sebep terminalin yanlış klasörde açık olması: örneğin C:\kod\ogren'de değil, C:\kod'dasın.

Terminal — PowerShell
PS C:\kod> git statusfatal: not a git repository (or any of the parent directories): .git

Nasıl düzelir? cd ogren ile depo klasörüne gir ya da VS Code'da doğru klasörü aç (File → Open Folder). Gerçekten yeni bir projedeysen önce git init ile depoyu başlat.

Sık hatahint: Waiting for your editor to close the file...

Ne zaman çıkar? git commit yazıp -m "…" kısmını unutunca. Git mesajı yazman için bir düzenleyici açar ve terminal bu satırla bekler. Ders 0'da düzenleyici olarak VS Code'u seçtin; bu yüzden VS Code'da COMMIT_EDITMSG adlı bir sekme açılır. Sekmedeki # ile başlayan satırlar Git'in açıklamalarıdır.

Nasıl düzelir? Mesajı sekmenin en üst satırına yaz, kaydet (Ctrl+S) ve sekmeyi kapat; commit tamamlanır. Sekmeyi bir şey yazmadan kapatırsan Git commit'i iptal eder:

Terminal — PowerShell
PS C:\kod\ogren> git commitAborting commit due to empty commit message.

Sekme yerine terminalde satır başlarında ~ olan bir ekran (Vim) açıldıysa Ders 0'daki core.editor ayarı yapılmamış demektir: Esc'ye bas, :q! yaz, Enter'a bas ve komutu -m "mesaj" ile yeniden yaz.

Sık hataerror: remote origin already exists.

Ne zaman çıkar? git remote add origin … komutunu ikinci kez çalıştırınca. Örneğin adresi yanlış yazıp düzeltmek için komutu tekrarlarken.

Terminal — PowerShell
PS C:\kod\ogren> git remote add origin https://github.com/denizyilmaz/ogren.giterror: remote origin already exists.

Nasıl düzelir? git remote -v ile kayıtlı adrese bak. Adres doğruysa bir şey yapmana gerek yok. Yanlışsa ekleme, değiştir: git remote set-url origin https://github.com/kullaniciadin/ogren.git.

Sık hatafatal: repository '…' not found

Ne zaman çıkar? Gönderdiğin adreste GitHub'da bir depo yoksa. En sık sebepler: adresteki kullanıcı adını ya da depo adını yanlış yazmak (ogren yerine ogrne) ya da depoyu GitHub'da hiç açmamış olmak.

Terminal — PowerShell
PS C:\kod\ogren> git push -u origin mainfatal: repository 'https://github.com/denizyilmaz/ogrne.git/' not found

Bu satırın üstünde GitHub'ın remote: ile başlayan kısa bir açıklaması da görünebilir.

Nasıl düzelir? git remote -v ile kayıtlı adrese bak ve tarayıcıdaki depo adresiyle harf harf karşılaştır. Yanlışsa bir önceki karttaki git remote set-url origin … komutuyla düzelt. Depo hiç yoksa önce GitHub'da aç.

Sık hataerror: src refspec main does not match any

Ne zaman çıkar? Dalının adı hâlâ master'ken git push -u origin main yazınca. Depoda hiç commit yokken push etmeye çalışınca da çıkar.

Terminal — PowerShell
PS C:\kod\ogren> git push -u origin mainerror: src refspec main does not match anyerror: failed to push some refs to 'https://github.com/denizyilmaz/ogren.git'

Nasıl düzelir? git status'un ilk satırına bak. On branch master yazıyorsa git branch -M main çalıştır ve push'u tekrarla. Hiç commit yoksa önce git add . ve git commit ile bir kayıt al.

Sık hatafatal: The current branch main has no upstream branch.

Ne zaman çıkar? Uzak depoyu ekledikten sonra ilk gönderimde -u origin main kısmını yazmayıp yalnızca git push yazınca. Git, main dalını nereye göndereceğini henüz bilmiyor.

Terminal — PowerShell
PS C:\kod\ogren> git pushfatal: The current branch main has no upstream branch.To push the current branch and set the remote as upstream, use     git push --set-upstream origin main To have this happen automatically for branches without a trackingupstream, see 'push.autoSetupRemote' in 'git help config'.

Nasıl düzelir? İlk gönderimi git push -u origin main ile yap. Mesajın önerdiği --set-upstream aynı şeyin uzun yazılışıdır. Bu bağ bir kez kurulunca sonraki gönderimlerde yalnızca git push yeterli.

Sık hata! [rejected] main -> main (fetch first)

Ne zaman çıkar? GitHub'da depoyu açarken README (ya da .gitignore, lisans) eklediysen. GitHub'daki depoda senin bilgisayarında olmayan bir commit vardır; Git onu silmemek için push'u reddeder.

Terminal — PowerShell
PS C:\kod\ogren> git push -u origin mainTo https://github.com/denizyilmaz/ogren.git ! [rejected]        main -> main (fetch first)error: failed to push some refs to 'https://github.com/denizyilmaz/ogren.git'hint: Updates were rejected because the remote contains work that you do nothint: have locally. This is usually caused by another repository pushing tohint: the same ref. If you want to integrate the remote changes, usehint: 'git pull' before pushing again.hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Nasıl düzelir? Depo yeniyse en kolayı onu silip README'siz yeniden açmak: depo sayfasında Settings'e gir, en alttaki Delete this repository ile sil, aynı adla boş bir depo aç ve push'u tekrarla. hint satırlarındaki git pull yolunu Ders 52'de öğreneceksin.

Görevler

Kod görevlerini ders7.js'e değil, ayrı dosyalara yaz (gorev1.js, gorev3.js); Git görevlerinde onları kullanacaksın. Önce kendin dene, takılırsan ipuçlarını sırayla aç. Çözüme en son bak.

Görev 1

İz sürerek bul

Garen'in 100 canı var, Darius'un baltası 30 hasar vuruyor; kalan can 70 olmalı. gorev1.js dosyasına bu programı yaz ve çalıştır:

gorev1.js
function hasarAl(hp, hasar) {    const kalan = hp - hasar    return kalan} const garenCan = 100const baltaHasari = 30console.log("Kalan can:", hasarAl(baltaHasari, garenCan))
Çıktı
Kalan can: -70

Düzeltmeden önce bu hâli commit'le, Görev 2'de lazım olacak: git add . ve ardından git commit -m "Görev 1: hasarAl (hatalı hâli)". Sonra:

  1. hasarAl fonksiyonunun içine etiketli bir iz satırı koyarak hatayı bul ve düzelt. İlk satır Kalan can: 70 yazmalı.
  2. Can asla eksiye düşmesin: hasar candan büyükse fonksiyon 0 döndürsün.
  3. Sınırları dene: hasarAl(100, 100) sonucu 0, hasarAl(100, 130) sonucu 0, hasarAl(100, 0) sonucu 100 olmalı.
  4. İş bitince iz satırını sil.
İpucu 1

Fonksiyonun ilk satırına, gelen iki değeri etiketleriyle yazdıran bir console.log ekle ve çalıştır. Fonksiyona gelen can kaç?

İpucu 2

console.log("hp:", hp, "hasar:", hasar) satırı hp: 30 hasar: 100 yazar: değerler ters gelmiş. Fonksiyon önce hp, sonra hasar bekliyor; çağrıda ise önce baltaHasari verilmiş. Argümanların sırası, parametrelerin sırasıyla aynı olmalı.

İpucu 3

Eksiye düşmeyi if (kalan < 0) ile yakala ve içine return 0 yaz. Erken return'ü Ders 6'da görmüştün.

Çözümü göster
gorev1.js
function hasarAl(hp, hasar) {    const kalan = hp - hasar    if (kalan < 0) {        return 0    }    return kalan} const garenCan = 100const baltaHasari = 30console.log("Kalan can:", hasarAl(garenCan, baltaHasari))console.log("Tam öldüren vuruş:", hasarAl(100, 100))console.log("Fazla hasar:", hasarAl(100, 130))console.log("Hasarsız vuruş:", hasarAl(100, 0))
Çıktı
Kalan can: 70Tam öldüren vuruş: 0Fazla hasar: 0Hasarsız vuruş: 100

Hata fonksiyonun içinde değil, çağrıdaydı. Etiket olmasaydı 30 100 satırında hangisinin can olduğunu çıkarmak zorlaşırdı. Sınır denemeleri tam sınırı (100, 100), sınırın ötesini (100, 130) ve hiç hasar almamayı (100, 0) denetler.

Görev 2

Değişikliğini yama notu gibi oku

Görev 1'deki düzeltmeni commit'le, ama önce Git'e sor:

  1. git status ile hangi dosyanın değiştiğine bak.
  2. git diff ile değişikliği oku. İz satırını silmeyi unuttuysan burada görürsün; sil ve diff'e yeniden bak.
  3. Ne yaptığını anlatan bir mesajla commit'le. düzelttim olmaz.
  4. git log --oneline -3 ile son üç kaydı gör (-3 "son üç" demek).
İpucu 1

git diff'te başında - olan satır eski hâl, + olan yeni hâl. Başında + olan satırlardan birinde console.log("hp:" görüyorsan iz satırı hâlâ dosyada.

İpucu 2

Mesaj, diff'e bakmadan ne yapıldığını söylemeli: neyi düzelttin, neyi ekledin? Bu görevde iki şey var: çağrıdaki argüman sırası ve canın 0'da durması.

Çözümü göster
Terminal
PS C:\kod\ogren> git statusOn branch mainYour branch is ahead of 'origin/main' by 1 commit.  (use "git push" to publish your local commits) Changes not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git restore <file>..." to discard changes in working directory)        modified:   gorev1.js no changes added to commit (use "git add" and/or "git commit -a")PS C:\kod\ogren> git diffdiff --git a/gorev1.js b/gorev1.jsindex 271f8ce..eb5309f 100644--- a/gorev1.js+++ b/gorev1.js@@ -1,8 +1,14 @@ function hasarAl(hp, hasar) {     const kalan = hp - hasar+    if (kalan < 0) {+        return 0+    }     return kalan }  const garenCan = 100 const baltaHasari = 30-console.log("Kalan can:", hasarAl(baltaHasari, garenCan))+console.log("Kalan can:", hasarAl(garenCan, baltaHasari))+console.log("Tam öldüren vuruş:", hasarAl(100, 100))+console.log("Fazla hasar:", hasarAl(100, 130))+console.log("Hasarsız vuruş:", hasarAl(100, 0))PS C:\kod\ogren> git add .PS C:\kod\ogren> git commit -m "hasarAl: argüman sırasını düzelt, canı 0'da durdur"[main cd5e279] hasarAl: argüman sırasını düzelt, canı 0'da durdur 1 file changed, 7 insertions(+), 1 deletion(-)PS C:\kod\ogren> git log --oneline -3cd5e279 (HEAD -> main) hasarAl: argüman sırasını düzelt, canı 0'da durdur4a71e9c Görev 1: hasarAl (hatalı hâli)f52a1f8 (origin/main) README ekle

ahead of 'origin/main' by 1 commit: Görev 1'in commit'i henüz GitHub'a gitmedi; log'daki (origin/main) da GitHub'daki kopyanın hangi kayıtta kaldığını gösteriyor. Hepsini dersin sonunda göndereceksin. Senin diff'in, düzeltmeyi nasıl yazdığına göre biraz farklı olabilir.

Görev 3

Faiz neden eksik?

TFT'de tur başına her 10 altın için 1 faiz alırsın, ama en fazla 5. gorev3.js'e şu programı yaz ve çalıştır:

gorev3.js
function faizHesapla(altin) {    let faiz = 0    let kalan = altin    while (kalan > 10) {        kalan = kalan - 10        faiz++    }    if (faiz > 5) {        faiz = 5    }    return faiz} console.log("0 altın:", faizHesapla(0))console.log("9 altın:", faizHesapla(9))console.log("10 altın:", faizHesapla(10))console.log("25 altın:", faizHesapla(25))console.log("50 altın:", faizHesapla(50))console.log("73 altın:", faizHesapla(73))
Çıktı
0 altın: 09 altın: 010 altın: 025 altın: 250 altın: 473 altın: 5

Bazı satırlar doğru, bazıları yanlış. Doğru çıktı şu olmalı:

Metin
0 altın: 09 altın: 010 altın: 125 altın: 250 altın: 573 altın: 5

Hatayı console.log eklemeden, VS Code'un hata ayıklayıcısıyla bul ve düzelt.

İpucu 1

Yanlış çıkanlar 10 ve 50: ikisi de 10'un tam katı. Hatayı küçült: öbür console.log satırlarının başına // koy, yalnızca faizHesapla(10) kalsın.

İpucu 2

4. satıra (while) kırma noktası koy ve F5 ile başlat. Variables'da kalan kaç? F10'a bas: sarı şerit döngünün içine (5. satır) mi giriyor, 8. satıra mı atlıyor?

İpucu 3

Ördeğe anlat: "kalan 10. 10, 10'dan büyük mü? Hayır, döngüye girmiyor, faiz 0 kalıyor." Ama 10 altın 1 faiz etmeliydi. Koşul "büyük ya da eşit" olmalı.

Çözümü göster
gorev3.js
function faizHesapla(altin) {    let faiz = 0    let kalan = altin    while (kalan >= 10) {        kalan = kalan - 10        faiz++    }    if (faiz > 5) {        faiz = 5    }    return faiz} console.log("0 altın:", faizHesapla(0))console.log("9 altın:", faizHesapla(9))console.log("10 altın:", faizHesapla(10))console.log("25 altın:", faizHesapla(25))console.log("50 altın:", faizHesapla(50))console.log("73 altın:", faizHesapla(73))
Çıktı
0 altın: 09 altın: 010 altın: 125 altın: 250 altın: 573 altın: 5

Hata bir sınır hatasıydı: > ile >= arasındaki fark yalnızca kalan tam 10 olduğunda ortaya çıkar; bu yüzden 25 ve 73 doğru, 10 ve 50 yanlıştı. Hata ayıklayıcıda 10 altınla 4. satırda durunca kalan: 10 ve faiz: 0 görürsün; F10'a basınca sarı şerit döngüye girmeden 8. satıra atlar. Düzeltmeden sonra 9 (sınırın hemen altı), 10 (tam sınır), 50 (5 faizin sınırı) ve 73 (sınırın üstü) doğru.

Görev 4

Gizli dosyalar

C:\kod\ogren klasöründe üç dosya oluştur: gizli.txt (içine gerçek değil, uydurma bir şifre yaz), hata.log ve ikinci.log (içerikleri önemsiz). Sonra:

  1. .gitignore'a satır ekleyerek üçünü de Git'ten gizle. .log dosyalarını tek satırla yakala, adlarını tek tek yazma.
  2. git status ile denetle: üç dosya listede olmamalı, .gitignore değişmiş görünmeli. gorev3.js de görünüyorsa normal; onu dersin sonunda kaydedeceksin.
  3. Yalnızca .gitignore'u anlamlı bir mesajla commit'le.
İpucu 1

* "ne olursa olsun" demek: *.log sonu .log ile biten her dosyayı kapsar.

İpucu 2

git add . yazarsan gorev3.js de bu commit'e girer. Yalnızca tek dosyayı hazırlamak için git add .gitignore yaz.

Çözümü göster
.gitignore
notlar.txtgizli.txt*.log
Terminal
PS C:\kod\ogren> git statusOn branch mainYour branch is ahead of 'origin/main' by 2 commits.  (use "git push" to publish your local commits) Changes not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git restore <file>..." to discard changes in working directory)        modified:   .gitignore Untracked files:  (use "git add <file>..." to include in what will be committed)        gorev3.js no changes added to commit (use "git add" and/or "git commit -a")PS C:\kod\ogren> git add .gitignorePS C:\kod\ogren> git commit -m "gizli.txt ve .log dosyalarını Git dışında tut"[main de99988] gizli.txt ve .log dosyalarını Git dışında tut 1 file changed, 2 insertions(+)

gizli.txt, hata.log ve ikinci.log listede yok. Sınır denemesi: *.log satırından sonra yeni bir .log dosyası oluştursan da git status'ta görünmez; kural sonradan gelen dosyalar için de geçerli.

Görev 5

Takım savaşını portföyüne koy

Ders 6'da C:\kod\takim-savasi klasöründe yazdığın takım savaşını kendi GitHub deposuna koy: takim-savasi. Bu klasörde Git Ders 6'dan beri açık, yani git init gerekmez. VS Code'da File → Open Folder ile klasörü aç; terminal de orada açılır.

Ders 6'dan kalan deneme.js ya da görev kopyaları (kritik.js gibi) o dersin commit'ine girdiyse onlar da GitHub'a gider. Sorun değil; README'de ne olduklarını bir satırla yazabilirsin.

Önce projeye bir README.md yaz. İçinde en az şunlar olsun:

  • # ile bir başlık ve projenin ne yaptığını anlatan bir paragraf,
  • ## Nasıl çalıştırılır? başlığı altında, kod bloğu içinde çalıştırma komutu,
  • programının gerçek çıktısından birkaç satır (kod bloğunda),
  • ## Neler öğrendim? başlığı altında en az üç maddelik liste,
  • bu kursa bir bağlantı.

Sonra README'yi commit'le, GitHub'da takim-savasi adında boş bir depo aç ve projeyi gönder.

İpucu 1

Çıktı için node savas.js çalıştır ve birkaç satırı README'deki kod bloğuna kopyala. ogren README'sini örnek al, içeriği projene göre yaz; Ctrl+Shift+V ile önizle.

İpucu 2

GitHub'da depoyu README eklemeden aç. README'yi git add README.md ve git commit ile kaydet, sonra bildiğin üç komut: git remote add origin …, git branch -M main, git push -u origin main. Adresin sonu bu sefer takim-savasi.git.

İpucu 3

Push hata verirse Sık hatalar bölümüne bak. En olası sebepler: dal adı hâlâ master (src refspec), depo README ile açılmış (rejected) ya da -u origin main unutulmuş (no upstream branch).

Çözümü göster

README için bir örnek:

README.md
# Takım Savaşı İki takımın tur tur savaştığı bir terminal simülasyonu. Her saldırının hasarı rastgele; canı biten şampiyon savaş dışı kalır, ayakta şampiyonu kalan son takım kazanır. ## Nasıl çalıştırılır? Bilgisayarında [Node.js](https://nodejs.org) kurulu olmalı. Proje klasöründe bir terminal aç: ```node savas.js``` ## Örnek çıktı ```Mavi: Garen 120, Lux 80, Jinx 70Kırmızı: Darius 150, Annie 85, Teemo 70--- 1. tur ---Garen -> Darius: 21 hasar, kalan can 129Lux -> Darius: 29 hasar, kalan can 100...--- Maç 6 turda bitti ---Kazanan: Mavi takım``` ## Neler öğrendim? - Dizi içinde objelerle takım tutmak- `return` ile sonuç döndüren fonksiyonlar yazmak- `Math.random` ile rastgele hasar üretmek- Hatayı hata ayıklayıcıyla adım adım bulmak Bu projeyi [Yazılım Öğrenme](https://xdd.baby/ders) kursunda yazdım.

Örnek çıktı bölümündeki satırlar Ders 6'daki bir maçtan; sen kendi programının çıktısını koy. Komutlar ve çıktıları şuna benzer (kimlikler ve sayılar sende farklı olur):

Terminal
PS C:\kod\takim-savasi> git statusOn branch masterUntracked files:  (use "git add <file>..." to include in what will be committed)        README.md nothing added to commit but untracked files present (use "git add" to track)PS C:\kod\takim-savasi> git add README.mdPS C:\kod\takim-savasi> git commit -m "README ekle"[master c77877a] README ekle 1 file changed, 33 insertions(+) create mode 100644 README.mdPS C:\kod\takim-savasi> git remote add origin https://github.com/denizyilmaz/takim-savasi.gitPS C:\kod\takim-savasi> git branch -M mainPS C:\kod\takim-savasi> git push -u origin mainEnumerating objects: 6, done.Counting objects: 100% (6/6), done.Delta compression using up to 12 threadsCompressing objects: 100% (5/5), done.Writing objects: 100% (6/6), 1.84 KiB | 1.84 MiB/s, done.Total 6 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)To https://github.com/denizyilmaz/takim-savasi.git * [new branch]      main -> mainbranch 'main' set up to track 'origin/main'.

Son denetim: depo herkese açıksa (Public) tarayıcıda gizli pencere aç (Ctrl+Shift+N) ve github.com/kullaniciadin/takim-savasi adresine git. Giriş yapmamış biri README'yi görüyor mu, bağlantılar çalışıyor mu, kod blokları kutuda mı?

Kendini sına

Soru 1

İz çıktısını oku: takımda Ahri (300 altın), Garen (450) ve Jinx (200) var ve program altınları topluyor. Hangi şampiyon toplama girmiyor, döngünün neresi şüpheli?

Çıktı
i: 0 Ahrii: 1 GarenToplam altın: 750
Cevabı göster

Jinx: iz yalnızca i: 0 ve i: 1 için yazılmış, döngü son elemana hiç gelmemiş. Başlangıç doğru (i: 0), sorun koşulda. Muhtemelen i < takim.length - 1 gibi bir koşul var; doğrusu i < takim.length.

Soru 2

Kırma noktasında durdun. Sarı şerit toplam = toplam + liste[i].hasar satırında, Variables'da toplam: 90 yazıyor. Bu 90, sarı satır çalıştıktan sonraki değer mi?

Cevabı göster

Hayır. Sarı satır henüz çalışmadı; program onun önünde bekliyor. 90 önceki turların toplamıdır. F10'a basınca satır çalışır ve toplam artar.

Soru 3

Program 16. satırda, const sonuc = toplamHasar(takim) satırında duruyor. F10'a basarsan sarı şerit nereye gider? F11'e basarsan?

Cevabı göster

F10 (Step Over) fonksiyonu tek seferde çalıştırır ve 17. satırda durur; Variables'da sonuc dolmuştur. F11 (Step Into) fonksiyonun içine girer ve toplamHasar'ın ilk satırında (let toplam = 0) durur.

Soru 4

Bu git status çıktısından sonra git commit -m "…" yazarsan commit'e hangi dosya(lar) girer?

Terminal — PowerShell
PS C:\kod\ogren> git statusOn branch mainYour branch is up to date with 'origin/main'. Changes to be committed:  (use "git restore --staged <file>..." to unstage)        new file:   gorev.js Changes not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git restore <file>..." to discard changes in working directory)        modified:   README.md Untracked files:  (use "git add <file>..." to include in what will be committed)        deneme2.js
Cevabı göster

Yalnızca gorev.js. Commit'e yalnızca Changes to be committed altındakiler, yani git add ile hazırlananlar girer. README.md değişti ama hazırlanmadı; deneme2.js'i Git hiç tanımıyor. Hepsi için önce git add . yazarsın.

Soru 5

Bu diff ne anlatıyor?

Terminal — PowerShell
PS C:\kod\ogren> git diffdiff --git a/ders7.js b/ders7.jsindex 7be3ff7..5551648 100644--- a/ders7.js+++ b/ders7.js@@ -10,7 +10,7 @@ const takim = [     { isim: "Ahri", hasar: 120 },     { isim: "Garen", hasar: 90 },     { isim: "Jinx", hasar: 150 },-    { isim: "Lux", hasar: 110 }+    { isim: "Lux", hasar: 130 } ]  const sonuc = toplamHasar(takim)
Cevabı göster

ders7.js'te Lux'un hasarı 110'dan 130'a değiştirilmiş: - ile başlayan satır eski hâl, + ile başlayan yeni hâl. Öbür satırlar değişmedi, yalnızca yeri göstermek için bağlam olarak duruyor. Değişiklik henüz hazırlanmadı, commit'lenmedi de: git diff yalnızca git add ile hazırlanmamış değişiklikleri gösterir.

Soru 6

GitHub'da ogren deposunu açarken README eklemeyi neden kapalı bıraktık?

Cevabı göster

Bilgisayarındaki depoda Ders 1'den beri bir geçmiş var. GitHub README eklerse uzak depoda senin bilgisayarında olmayan bir commit oluşur ve git push reddedilir (! [rejected] … (fetch first)): Git o commit'i silmemek için gönderimi durdurur. Boş depoya push sorunsuz gider.

Soru 7

İki iş: (1) ders7.js, notlar.txt, README.md ve sifrem.txt dosyalarından hangileri .gitignore'a yazılır? (2) Hangi commit mesajı daha iyi: gorev3.js güncellendi mi, Faiz hesabında 10'un katlarını düzelt mi?

Cevabı göster

(1) notlar.txt ve sifrem.txt: kişisel notlar ve şifreler başkalarına gitmemeli. ders7.js ve README.md projenin parçası. Dosyayı commit'lemeden önce .gitignore'a yazmayı unutma.

(2) İkincisi: diff'e bakmadan neyin değiştiğini söylüyor. İlki yalnızca dosya adını veriyor, onu Git zaten biliyor.

Kayıt noktası

Görevlerde attığın commit'ler henüz yalnızca bilgisayarında. Görev 3'ün dosyasını da ekleyip hepsini GitHub'a gönder:

Bir sonraki ders Blok 1'in tekrarı: şimdiye kadar öğrendiğin her şeyi bağlayan sorular, hata bulma alıştırmaları ve kimseden yardım almadan yazacağın üç küçük programla bir mini sınav.

İşaret yalnızca bu tarayıcıda saklanır, kimseye gönderilmez.