İ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:
Bir defter al →
git init(repo oluştur)Gün boyunca notlar al → dosyalarda değişiklik yap
Akşam günlüğe yaz →
git add+git commit(kaydet)"Bugün ne yaptım?" diye bak →
git statusEski günleri oku →
git 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 refsBu 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 initkomutu mevcut dosyaları silmez veya değiştirmez. Zaten dosyaları olan bir klasörde de çalıştırabilirsin. Sadece.gitklasö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.cssAdı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:
mainbranch'indesinNo 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 statusen çok kullanacağın komutlardan biri. Her komuttan önce ve sonra çalıştır — ne olduğunu anlamak için. "Şüphe duyduğundagit 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.cssSadece 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çindekilerStaging'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.jsapp.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.cssBu çı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;
}
EOFDurumu 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 -asadece zaten izlenen dosyaları otomatik ekler. Yeni oluşturulan (untracked) dosyaları eklemez! Yeni dosya varsa öncegit addyapman ş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şturulduLog 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'lergit 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 commitAlias olarak tanımlamıştık hatırlarsan:
$ git config --global alias.lg "log --oneline --graph --all --decorate"
$ git lg
# Aynı şeyi kısaca yazAdı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 initile boş bir repository oluşturursun —.gitdizini eklenir, dosyalara dokunulmazgit statusile projenin durumunu kontrol edersin — bu en sık kullanacağın komutgit addile değişiklikleri staging area'ya alırsın — commit'e hazırlarsıngit commit -m "mesaj"ile staging'dekileri kalıcı olarak kaydedersin — projenin fotoğrafını çekersingit logile commit geçmişini incelersin —--onelineve--graphen faydalı bayraklar.gitignoreile 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!*
AI Asistan
Sorularını yanıtlamaya hazır