← Kursa Dön
📄 Text · 30 min

İlk Repository

Giriş: Neden Pratik Yapıyoruz?

Üç ders boyunca teoriyle beynini yorduk: VCS tarihçesi, yapılandırma, üç alan modeli... Artık yapmak zamanı. Bu derste gerçek bir proje oluşturacak, commit'leyecek ve Git'in günlük akışını deneyimleyeceksin.

Programlama öğrenmek yüzme öğrenmek gibidir — kitaptan okumayla olmaz. Suya girmen lazım.

Bu dersin sonunda şunları bileceksin:

  • Sıfırdan bir repo oluşturmak (git init)

  • Dosyaları izlemeye almak (git add)

  • Commit oluşturmak (git commit)

  • Projenin durumunu sorgulamak (git status)

  • Geçmişi incelemek (git log)

  • Gerçek bir günlük workflow uygulamak


🎬 Analoji: Günlük Tutmak

Git'i bir günlük tutmak gibi düşün:

  1. Bir defter algit init (repo oluştur)

  2. Gün boyunca notlar al → dosyalarda değişiklik yap

  3. Akşam günlüğe yazgit add + git commit (kaydet)

  4. "Bugün ne yaptım?" diye bakgit status

  5. Eski günleri okugit log

Her gün (her commit), o günün özetini ve ne olduğunu yazar. Haftalarca, aylarca sonra geri dönüp bakabilirsin: "Ah, o gün şu değişikliği yapmışım!"


Adım 1: Repository Oluşturma — git init

Her şey burada başlar. Yeni bir proje klasörü oluşturup Git'e "bunu izle" diyoruz:

# Proje klasörü oluştur
$ mkdir web-projem
$ cd web-projem

# Git repository'si başlat
$ git init
Initialized empty Git repository in /home/tolgahan/web-projem/.git/

Ne oldu? Git, .git adlı gizli bir klasör oluşturdu:

$ ls -la
total 12
drwxr-xr-x  3 tolgahan staff   96 Mar  1 10:00 .
drwxr-xr-x  5 tolgahan staff  160 Mar  1 10:00 ..
drwxr-xr-x  9 tolgahan staff  288 Mar  1 10:00 .git

$ ls .git/
HEAD  config  description  hooks  info  objects  refs

Bu kadar. Proje klasörün artık bir Git repository'si. Dosya henüz yok, commit henüz yok ama Git hazır ve bekliyor.

⚠️ Dikkat: git init komutu mevcut dosyaları silmez veya değiştirmez. Zaten dosyaları olan bir klasörde de çalıştırabilirsin. Sadece .git klasörünü ekler. Bu yüzden güvenle kullanabilirsin.

Mevcut Projeyi Git'e Almak

Zaten dosyaların olan bir projen varsa:

$ cd mevcut-projem
$ ls
index.html  style.css  app.js

$ git init
Initialized empty Git repository in /home/tolgahan/mevcut-projem/.git/

# Dosyalar yerinde, .git eklendi
$ git status
On branch main

No commits yet

Untracked files:
        app.js
        index.html
        style.css

Adım 2: Dosya Oluşturma ve Durum Kontrolü — git status

Şimdi projemize dosyalar ekleyelim:

# Ana sayfa oluştur
$ cat > index.html << 'EOF'
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <title>Web Projem</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>Merhaba Dünya!</h1>
    <p>Bu benim ilk Git projemdir.</p>
    <script src="app.js"></script>
</body>
</html>
EOF

# CSS dosyası
$ cat > style.css << 'EOF'
body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 20px;
    background-color: #f5f5f5;
}

h1 {
    color: #333;
}
EOF

# JavaScript dosyası
$ cat > app.js << 'EOF'
console.log("Uygulama başlatıldı");
EOF

Şimdi Git'e soralım: "Durum ne?"

$ git status
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        app.js
        index.html
        style.css

nothing added to commit but untracked files present (use "git add" to track)

git status bize çok şey söylüyor:

  • On branch main: main branch'indesin

  • No commits yet: Henüz hiç commit yok

  • Untracked files: Git bu dosyaları tanımıyor — henüz izleme altına almadık

  • "use git add...": Git sana ne yapman gerektiğini bile söylüyor!

💡 İpucu: git status en çok kullanacağın komutlardan biri. Her komuttan önce ve sonra çalıştır — ne olduğunu anlamak için. "Şüphe duyduğunda git status" mottosu seni çok kurtaracak.

Kısa Status

Daha kompakt bir çıktı istersen:

$ git status -s
?? app.js
?? index.html
?? style.css

?? = untracked. İleride M (modified), A (added), D (deleted) gibi kodlar da göreceksin.


Adım 3: Staging'e Alma — git add

Dosyaları commit'lemeden önce staging area'ya almamız gerekiyor. Sepete koymak gibi:

Tek Dosya Ekleme

$ git add index.html

$ git status
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   index.html

Untracked files:
        app.js
        style.css

Sadece index.html staging'de. Diğerleri hâlâ untracked.

Birden Fazla Dosya Ekleme

# Tek tek ekle
$ git add style.css app.js

# Veya hepsini bir seferde
$ git add .
# Nokta (.) = "bu klasördeki tüm değişiklikleri ekle"
$ git status
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   app.js
        new file:   index.html
        new file:   style.css

Üç dosya da staging'de, commit'e hazır.

git add Varyasyonları

git add dosya.txt          # Tek dosya
git add dosya1.txt dosya2  # Birden fazla dosya
git add .                  # Tüm değişiklikler (bu klasör ve alt)
git add -A                 # Tüm değişiklikler (tüm repo)
git add *.css              # Pattern ile (tüm CSS dosyaları)
git add src/               # Klasör ve içindekiler

Staging'den Çıkarma

Yanlışlıkla eklediğin bir dosyayı staging'den çıkarmak için:

$ git restore --staged app.js

$ git status
Changes to be committed:
        new file:   index.html
        new file:   style.css

Untracked files:
        app.js

app.js staging'den çıktı ama dosya silinmedi — sadece sepetten çıkarıldı.


Adım 4: İlk Commit — git commit

Staging'deki dosyaları kalıcı olarak kaydetmenin zamanı:

# Önce tüm dosyaları staging'e alalım
$ git add .

# Commit oluştur
$ git commit -m "İlk commit: Proje yapısı oluşturuldu"
[main (root-commit) a1b2c3d] İlk commit: Proje yapısı oluşturuldu
 3 files changed, 24 insertions(+)
 create mode 100644 app.js
 create mode 100644 index.html
 create mode 100644 style.css

Bu çıktıyı okuyalım:

  • main — hangi branch'te

  • (root-commit) — ilk commit (parent yok)

  • a1b2c3d — commit hash'inin kısa hali

  • 3 files changed, 24 insertions — 3 dosya eklendi, toplam 24 satır

$ git status
On branch main
nothing to commit, working tree clean

"Clean" — tüm değişiklikler commit'lendi. Temiz bir sayfa.

-m Bayrağı: Commit Mesajı

-m ile tek satırlık mesaj yazarsın. Bu kısa değişiklikler için idealdir:

$ git commit -m "Başlık rengi güncellendi"

Uzun mesaj yazmak istersen, -m olmadan çalıştır:

$ git commit
# Editör açılır (VS Code, Nano, vs.)
# İlk satır: Kısa özet (50 karakter)
# Boş satır
# Detaylı açıklama (72 karakter genişlik)

Editör'de yazacağın mesaj:

Kullanıcı giriş formunu ekle

- Email ve şifre alanları eklendi
- Form validasyonu yapıldı
- Hata mesajları Türkçeleştirildi
- Responsive tasarım uygulandı

💡 İpucu: İyi commit mesajı yazma alışkanlığını şimdiden edin. "fix" veya "update" gibi anlamsız mesajlar yerine, ne yaptığını ve neden yaptığını açıklayan mesajlar yaz. Gelecekteki sen (ve ekip arkadaşların) teşekkür edecek.


Adım 5: Değişiklik Yapma ve Yeni Commit

Projemiz üzerinde çalışmaya devam edelim:

# index.html'e navigasyon ekleyelim
$ cat > index.html << 'EOF'
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <title>Web Projem</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <nav>
        <a href="/">Ana Sayfa</a>
        <a href="/hakkinda">Hakkında</a>
        <a href="/iletisim">İletişim</a>
    </nav>
    <h1>Merhaba Dünya!</h1>
    <p>Bu benim ilk Git projemdir.</p>
    <script src="app.js"></script>
</body>
</html>
EOF

# style.css'e nav stilleri ekleyelim
$ cat >> style.css << 'EOF'

nav {
    background-color: #333;
    padding: 10px;
}

nav a {
    color: white;
    text-decoration: none;
    margin-right: 15px;
}
EOF

Durumu kontrol edelim:

$ git status
On branch main
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:   index.html
        modified:   style.css

no changes added to commit (use "git add" and/or "git commit -a")

İki dosya modified — değişmiş ama staging'e alınmamış.

# Değişiklikleri staging'e al ve commit'le
$ git add .
$ git commit -m "Navigasyon menüsü eklendi"
[main b2c3d4e] Navigasyon menüsü eklendi
 2 files changed, 15 insertions(+), 1 deletion(-)

Kısayol: add + commit Bir Arada

Değiştirilmiş (modified) dosyaları tek komutla staging'e alıp commit'leyebilirsin:

$ git commit -am "Küçük düzeltme yapıldı"

-a = "tüm izlenen (tracked) değişiklikleri otomatik staging'e al" -m = "mesaj"

⚠️ Dikkat: git commit -a sadece zaten izlenen dosyaları otomatik ekler. Yeni oluşturulan (untracked) dosyaları eklemez! Yeni dosya varsa önce git add yapman şart.


Adım 6: Geçmişi İnceleme — git log

Artık birkaç commit'imiz var. Geçmişe bakalım:

$ git log
commit b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1 (HEAD -> main)
Author: Tolgahan Kaya <tolgahan@example.com>
Date:   Mon Mar 1 10:30:00 2026 +0300

    Navigasyon menüsü eklendi

commit a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0 
Author: Tolgahan Kaya <tolgahan@example.com>
Date:   Mon Mar 1 10:00:00 2026 +0300

    İlk commit: Proje yapısı oluşturuldu

Log Varyasyonları

git log çok güçlü bir komut. İşte en faydalı kullanımları:

# Tek satırlık özet
$ git log --oneline
b2c3d4e (HEAD -> main) Navigasyon menüsü eklendi
a1b2c3d İlk commit: Proje yapısı oluşturuldu

# Grafiksel gösterim (branch'lerle birlikte)
$ git log --oneline --graph --all
* b2c3d4e (HEAD -> main) Navigasyon menüsü eklendi
* a1b2c3d İlk commit: Proje yapısı oluşturuldu

# Son N commit
$ git log -2        # Son 2 commit
$ git log -1        # Sadece son commit

# Hangi dosyalar değişmiş
$ git log --stat
commit b2c3d4e (HEAD -> main)
    Navigasyon menüsü eklendi

 index.html | 10 ++++++++--
 style.css  |  7 +++++++
 2 files changed, 15 insertions(+), 2 deletions(-)

# Değişiklikleri satır satır göster
$ git log -p
# Her commit'in diff'ini gösterir (çok detaylı)

# Belirli bir dosyanın geçmişi
$ git log -- index.html
# Sadece index.html'i etkileyen commit'ler

git log --oneline --graph — En Sevdiğin Komut Olacak

Branch'ler öğrendiğinde bu komut bir sanat eserine dönüşür:

$ git log --oneline --graph --all --decorate
* d4e5f6g (HEAD -> main) Footer eklendi
*   c3d4e5f Merge branch 'feature'
|\
| * b2c3d4e Feature tamamlandı
| * a1b2c3d Feature başlatıldı
|/
* 9h8i7j6 İlk commit

Alias olarak tanımlamıştık hatırlarsan:

$ git config --global alias.lg "log --oneline --graph --all --decorate"
$ git lg
# Aynı şeyi kısaca yaz

Adım 7: Pratik Workflow — Gerçek Bir Senaryo

Şimdi öğrendiklerimizi birleştirerek gerçek bir çalışma akışı yapalım. Bir web projesi geliştiriyormuş gibi davranacağız:

# === PROJE BAŞLANGICI ===
$ mkdir portfolio && cd portfolio
$ git init
Initialized empty Git repository in /home/tolgahan/portfolio/.git/

# === DOSYA YAPISI ===
$ mkdir css js images

$ cat > index.html << 'EOF'
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Portfolyom</title>
    <link rel="stylesheet" href="css/style.css">
</head>
<body>
    <header>
        <h1>Tolgahan Kaya</h1>
        <p>Full Stack Developer</p>
    </header>
    <script src="js/main.js"></script>
</body>
</html>
EOF

$ cat > css/style.css << 'EOF'
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: 'Segoe UI', sans-serif;
    line-height: 1.6;
}

header {
    background: linear-gradient(135deg, #667eea, #764ba2);
    color: white;
    text-align: center;
    padding: 100px 20px;
}
EOF

$ cat > js/main.js << 'EOF'
document.addEventListener('DOMContentLoaded', () => {
    console.log('Portfolio yüklendi');
});
EOF

# === İLK COMMIT ===
$ git status
On branch main

No commits yet

Untracked files:
        css/
        index.html
        js/

$ git add .
$ git status
Changes to be committed:
        new file:   css/style.css
        new file:   index.html
        new file:   js/main.js

$ git commit -m "feat: Proje iskelet yapısı oluşturuldu"
[main (root-commit) 1a2b3c4] feat: Proje iskelet yapısı oluşturuldu
 3 files changed, 35 insertions(+)

# === HAKKINDA BÖLÜMÜ ===
$ cat >> index.html << 'EOF'
    <section id="about">
        <h2>Hakkımda</h2>
        <p>5 yıllık deneyime sahip bir yazılım geliştiriciyim.</p>
    </section>
EOF

$ git add index.html
$ git commit -m "feat: Hakkımda bölümü eklendi"
[main 2b3c4d5] feat: Hakkımda bölümü eklendi
 1 file changed, 4 insertions(+)

# === İLETİŞİM BÖLÜMÜ ===
$ cat >> index.html << 'EOF'
    <section id="contact">
        <h2>İletişim</h2>
        <p>Email: tolgahan@example.com</p>
    </section>
EOF

$ cat >> css/style.css << 'EOF'

section {
    padding: 60px 20px;
    max-width: 800px;
    margin: 0 auto;
}

section h2 {
    margin-bottom: 20px;
    color: #333;
}
EOF

$ git add .
$ git commit -m "feat: İletişim bölümü ve section stilleri eklendi"
[main 3c4d5e6] feat: İletişim bölümü ve section stilleri eklendi
 2 files changed, 14 insertions(+)

# === GEÇMİŞİ İNCELE ===
$ git log --oneline
3c4d5e6 (HEAD -> main) feat: İletişim bölümü ve section stilleri eklendi
2b3c4d5 feat: Hakkımda bölümü eklendi
1a2b3c4 feat: Proje iskelet yapısı oluşturuldu

$ git log --stat --oneline
3c4d5e6 (HEAD -> main) feat: İletişim bölümü ve section stilleri eklendi
 css/style.css | 10 ++++++++++
 index.html    |  4 ++++
 2 files changed, 14 insertions(+)
2b3c4d5 feat: Hakkımda bölümü eklendi
 index.html | 4 ++++
 1 file changed, 4 insertions(+)
1a2b3c4 feat: Proje iskelet yapısı oluşturuldu
 css/style.css | 17 +++++++++++++++++
 index.html    | 15 +++++++++++++++
 js/main.js    |  3 +++
 3 files changed, 35 insertions(+)

Adım 8: .gitignore — Neyi İzlememeliyiz?

Her proje dosyasını Git'e koymak istemezsin. Bazı dosyalar izlenmemeli:

# .gitignore dosyası oluştur
$ cat > .gitignore << 'EOF'
# Bağımlılıklar
node_modules/
vendor/

# Ortam değişkenleri
.env
.env.local

# IDE dosyaları
.vscode/
.idea/
*.swp
*.swo

# İşletim sistemi dosyaları
.DS_Store
Thumbs.db

# Build çıktıları
dist/
build/
*.min.js
*.min.css

# Log dosyaları
*.log
npm-debug.log*
EOF

$ git add .gitignore
$ git commit -m "chore: .gitignore dosyası eklendi"
[main 4d5e6f7] chore: .gitignore dosyası eklendi
 1 file changed, 23 insertions(+)

Artık .gitignore'da listelenen dosyalar git status'ta gözükmez ve git add . ile eklenmez.

# Test edelim
$ echo "SECRET_KEY=abc123" > .env
$ mkdir node_modules
$ touch node_modules/package.json

$ git status
On branch main
nothing to commit, working tree clean

# .env ve node_modules gözükmüyor! .gitignore çalışıyor.

Günlük Workflow Özeti

Her gün kullanacağın temel akış:

┌─────────────────────────────────────────────────────┐
│              GÜNLÜk GIT WORKFLOW                    │
│                                                     │
│  1. Çalışmaya başla                                 │
│     $ git status              ← "durumum ne?"      │
│                                                     │
│  2. Dosyalarda değişiklik yap                       │
│     (kodla, test et, düzenle)                       │
│                                                     │
│  3. Ne değiştiğine bak                              │
│     $ git status              ← "ne değiştim?"     │
│     $ git diff                ← "tam olarak ne?"   │
│                                                     │
│  4. Staging'e al                                    │
│     $ git add .               ← "bunları kaydet"   │
│     $ git add dosya.txt       ← "sadece bunu"      │
│                                                     │
│  5. Commit oluştur                                  │
│     $ git commit -m "mesaj"   ← "kalıcı kayıt"    │
│                                                     │
│  6. Geçmişi kontrol et                              │
│     $ git log --oneline       ← "ne yaptım?"       │
│                                                     │
│  7. Tekrarla (2'ye dön)                             │
└─────────────────────────────────────────────────────┘

Ne Sıklıkla Commit Atmalıyım?

  • Çok sık: Her küçük değişiklikte (her 5 dakikada) → geçmiş çok gürültülü olur

  • Çok seyrek: Günde bir kere → geri dönmek zor olur

  • İdeal: Her anlamlı, bağımsız değişiklikte. Bir özellik tamamlandığında, bir bug düzeltildiğinde, bir refactoring yapıldığında.

Basit kural: "Bu commit tek bir şeyi anlatıyor mu?" Evet ise, iyi commit.

⚠️ Dikkat: "WIP" (Work In Progress), "misc", "stuff", "asdf" gibi commit mesajları acemilerin en büyük hatası. Her commit mesajı gelecekte birinin (veya senin) okuması gerektiğini düşünerek yaz.


Bonus: git show — Belirli Bir Commit'i İncele

Belirli bir commit'te ne olduğunu görmek için:

$ git show 2b3c4d5
commit 2b3c4d5...
Author: Tolgahan Kaya <tolgahan@example.com>
Date:   Mon Mar 1 10:15:00 2026 +0300

    feat: Hakkımda bölümü eklendi

diff --git a/index.html b/index.html
--- a/index.html
+++ b/index.html
@@ -13,5 +13,9 @@
     </header>
+    <section id="about">
+        <h2>Hakkımda</h2>
+        <p>5 yıllık deneyime sahip bir yazılım geliştiriciyim.</p>
+    </section>
     <script src="js/main.js"></script>

En son commit'i görmek için:

$ git show HEAD
# veya
$ git show
# (parametre olmadan HEAD'i gösterir)

Özet

  • git init ile boş bir repository oluşturursun — .git dizini eklenir, dosyalara dokunulmaz

  • git status ile projenin durumunu kontrol edersin — bu en sık kullanacağın komut

  • git add ile değişiklikleri staging area'ya alırsın — commit'e hazırlarsın

  • git commit -m "mesaj" ile staging'dekileri kalıcı olarak kaydedersin — projenin fotoğrafını çekersin

  • git log ile commit geçmişini incelersin — --oneline ve --graph en faydalı bayraklar

  • .gitignore ile izlenmemesi gereken dosyaları belirlersin — node_modules, .env, IDE dosyaları


*Tebrikler! İlk repository'ni oluşturdun ve Git'in temel akışını öğrendin. Bir sonraki bölümde dosya takibi, commit anatomisi ve geri alma işlemlerini derinlemesine keşfedeceğiz!*