Rehber

Git repository: git init ile oluşturma ve remote bağlama

Güncellendi: · Skillaria.Top

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 add ile buraya girer;
  • geçmiş — .git içindeki commit veritabanı; değişiklikler git commit ile 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:

ÖğeNe 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
HEADMevcut branch'e işaretçi, örneğin ref: refs/heads/main
configBu repository'nin ayarları, remote listesi dahil
indexStaging 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ı

KomutNe yapar
git remote -vRemote'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 oldRemote'un adını değiştirir
git remote remove oldRemote'u siler (sunucunun kendisine dokunmaz)
git remote show originAyrı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.git ya da file:///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:

KomutNeyi değiştirir
git fetchorigin/* işaretlerini günceller, branch'lerinize ve dosyalarınıza dokunmaz
git pullfetch + origin/main'in mevcut branch'e birleştirilmesi
git pushCommit'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

DurumKomut
Sıfırdan yeni bir proje başlatıyorsunuzgit init
Sürüm kontrolü olmayan bir kod klasörünüz varBu klasörde git init
Proje zaten GitHub'da ya da bir sunucudagit clone <url>
Kendi sunucunuzda merkezi bir repository gerekiyorgit 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

  1. Proje klasörünü oluşturun ve git init -b main çalıştırın.
  2. .gitignore ve README ekleyin.
  3. İlk commit'i yapın: git add . ve git commit -m "Initial commit".
  4. GitHub'da boş bir repository oluşturun — README, lisans ve .gitignore olmadan.
  5. Bağlayın: git remote add origin <adres>.
  6. Kodu gönderin: git push -u origin main.
  7. 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 konuyu videoyla öğrenin

Bu konu “Sıfırdan Güvenilir Geliştiriciye Git” kursunda uygulamalı olarak ayrıntılı işleniyor.

Kursa git