Git Deposu — Git'in geliştirme boyunca her dosya değişikliğini izlediği proje kaynak kod deposudur. Depo, commit'lerin, dalların ve etiketlerin tam geçmişini içerir ve geliştiricilerin kod üzerinde birlikte çalışmasını sağlar. Git, 2024'e göre depo, herhangi bir sürüm kontrol sisteminin temelidir ve dünya çapında milyonlarca projede kullanılmaktadır.
Ana Noktalar
Git Deposu — sürüm kontrol sisteminin proje dosyalarındaki değişiklik geçmişini tanımlayan meta verileri ve nesneleri sakladığı bir veri yapısıdır. Bir geliştirici git init komutuyla bir depo başlattığında, Git proje kökünde gizli bir .git klasörü oluşturur.
Bu klasörün içinde sistemin çalışması için gerekli tüm nesneler, referanslar ve yapılandırma dosyaları bulunur. Depo belirli bir konuma bağlı değildir — geliştirici onu yerel olarak oluşturabilir ve daha sonra uzak bir sunucuya bağlayabilir.
Git, dağıtık depo modelini kullanır: projenin her üyesi bilgisayarında geçmişin tam bir kopyasına sahiptir. Bu, çoğu işlemin — commit, geçmiş görüntüleme, dal oluşturma — sunucuya bağlanmadan yerel olarak gerçekleştirildiği anlamına gelir.
Git belgelerine göre, dağıtık mimari sistemi hatalara karşı dayanıklı kılar: sunucu çökerse, herhangi bir yerel depo projenin tam geçmişini geri yüklemek için kaynak olabilir.
Yerel Depo — geliştiricinin bilgisayarındaki projenin bir kopyasıdır. Commit, dal ve etiketlerin tam geçmişini içerir ve ağ bağlantısı olmadan commit, branch, merge ve rebase işlemlerini gerçekleştirmeye olanak tanır.
Uzak Depo — bir sunucuda barındırılır ve tüm ekip üyeleri için senkronizasyon noktası görevi görür. Geliştiriciler değişikliklerini git push komutuyla gönderir ve başkalarının değişikliklerini git pull komutuyla alır.
Yerel ve uzak depo arasındaki bağlantı, remote origin — Git yapılandırmasında saklanan sunucu URL'si — aracılığıyla yapılandırılır. Bir yerel depo, birden çok uzak depoya bağlanabilir; bu, fork'larla çalışırken kullanışlıdır.
Bu modelin ana avantajı, geliştiricinin çevrimdışı olarak kod üzerinde çalışabilmesi ve değişiklikleri yalnızca sonucu göndermeye hazır olduğunda senkronize edebilmesidir.
| Özellik | Yerel | Uzak |
|---|---|---|
| Konum | Geliştiricinin bilgisayarında | Sunucuda (GitHub, GitLab) |
| Çevrimdışı Erişim | Tüm işlemlere tam erişim | Bağlantı olmadan kullanılamaz |
| Senkronizasyon | Uzakla Push/Pull | Yerelden push alır |
| Yedekleme | Veri kaybına karşı korumasız | Yedekli sunucuda saklanır |
Git'in depolama modeli diğer sürüm kontrol sistemlerinden temel olarak farklıdır. Sürümler arasındaki değişiklik listesini (delta) saklamak yerine, Git her commit anında projenin tüm dosyalarının tam anlık görüntülerini saklar.
Depodaki her nesne, benzersiz bir 40 karakterli SHA-1 karması ile tanımlanır. Bir dosyanın içeriği commit'ler arasında değişmemişse, Git yeni bir nesne oluşturmaz, mevcut olanı yeniden kullanır — bu yerden tasarruf sağlar.
Git dört tür nesne kullanır: blob (dosya içeriği), tree (dizin yapısı), commit (meta verili anlık görüntü) ve tag (bir commit'e adlandırılmış referans). Tüm nesneler .git/objects klasöründe saklanır.
Git Internals'a göre, Git'in nesne modeli veri bütünlüğünü garanti eder: dosya içeriğindeki herhangi bir değişiklik yeni bir karma üretir ve bu da geçmişin fark edilmeden değiştirilmesini imkansız kılar.
.git klasörü deponun kalbidir. O olmadan Git değişiklikleri izleyemez ve sıradan bir dizin yalnızca bir dosya koleksiyonu olarak kalır. Bu klasörün yapısını anlamak, depo sorunlarını teşhis etmeye yardımcı olur.
HEAD dosyası özel ilgiyi hak ediyor. Normal durumda bir dala sembolik referans içerir, örneğin ref: refs/heads/main. Detached HEAD durumunda doğrudan bir commit'i gösterir — bu, yeni commit'lerin hiçbir dala bağlanmayacağı anlamına gelir.
Git deposu ile çalışmak, geliştiricinin günlük olarak gerçekleştirdiği bir dizi temel işlemi içerir. Her işlem, yeni nesneler ekleyerek veya referansları taşıyarak deponun durumunu değiştirir.
Push ve pull işlemleri, uzak sunucuya bağlantı gerektiren tek işlemlerdir. Diğer tüm işlemler tamamen yerel olarak gerçekleştirilir ve büyük geçmiş hacminde bile yüksek hız sağlar.
Depodaki her dosya dört durumdan geçer: untracked (izlenmeyen), modified (değiştirilmiş), staged (hazırlanmış) ve committed (commitlenmiş). Git, yalnızca git add ile açıkça eklenmiş veya zaten commit geçmişinde olan dosyaları izler.
Bu modeli anlamak, Git ile etkili bir şekilde çalışmanın anahtarıdır. Geliştirici, değiştirilen dosyaların yalnızca bir kısmını seçerek commit için hazırlayabilir ve net bir açıklamayla mantıksal olarak tamamlanmış commit'ler oluşturabilir.
Uzak depo genellikle web arayüzü, erişim yönetim sistemi ve ortak geliştirme için ek araçlar sağlayan özel platformlarda barındırılır.
Platform seçimi, ekip büyüklüğüne, gizlilik gereksinimlerine ve gerekli entegrasyonlara bağlıdır. Mobil geliştirme için, geniş topluluk desteği ve iOS ile Android için CI/CD araçlarıyla entegrasyonu nedeniyle genellikle GitHub seçilir.
Pratik bir senaryo düşünelim: bir geliştirici mevcut bir depoyu klonlar, yeni bir dal oluşturur, değişiklikler yapar ve bunları sunucuya gönderir. Her komut, deponun farklı bileşenleriyle çalışmayı gösterir.
# Uzak bir depoyu klonlama
git clone https://github.com/user/mobile-app.git
# Proje dizinine gitme
cd mobile-app
# Yeni bir feature dalı oluşturma ve ona geçme
git checkout -b feature/auth
# Değiştirilen dosyaların durumunu kontrol etme
git status
# Tüm değişiklikleri hazırlık alanına ekleme
git add .
# Açıklamayla commit oluşturma
git commit -m "Add authentication module"
# Değişiklikleri uzak depoya gönderme
git push origin feature/auth
git status komutu günlük çalışmada en kullanışlı komutlardan biridir. Hangi dosyaların değiştirildiğini, hangilerinin commit'e hazır olduğunu ve hangilerinin Git tarafından hiç izlenmediğini gösterir.
Depo geçmişini analiz etmek için git log komutu çeşitli biçimlendirme bayraklarıyla kullanılır. Commit'lerin kronolojisini, yazarlarını, tarihlerini ve SHA-1 tanımlayıcılarını gösterir.
# Dal grafiği görselleştirmesiyle geçmişi görüntüleme
git log --oneline --graph --all
# Belirli bir commit'teki değişiklikleri görüntüleme
git show a1b2c3d
# Mevcut durumu son commit'le karşılaştırma
git diff HEAD
# Belirli bir dosyanın geçmişini görüntüleme
git log --follow src/MainActivity.kt
--graph bayrağı, dallanmanın ASCII grafiğini görüntüler; bu, birden çok dalda aktif çalışma olan depolarda özellikle kullanışlıdır. Sık sürüm çıkaran mobil projeler için görsel grafik, geliştirme yapısını hızlıca değerlendirmeye yardımcı olur.
Sıkça Sorulan Sorular
Depo, değişiklik geçmişiyle birlikte kodun teknik bir deposudur. Proje, depoyu, görev yönetim sistemini, belgeleri ve geliştirme süreçlerini içeren daha geniş bir kavramdır. Bir proje birden çok depo içerebilir.
New düğmesine tıklayarak GitHub web arayüzü üzerinden yeni bir depo oluşturun. Bir ad, açıklama ve erişim düzeyi belirtin. Ardından depoyu yerel makineye klonlayın veya git remote add origin ile mevcut bir yerel depoya bağlayın.
Uzak depo sunucudan silinmişse ancak en az bir geliştiricinin yerel kopyası varsa, depo geri yüklenebilir. Yeni bir uzak depo oluşturun ve tam geçmişle birlikte yerel kopyadan git push --force komutunu çalıştırın.
Fork, hesabınızdaki başka birine ait deponun bir kopyasıdır. Geçmişin tam kopyasını alırsınız ve orijinali etkilemeden herhangi bir değişiklik yapabilirsiniz. Fork'lar, Pull Request'ler aracılığıyla açık kaynak projelere katılmak için kullanılır.
Nesneleri sıkıştırmak ve ulaşılamaz verileri kaldırmak için git gc kullanın. git filter-branch veya git filter-repo ile geçmişten büyük dosyaları kaldırın. İkili dosyaları olan projeler için Git LFS'yi (Large File Storage) değerlendirin.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun