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ürmek →
git push— senin değişikliklerini paylaşmakKütüphaneden yeni kitaplar almak →
git pullveyagit 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.gitAma 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 githubRemote 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/mainRemote 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 originFetch ne yapar:
Remote'taki tüm yeni commit'leri indir
Remote tracking branch'leri güncelle (
origin/main,origin/develop, vs.)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/maingit pull: "Bilgiyi Al ve Birleştir"
$ git pull origin mainPull = 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/mainEğ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/mainfetch 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 mainNormal 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 trueayarını yaparsan, hergit pullotomatik 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 ediyorahead 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 -vvbilgisi son fetch zamanındaki durumu gösterir. Gerçek zamanlı değil. Güncel bilgi için öncegit fetch originyap.
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 trueBü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şilirorigin,
git cloneile kopyalanan orijinal repo'nun varsayılan adıdır; upstream genelde fork'ladığın asıl projeye verilirRemote tracking branch (
origin/main), remote'taki branch'in yerel kopyasıdır —git fetchile 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 --rebaseile 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!*
AI Asistan
Sorularını yanıtlamaya hazır