← Kursa Dön
📄 Text · 30 min

Remote Nedir?

Giriş: Neden Remote Öğreniyoruz?

Şu ana kadar her şeyi kendi bilgisayarında yaptın. Commit'ledin, branch açtın, merge ettin — hepsi yerel. Ama yazılım geliştirme bir ekip işi. Kodunu paylaşmak, başkalarının kodunu almak, birlikte çalışmak istiyorsun.

İşte remote (uzak depo) burada devreye giriyor. Remote, Git repository'sinin internetteki kopyası. GitHub, GitLab, Bitbucket — bunlar remote depoların barındığı yerler.

Bu derste öğreneceğin kavramlar:

  • Remote nedir ve nasıl çalışır?

  • origin ve upstream ne demek?

  • Remote tracking branch'ler nedir?

  • fetch vs pull — aradaki fark nedir?


🎬 Analoji: Yerel Kütüphane ve Merkez Kütüphane

Evinde bir kitaplığın var (yerel repo). Şehrin merkezinde bir de büyük kütüphane var (remote repo — GitHub).

  • Evdeki kitaplık → senin yerel repon. İstediğin gibi düzenle, kitap ekle, çıkar.

  • Merkez kütüphane → remote repo. Herkes oradan kitap alır ve oraya kitap bırakır.

  • Kitapları kütüphaneye götürmekgit push — senin değişikliklerini paylaşmak

  • Kütüphaneden yeni kitaplar almakgit pull veya git fetch — başkalarının değişikliklerini almak

Önemli nokta: Evdeki kitaplığın bağımsız bir kopya. Kütüphane kapansa bile senin kitapların duruyor. Ama paylaşım için kütüphane gerekli.


Remote Kavramı

Remote = URL Takma Adı

Bir remote, basitçe bir URL'ye verilen takma ad:

# Remote ekle
$ git remote add origin https://github.com/tolgahan/web-projem.git

# Ne oldu?
$ git remote -v
origin  https://github.com/tolgahan/web-projem.git (fetch)
origin  https://github.com/tolgahan/web-projem.git (push)

origin = https://github.com/tolgahan/web-projem.git URL'sinin kısa adı.

Her seferinde URL yazmak yerine origin demen yeterli.

origin: Varsayılan İsim

origin özel bir kelime değil — sadece bir konvansiyon. Herkes ilk remote'a origin der. İstersen benim-github da diyebilirsin:

$ git remote add benim-github https://github.com/tolgahan/proje.git

Ama origin kullan — herkes bunu bekler.

Birden Fazla Remote

Bir repo'nun birden fazla remote'u olabilir:

$ git remote add origin https://github.com/tolgahan/proje.git
$ git remote add upstream https://github.com/asil-proje/proje.git
$ git remote add backup https://gitlab.com/tolgahan/proje.git

$ git remote -v
backup    https://gitlab.com/tolgahan/proje.git (fetch)
backup    https://gitlab.com/tolgahan/proje.git (push)
origin    https://github.com/tolgahan/proje.git (fetch)
origin    https://github.com/tolgahan/proje.git (push)
upstream  https://github.com/asil-proje/proje.git (fetch)
upstream  https://github.com/asil-proje/proje.git (push)

Ne zaman birden fazla remote olur?

  • origin: Senin fork'un (GitHub'daki kopyan)

  • upstream: Asıl proje (fork'ladığın kaynak)

  • backup: Yedek sunucu (GitLab, Bitbucket)

┌──────────────────┐     ┌──────────────────┐
│    upstream       │     │     origin       │
│ (asıl proje)     │     │  (senin fork'un) │
│ github.com/      │     │  github.com/     │
│ asil-proje/repo  │     │  tolgahan/repo   │
└────────┬─────────┘     └────────┬─────────┘
         │                        │
         │    ┌───────────┐       │
         └───►│ Yerel     │◄──────┘
              │ Repo      │
              │ (senin PC)│
              └───────────┘
              
upstream: okuma (fetch/pull)
origin: okuma + yazma (fetch/pull/push)

Remote Yönetimi

Remote Komutları

# Remote listesi
$ git remote
origin
upstream

# Detaylı liste (URL'lerle)
$ git remote -v

# Remote ekle
$ git remote add <isim> <url>

# Remote sil
$ git remote remove backup
# veya
$ git remote rm backup

# Remote URL'sini değiştir
$ git remote set-url origin git@github.com:tolgahan/yeni-proje.git

# Remote hakkında bilgi
$ git remote show origin
* remote origin
  Fetch URL: https://github.com/tolgahan/proje.git
  Push  URL: https://github.com/tolgahan/proje.git
  HEAD branch: main
  Remote branches:
    develop        tracked
    feature/login  tracked
    main           tracked
  Local branch configured for 'git pull':
    main merges with remote main
  Local ref configured for 'git push':
    main pushes to main (up to date)

# Remote'u yeniden adlandır
$ git remote rename origin github

Remote Tracking Branches

Bu kavram biraz karmaşık ama çok önemli. Remote tracking branch'ler, remote'taki branch'lerin yerel kopyaları (bookmark'ları):

# Remote branch'leri gör
$ git branch -r
  origin/main
  origin/develop
  origin/feature/login

# Tüm branch'ler (yerel + remote tracking)
$ git branch -a
  develop
* main
  remotes/origin/develop
  remotes/origin/feature/login
  remotes/origin/main

Remote Tracking Branch Nedir?

┌────────────────────────────────────────────────────────────┐
│                 SENİN BİLGİSAYARIN                         │
│                                                            │
│  Yerel Branch'ler:          Remote Tracking Branch'ler:    │
│  ┌──────────┐               ┌──────────────────┐          │
│  │   main   │───takip eder──│  origin/main     │          │
│  └──────────┘               └──────────────────┘          │
│  ┌──────────┐               ┌──────────────────┐          │
│  │ develop  │───takip eder──│  origin/develop  │          │
│  └──────────┘               └──────────────────┘          │
│                                                            │
│  origin/main, GitHub'daki main'in                         │
│  EN SON BİLİNEN durumunu temsil eder.                     │
│  fetch/pull ile güncellenir.                              │
└────────────────────────────────────────────────────────────┘

Önemli: origin/main seninle GitHub arasındaki son senkronizasyondaki durumu gösterir. GitHub'da birisi commit push'larsa, senin origin/main'in otomatik güncellenmez — git fetch yapman gerekir.

# origin/main ne durumda?
$ git log --oneline origin/main
d4e5f6g feat: Login eklendi
a1b2c3d feat: Proje başlatıldı

# Yerel main ile origin/main arasındaki fark
$ git log --oneline main..origin/main
# (origin'de olup sende olmayan commit'ler)

$ git log --oneline origin/main..main
# (sende olup origin'de olmayan commit'ler)

fetch vs pull: Kritik Fark

Bu, Git'in en çok karıştırılan konularından biri. İkisi de remote'tan veri çeker ama farklı şekilde:

git fetch: "Bilgiyi Al, Dokunma"

$ git fetch origin

Fetch ne yapar:

  1. Remote'taki tüm yeni commit'leri indir

  2. Remote tracking branch'leri güncelle (origin/main, origin/develop, vs.)

  3. Senin yerel branch'lerine DOKUNMA

ÖNCESI:
Yerel:    [A] ← [B] ← [C]     main
GitHub:   [A] ← [B] ← [C] ← [D] ← [E]     main

$ git fetch origin

SONRASI:
Yerel:    [A] ← [B] ← [C]     main (DEĞİŞMEDİ!)
          [A] ← [B] ← [C] ← [D] ← [E]     origin/main (GÜNCELLENDİ)

Yeni commit'ler indirildi ama senin main branch'in hâlâ C'de.

Fetch güvenlidir — hiçbir şeyi bozmaz. Sadece "bak, uzakta neler olmuş" der.

# Fetch sonrası farkları gör
$ git fetch origin
$ git log --oneline main..origin/main
e6f7g8h feat: Yeni dashboard
d5e6f7g fix: Navigation bug

# İstersen merge et
$ git merge origin/main
# Veya rebase et
$ git rebase origin/main

git pull: "Bilgiyi Al ve Birleştir"

$ git pull origin main

Pull = fetch + merge (veya fetch + rebase):

$ git pull origin main

# Bu komut şunları yapar:
$ git fetch origin          # 1. Yeni commit'leri indir
$ git merge origin/main     # 2. Yerel branch'le birleştir
ÖNCESI:
Yerel:    [A] ← [B] ← [C]     main
GitHub:   [A] ← [B] ← [C] ← [D] ← [E]     main

$ git pull origin main

SONRASI (fast-forward):
Yerel:    [A] ← [B] ← [C] ← [D] ← [E]     main
                                              origin/main

Eğer yerel branch'te de commit'ler varsa:

ÖNCESI:
Yerel:    [A] ← [B] ← [C] ← [F]     main
GitHub:   [A] ← [B] ← [C] ← [D] ← [E]     main

$ git pull origin main

SONRASI (3-way merge):
                  [F]──────┐
                 /          \
Yerel:  [A]←[B]←[C]         [M]     main
                 \          /
                  [D]←[E]──┘
                              origin/main

fetch vs pull Karşılaştırma

┌──────────────────┬──────────────────┬──────────────────┐
│                  │    git fetch     │    git pull       │
├──────────────────┼──────────────────┼──────────────────┤
│ Ne indirir?      │ Yeni commit'ler  │ Yeni commit'ler  │
│ Yerel branch'e   │ ❌ Dokunmaz     │ ✅ Merge eder    │
│ dokunur mu?      │                  │                  │
│ Güvenli mi?      │ ✅ Tamamen      │ ⚠️ Conflict      │
│                  │ güvenli         │ olabilir          │
│ Ne zaman?        │ Önce bakayım    │ Güncellemek       │
│                  │ ne var          │ istiyorum         │
│ Denk gelen       │ Sadece download │ Download +        │
│                  │                  │ merge/rebase      │
└──────────────────┴──────────────────┴──────────────────┘

pull --rebase: Temiz Geçmiş

# Normal pull: merge commit oluşturabilir
$ git pull origin main

# Rebase ile pull: merge commit oluşturmaz, temiz geçmiş
$ git pull --rebase origin main
Normal pull (merge):
         [F]──────┐
        /          \
[A]←[B]←[C]        [M]     ← merge commit (gürültülü)
        \          /
         [D]←[E]──┘

Pull --rebase:
[A]←[B]←[C]←[D]←[E]←[F']     ← temiz, düz çizgi
                                  F' = F'nin rebase edilmiş hali

💡 İpucu: git config --global pull.rebase true ayarını yaparsan, her git pull otomatik olarak rebase ile çalışır. Çoğu ekip bunu tercih eder çünkü gereksiz merge commit'leri oluşmaz.


Pratik: Remote ile İlk Çalışma

Senaryo 1: Yerel Projeyi GitHub'a Gönderme

# 1. Yerel repo oluştur
$ mkdir projem && cd projem && git init
$ echo "# Projem" > README.md
$ git add . && git commit -m "feat: Proje başlatıldı"

# 2. GitHub'da boş repo oluştur (browser'da)
# → github.com → New Repository → "projem" → Create
# ❌ "Initialize with README" seçme! (boş olsun)

# 3. Remote ekle ve push et
$ git remote add origin https://github.com/tolgahan/projem.git
$ git branch -M main
$ git push -u origin main

Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 220 bytes | 220.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/tolgahan/projem.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

-u (veya --set-upstream): Yerel main'i origin/main'e bağlar. Bundan sonra sadece git push ve git pull yazman yeterli — her seferinde origin main belirtmene gerek kalmaz.

Senaryo 2: GitHub'daki Projeyi İndirme (Clone)

$ git clone https://github.com/tolgahan/projem.git
Cloning into 'projem'...
remote: Enumerating objects: 45, done.
remote: Counting objects: 100% (45/45), done.
remote: Compressing objects: 100% (30/30), done.
Receiving objects: 100% (45/45), 12.50 KiB | 3.12 MiB/s, done.

$ cd projem
$ git remote -v
origin  https://github.com/tolgahan/projem.git (fetch)
origin  https://github.com/tolgahan/projem.git (push)

# origin otomatik ayarlandı!

Remote Branch'lerle Çalışma

Uzak Branch'i Yerel Olarak Takip Etme

# Remote'taki branch'leri gör
$ git fetch origin
$ git branch -r
  origin/main
  origin/develop
  origin/feature/login

# Remote branch'i yerel olarak takip et
$ git switch -c feature/login origin/feature/login
Branch 'feature/login' set up to track remote branch 'feature/login' from 'origin'.

# veya kısaca (Git otomatik eşleştirir)
$ git switch feature/login
Branch 'feature/login' set up to track 'origin/feature/login'.

Tracking Durumunu Görme

$ git branch -vv
  develop        a1b2c3d [origin/develop] feat: Develop başlatıldı
  feature/login  d4e5f6g [origin/feature/login: ahead 2] Login WIP
* main           h7i8j9k [origin/main] feat: Proje başlatıldı

Buradaki bilgiler:

  • [origin/main] — bu yerel branch, origin/main'i takip ediyor

  • ahead 2 — yerel branch, remote'tan 2 commit ilerde (push'lanmamış)

  • behind 3 — remote, yerel branch'ten 3 commit ilerde (pull gerekli)

  • ahead 1, behind 2 — ikisi de farklı commit'ler yapmış (pull + push gerekli)

⚠️ Dikkat: git branch -vv bilgisi son fetch zamanındaki durumu gösterir. Gerçek zamanlı değil. Güncel bilgi için önce git fetch origin yap.


Prune: Silinen Remote Branch'leri Temizle

Bir remote branch silindiğinde, senin origin/xyz tracking branch'in otomatik silinmez:

# Remote'ta artık olmayan branch'leri temizle
$ git fetch --prune origin
# veya kısaca
$ git fetch -p origin

# Sadece hangi branch'lerin silineceğini gör
$ git remote prune origin --dry-run

# Otomatik prune ayarla
$ git config --global fetch.prune true

Büyük Resim: Veri Akışı

┌──────────────────────────────────────────────────────────────────┐
│                                                                  │
│  ┌─────────────┐     push      ┌──────────────────┐            │
│  │   Yerel     │──────────────►│    Remote         │            │
│  │   Repo      │               │    (GitHub)       │            │
│  │             │◄──────────────│                    │            │
│  │             │   fetch/pull  │                    │            │
│  └─────────────┘               └──────────────────┘            │
│         │                              │                        │
│   ┌─────┴──────────┐           ┌──────┴──────────┐            │
│   │ Yerel Branch'ler│           │ Remote Branch'ler│            │
│   │                │           │                  │            │
│   │ main           │           │ main             │            │
│   │ develop        │           │ develop          │            │
│   │ feature/x      │           │ feature/x        │            │
│   └────────────────┘           └─────────────────┘            │
│         │                                                      │
│   ┌─────┴──────────────────┐                                   │
│   │ Remote Tracking         │                                   │
│   │                         │                                   │
│   │ origin/main             │  ← fetch ile güncellenir         │
│   │ origin/develop          │  ← yerel branch ile farklı       │
│   │ origin/feature/x        │    olabilir                      │
│   └─────────────────────────┘                                   │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

Özet

  • Remote, bir Git repository'sinin uzaktaki (genelde internet) kopyasıdır — URL'ye verilen takma adla (origin) erişilir

  • origin, git clone ile kopyalanan orijinal repo'nun varsayılan adıdır; upstream genelde fork'ladığın asıl projeye verilir

  • Remote tracking branch (origin/main), remote'taki branch'in yerel kopyasıdır — git fetch ile güncellenir

  • `git fetch` remote'taki yeni commit'leri indirir ama yerel branch'lere dokunmaz — güvenlidir

  • `git pull` = fetch + merge; yerel branch'i günceller — conflict çıkabilir

  • git pull --rebase ile temiz, düz bir geçmiş elde edilir — gereksiz merge commit'lerini önler


*Bir sonraki derste push ve pull işlemlerini derinlemesine — force push, --set-upstream, conflict çözümü — öğreneceğiz!*