Git repository: git init ile oluşturma ve remote bağlama
Git repository, proje klasörü ile içindeki gizli .git dizininin birlikte oluşturduğu depodur; tüm commit geçmişini, branch'leri ve ayarları orada tutulur. Yeni bir repository git init ile oluşturulur, hazır bir tane git clone ile alınır. Uzak depo ise git remote add origin adres ile bağlanır.
Git repository, Git'in izlediği bir projedir. Fiziksel olarak sıradan bir klasördür: içinde proje dosyalarınız ve gizli bir .git dizini bulunur. Tüm commit geçmişi, branch'ler, etiketler ve ayarlar bu dizinde tutulur. .git klasörünü silerseniz geriye yalnızca dosyalar kalır ve hiçbir sürümleri kalmaz.
Bir repository nelerden oluşur
Git ile çalışırken değişikliklerin dolaştığı üç alanı aklınızda tutmak faydalıdır:
- çalışma dizini (working tree) — gördüğünüz ve düzenlediğiniz dosyalar;
- index (staging area) — bir sonraki commit'in taslağı; değişiklikler
git addile buraya girer; - geçmiş —
.gitiçindeki commit veritabanı; değişikliklergit commitile buraya yazılır.
Kesin konuşursak repository, .git içeriğinin kendisidir. Çalışma dizini, Git'in geçmişten çıkarıp açtığı tek bir «görünür» sürümdür.
git init ile git repository nasıl oluşturulur
Proje klasörüne gidip tek bir komut çalıştırın:
cd ~/projects/my-app
git init
Initialized empty Git repository in /home/user/projects/my-app/.git/
Repository'yi boş bir klasörde de, içinde dosyalar olan bir klasörde de oluşturabilirsiniz. İkinci durumda hiçbir şey kaybolmaz: mevcut dosyalar izlenmeyen (untracked) olur ve siz git add ile eklemedikçe izlenmez.
Komutun kullanışlı varyantları:
# Klasörü ve içindeki repository'yi birlikte oluştur
git init my-app
# İlk branch'in adını belirle (yoksa master ya da ayarlardaki değer kullanılır)
git init -b main
# Yeni oluşturulan tüm repository'lerde varsayılan branch'i main yap
git config --global init.defaultBranch main
İlk commit
Hiç commit'i olmayan bir repository pek işe yaramaz. git init'ten hemen sonra genellikle şöyle devam edilir:
git config --global user.name "Ali Yılmaz"
git config --global user.email "ali@example.com"
git status
git add .
git commit -m "Başlangıç proje yapısı"
Ad ve e-posta bilgisini bilgisayarınızda bir kez tanımlamanız yeterlidir: her commit'e yazılırlar. Bunlar yoksa Git commit yapmayı reddeder ve kendinizi tanıtmanızı ister.
Hemen bir .gitignore ekleyin
İlk git add . komutundan önce, depoya girmemesi gerekenleri listeleyen bir .gitignore dosyası oluşturun: bağımlılıklar, derleme çıktıları, gizli bilgiler, IDE dosyaları.
node_modules/
dist/
.env
.idea/
.vscode/
*.log
__pycache__/
Dosya bir commit'e zaten girdiyse .gitignore onu kaldırmaz. Dosyayı diskte bırakarak izlemeyi bırakmanız gerekir: git rm --cached .env ve ardından commit.
.git klasörünün içinde ne var
Günlük işte bu klasöre bakmanız gerekmez, ama yapısını bilmek birçok soruyu yanıtlar:
| Öğe | Ne saklar |
|---|---|
objects/ | Sıkıştırılmış nesneler: dosya içerikleri (blob), klasör yapıları (tree) ve commit'ler |
refs/heads/ | Branch'ler — son commit'in hash'ini içeren dosyalar |
refs/tags/ | Etiketler |
HEAD | Mevcut branch'e işaretçi, örneğin ref: refs/heads/main |
config | Bu repository'nin ayarları, remote listesi dahil |
index | Staging area'nın durumu |
hooks/ | Olaylarda (pre-commit, pre-push) çalışan betikler |
Buradan önemli bir sonuç çıkar: Git'te bir branch, içinde tek bir hash bulunan küçük bir dosyadır. Bu yüzden branch oluşturmak anlıktır ve bir maliyeti yoktur.
Bir klasörün repository olup olmadığını nasıl anlarsınız
git status
# ya da daha kesin olarak
git rev-parse --is-inside-work-tree
Bir repository'nin dışında şunu görürsünüz: fatal: not a git repository (or any of the parent directories): .git. «Parent directories» ifadesine dikkat edin: Git, .git'i üst klasörlere doğru arar. Yanlışlıkla ev dizininizde git init çalıştırırsanız, tüm dizin bir repository olur; bu durumda oluşan .git klasörünü silmeniz gerekir.
Yerel ve uzak repository
git init ile oluşturduğunuz repository yalnızca sizin bilgisayarınızda vardır. Kodu paylaşmak ve yedeğe sahip olmak için buna bir uzak depo (remote) bağlanır: GitHub, GitLab, Bitbucket ya da kendi Git sunucunuzda duran bir kopya.
Git açısından uzak depo «ana» depo değildir: her kopya tam teşekküllüdür ve tüm geçmişi içerir. Merkezi olma özelliğini yalnızca ekibin kararı verir.
git remote: uzak depo bağlama
Remote, sunucu adresinin kısa bir adıdır. Geleneksel ana ad origin'dir.
# Remote ekle
git remote add origin git@github.com:username/my-app.git
# Adresleriyle birlikte listele
git remote -v
origin git@github.com:username/my-app.git (fetch)
origin git@github.com:username/my-app.git (push)
Ardından branch'i gönderin ve yerel branch'i uzaktakiyle ilişkilendirin:
git push -u origin main
Temel git remote komutları
| Komut | Ne yapar |
|---|---|
git remote -v | Remote'ları adresleriyle listeler |
git remote add <ad> <url> | Yeni bir uzak depo bağlar |
git remote set-url origin <url> | Adresi değiştirir, örneğin HTTPS'ten SSH'ye |
git remote rename origin old | Remote'un adını değiştirir |
git remote remove old | Remote'u siler (sunucunun kendisine dokunmaz) |
git remote show origin | Ayrıntılar: branch'ler, izleme, geride kalan işler |
Adres biçimleri
https://github.com/user/repo.git— HTTPS, her yerde çalışır, yazmak için token gerekir;git@github.com:user/repo.git— SSH, anahtar gerekir, kurulduktan sonra parola sorulmaz;/srv/git/repo.gitya dafile:///srv/git/repo.git— yerel yol, denemeler için uygun.
Tipik hatalar
«error: remote origin already exists». Bu adla bir remote zaten var. Adresi değiştirmek için yeniden add yerine git remote set-url origin <url> kullanın.
«failed to push some refs» / «Updates were rejected». Sunucuda sizde olmayan commit'ler var; çoğu zaman depo sitede oluşturulurken eklenen README. git pull --rebase origin main çalıştırıp push'u tekrarlayın. Geçmişler tamamen ilişkisizse Git «refusing to merge unrelated histories» der; bu durumda git pull için --allow-unrelated-histories bayrağı gerekir. Daha basiti, depoyu sitede boş olarak oluşturmaktır.
«src refspec main does not match any». Olmayan bir branch göndermeye çalışıyorsunuz: ya hiç commit yapılmamıştır ya da branch'in adı master'dır. git branch ile kontrol edin.
Kendi Git sunucunuz: bare repository
GitHub zorunlu değildir. Uzak depo, SSH erişiminiz olan herhangi bir makine olabilir. Bunun için sunucuda «çıplak» (bare) bir repository oluşturulur: çalışma dizini olmadan, yalnızca .git içeriğiyle:
# Sunucuda
ssh user@server
git init --bare /srv/git/my-app.git
# Kendi bilgisayarınızda
git remote add origin user@server:/srv/git/my-app.git
git push -u origin main
Bu sunucuyu üç kişilik bir ekip kullanacaksa, arkadaşlarınıza repository klasörüne SSH erişimi ve yazma hakkı olan ortak bir grup vermeniz yeterlidir. Branch bazında ya da proje bazında yetki ayrımı gerekiyorsa bu artık yetmez ve tam teşekküllü bir Git barındırma servisi gerekir.
Bare repository'ye «girip dosya düzeltemezsiniz»: yalnızca push ve fetch ile alışveriş için tasarlanmıştır. Her Git barındırma servisindeki repository'ler de bu şekilde çalışır. Web arayüzü, inceleme ve görevler isterseniz GitLab, Gitea ya da Forgejo gibi kendi sunucunuza kurabileceğiniz çözümler kullanılır.
İzleyen branch'ler: yerel repository sunucuyu nasıl görür
Remote bağlandıktan ve ilk git fetch ya da git push yapıldıktan sonra origin/main gibi uzak branch'ler oluşur. Bunlar sunucudaki branch'ler değil, son senkronizasyon anında sunucuda gördüğünüz durumun yerel kopyalarıdır. Yalnızca fetch, pull ve push sırasında güncellenirler.
Üç alışveriş komutu arasındaki fark şudur:
| Komut | Neyi değiştirir |
|---|---|
git fetch | origin/* işaretlerini günceller, branch'lerinize ve dosyalarınıza dokunmaz |
git pull | fetch + origin/main'in mevcut branch'e birleştirilmesi |
git push | Commit'lerinizi gönderir ve sunucudaki branch'i günceller |
Yerel branch'in ne kadar geride ya da önde olduğunu şöyle görebilirsiniz:
git fetch
git status -sb
## main...origin/main [ahead 2, behind 1]
Bu çıktı, sunucuda olmayan iki commit'iniz ve sizde olmayan bir sunucu commit'i olduğunu söyler. Push'tan önce o sunucu commit'ini almanız gerekir.
Yerel branch ile uzak branch arasındaki bağlantı (upstream), ilk push'ta -u ile kurulur. Unuttuysanız ayrıca tanımlayabilirsiniz: git branch --set-upstream-to=origin/main. Tüm bağlantıları görmek için git branch -vv.
Birden çok repository: monorepo mu, proje başına bir mi
Yeni başlayanların sık sorduğu soru, kaç repository açmaları gerektiğidir. Basit bir kural: bağımsız geliştirilen ve yayımlanan her birim için bir repository. Ders projeleri, kişisel projeler ve ayrı servisler ayrı repository'lerdir. Tüm «Projelerim» klasörüne tek bir repository açmayın: geçmiş karışır ve tek bir projeyi portföyde ayrı göstermek zorlaşır.
Büyük şirketler bazen tüm kodu tek bir monorepo içinde tutar; ortak değişiklikler ve tek bir derleme için. Bu bilinçli bir mimari karardır ve kendi araçlarını gerektirir. Yeni başlayan biri «bir proje, bir repository» kuralıyla başlamalı ve bir repository'yi, alt modüller olmadan başka bir repository'nin içine koymamalıdır.
git init mi, git clone mu
| Durum | Komut |
|---|---|
| Sıfırdan yeni bir proje başlatıyorsunuz | git init |
| Sürüm kontrolü olmayan bir kod klasörünüz var | Bu klasörde git init |
| Proje zaten GitHub'da ya da bir sunucuda | git clone <url> |
| Kendi sunucunuzda merkezi bir repository gerekiyor | git init --bare |
git clone sonrasında origin remote'u zaten ayarlanmıştır; elle eklemeniz gerekmez.
Adım adım: klasörden GitHub repository'sine
- Proje klasörünü oluşturun ve
git init -b mainçalıştırın. .gitignoreve README ekleyin.- İlk commit'i yapın:
git add .vegit commit -m "Initial commit". - GitHub'da boş bir repository oluşturun — README, lisans ve .gitignore olmadan.
- Bağlayın:
git remote add origin <adres>. - Kodu gönderin:
git push -u origin main. - Bundan sonra döngüyle çalışın: düzenleme →
git add→git commit→git push.
Kısaca
Git repository, projeniz artı tam geçmişi tutan .git klasörüdür. git init ile oluşturulur; sunucu bağlantısı git remote add origin ve ilk git push -u ile kurulur. Uzak depo GitHub, GitLab ya da bare repository ile kendi sunucunuz olabilir. Repository oluşturma, indeks ve remote bağlama Git kursunda uygulamalı olarak anlatılmaktadır.
Sık sorulan sorular
Git repository'yi silmeden yalnızca geçmişi nasıl kaldırırım?
Proje kökündeki gizli .git klasörünü silin: Linux ve macOS'ta rm -rf .git. Dosyalar kalır, ama tüm sürüm geçmişi kaybolur.
Zaten repository olan bir klasörde git init çalıştırmak güvenli mi?
Evet. Git, Reinitialized existing Git repository mesajı verir ve geçmişe dokunmaz; yalnızca eksik yardımcı dosyaları tamamlar.
Bir repository'ye kaç remote bağlayabilirim?
İstediğiniz kadar. Açık kaynak projelerde genellikle kendi fork'unuz için origin, orijinal proje için upstream kullanılır.
Bir repository'nin kendi ayarları nerede tutulur?
.git/config dosyasında. Kullanıcı için genel ayarlar ~/.gitconfig içindedir ve git config --global ile değiştirilir.
Bare repository normal repository'den nasıl farklıdır?
Bare repository'nin dosyalar içeren çalışma dizini yoktur; yalnızca Git'in iç verileri bulunur. Sunucuda merkezi repository olarak kullanılır ve push hedefi olur.
Bu konu “Sıfırdan Güvenilir Geliştiriciye Git” kursunda uygulamalı olarak ayrıntılı işleniyor.
Kursa git