Git, 2005 yılında Linus Torvalds tarafından Linux çekirdeği geliştirmek için oluşturulmuş, açık kaynak kodlu dağıtık bir sürüm kontrol sistemidir. SVN gibi merkezi sistemlerin aksine Git, geliştiricinin her cihazında deponun tam bir kopyasını saklar ve sunucuya sürekli bağlantı olmadan çalışmaya olanak tanır. Git SCM, 2024'e göre Git, ticari yazılım geliştirme projelerinin %90'ından fazlasında kullanılmaktadır.
Önemli noktalar
Git, dosyalardaki değişiklikleri izleyen ve birden fazla geliştiricinin aynı proje üzerinde aynı anda çalışmasına olanak tanıyan dağıtık bir sürüm kontrol sistemidir (VCS). Merkezi sistemlerin aksine, Git'te her geliştirici, değişiklik geçmişinin tamamı dahil olmak üzere deponun tam bir kopyasına sahiptir; bu da sistemi veri kaybına karşı dayanıklı kılar ve merkezi bir sunucuya sürekli bağlantı gerektirmez.
Git'in tarihi 2005 yılında, BitKeeper'ın Linux çekirdeği geliştiricileri için ücretsiz lisansını iptal etmesinin ardından Linus Torvalds'ın yeni bir VCS oluşturmasıyla başladı. Hedefler şunlardı: hız, mimari basitliği, dallanma yoluyla doğrusal olmayan geliştirme desteği ve tam dağıtım. 3 ayda Torvalds Git'in çekirdeğini yazdı ve bir yıl içinde proje Junio Hamano liderliğinde kendi kendini yönetmeye başladı.
Stack Overflow anketine (2024) göre Git, profesyonel geliştiricilerin %93,9'u tarafından kullanılmakta ve sektördeki baskın sürüm kontrol sistemi haline gelmektedir. En yakın rakip — Subversion (SVN) — yalnızca %5,2 projede, çoğunlukla merkezi süreçlere sahip büyük kurumsal ortamlarda kullanılmaktadır.
Git deposu, Git'in tüm dosyalardaki değişiklikleri izlediği bir dizindir. Dizinin içinde, tüm sistem nesnelerini (commit'ler, ağaçlar, blob'lar ve referanslar) saklayan gizli bir .git klasörü bulunur. Bir geliştirici commit oluşturduğunda, Git dosyaları tamamen kopyalamaz — bir anlık görüntü oluşturur ve ona bir referans kaydeder.
Her commit şunları içerir: benzersiz bir SHA-1 karması (40 karakter), önceki commit'e referans (parent), yazar, tarih, commit mesajı ve commit anındaki dosyaların durumunu tanımlayan bir ağaca referans. Commit zinciri, her commit'in bir veya daha fazla ebeveyne işaret ettiği yönlü döngüsel olmayan bir grafik oluşturur.
# Depo başlatma
git init my-project
cd my-project
# Commit oluşturma
echo "Merhaba, Git" > README.md
git add README.md
git commit -m "Initial commit"
# Geçmişi görüntüleme
git log --oneline --graph --all
Git üç ana alan kullanır: working directory (disk üzerindeki dosyalar), staging area (hazırlanan dosyaların gittiği indeks) ve repository (commit geçmişi). git add komutu, değişiklikleri çalışma dizininden staging'e taşır ve git commit, staging içeriğini depoya kaydeder. Bu ayrım, geliştiricinin her düzenlemeyi ayrı ayrı commit etmeden bir dizi değişiklikten anlamlı bir commit oluşturmasına olanak tanır.
Temel Git komutları, bir geliştiricinin günlük işlemlerinin %90'ını kapsar. git clone komutu uzak bir deponun yerel kopyasını oluşturur, git pull sunucudan değişiklikleri alır ve mevcut dalla birleştirir, git push ise yerel commit'leri sunucuya gönderir. Bu üç komut, Git ile çalışmanın ana döngüsünü oluşturur.
Durumu görüntülemek için git status kullanılır — hangi dosyaların değiştirildiğini, hangilerinin staging'e eklendiğini ve hangilerinin izlenmediğini gösterir. git diff, staging'e eklemeden önce dosyalardaki belirli değişiklikleri görüntüler. Aşağıda en sık kullanılan komutların tablosu bulunmaktadır:
| Komut | Eylem | Örnek |
|---|---|---|
| git clone | Uzak depoyu kopyalar | git clone https://example.com/repo |
| git add | Dosyaları staging'e ekler | git add src/main.kt |
| git commit | Değişiklikleri geçmişe kaydeder | git commit -m “Giriş hatasını düzelt” |
| git push | Commit'leri sunucuya gönderir | git push origin main |
| git pull | Sunucudan değişiklikleri alır | git pull origin feature |
Değişiklikleri geri almak için Git birkaç seçenek sunar. git reset dal işaretçisini belirtilen bir commit'e taşır ve staging veya çalışma dizinini sıfırlayabilir. git revert, belirtilen commit'in değişikliklerini geri alan yeni bir commit oluşturur — bu, paylaşılan dallar için güvenli bir geri alma yöntemidir çünkü geçmiş yeniden yazılmaz.
Git'teki dallar, belirli bir commit'e işaret eden hafif taşınabilir işaretçilerdir. Yeni bir dal oluşturmak dosyaları kopyalamaz, sadece yeni bir işaretçi oluşturur, bu da dallanmayı neredeyse anlık hale getirir. main dalı (eskiden master), kararlı, sürüme hazır kodu içeren projenin ana dalıdır.
Standart uygulama Git Flow veya GitHub Flow kullanmaktır. Git Flow şu dalları kullanır: main (sürüm kodu), develop (entegrasyon dalı), feature/* (yeni özellikler), release/* (sürüm hazırlığı) ve hotfix/* (acil düzeltmeler). GitHub Flow daha basittir: yalnızca main ve özellik dalları vardır ve tüm değişiklikler Pull Request aracılığıyla teslim edilir.
# Dal oluşturma ve değiştirme
git branch feature-auth
git checkout feature-auth
# veya tek bir komutla:
git checkout -b feature-auth
# Dal listesi
git branch --list
git branch -a # tüm dallar, silinenler dahil
# Dal silme
git branch -d feature-auth
Git dallanmasının önemli bir özelliği cherry-pick'tir: git cherry-pick <hash> komutunu kullanarak tek bir commit'i bir daldan diğerine taşımak. Bu, tüm dalı birleştirmeden bir özellik dalından sürüme hata düzeltmesi aktarmanız gerektiğinde kullanışlıdır. Git ayrıca commit'leri sıkıştırmak, yeniden sıralamak ve düzenlemek için rebase ve etkileşimli rebase'i (git rebase -i) destekler.
Merge (birleştirme), iki ebeveyni olan özel bir birleştirme commit'i oluşturur. Bu commit, iki dalın birleştiği gerçeğini kaydeder ve tam geçmişi korur — birleştirmenin nerede ve ne zaman gerçekleştiği görülebilir. Merge, geçmişi oluşturulduğu gibi korur, bu da denetimi basitleştirir ancak commit grafiğini daha karmaşık hale getirir.
Rebase (yeniden temellendirme), bir birleştirme commit'i oluşturmak yerine, mevcut dalın commit'lerini hedef dalın tepesine taşır. Geçmiş doğrusal hale gelir — geliştirmenin sıralı olduğu izlenimini yaratır. Ancak rebase, geçmişi yeniden yazar, commit'lerin SHA-1 karmalarını değiştirir ve bu da onu diğer geliştiricilerin erişebildiği paylaşılan dallar için tehlikeli hale getirir.
Öneri: geçmişin diğer geliştiriciler tarafından görülebildiği genel dallar (feature → develop) için merge kullanın ve bir Pull Request oluşturmadan önce ana daldan özellik dalınıza yeni değişiklikler uygulamanız gerektiğinde yerel çalışma için rebase kullanın. Kural basittir: bir commit zaten sunucuya gönderilmişse — onu rebase etmeyin.
Birleştirme çakışması, Git'in tek bir dosyadaki değişiklikleri otomatik olarak birleştirememesi durumunda ortaya çıkar. Git, dosyadaki çakışan bölümleri özel işaretleyicilerle işaretler: <<<<<<< (bizim değişikliklerimiz), ======= (ayırıcı), >>>>>>> (onların değişiklikleri). Geliştirici dosyayı manuel olarak düzenler, istenen seçeneği seçer veya her ikisini birleştirir ve bir commit ile birleştirmeyi tamamlar.
Uzak depo (remote), bir sunucuda bulunan Git deposunun bir kopyasıdır. GitHub, GitLab ve Bitbucket, uzak depoları barındırmak için en popüler platformlardır. Kod görüntüleme, erişim yönetimi, kod incelemesi ve CI/CD sistemleriyle entegrasyon için web arayüzü sağlarlar.
Git'te, bir proje için birden fazla uzak depo yapılandırabilirsiniz. Varsayılan olarak, ana uzak adrese origin denir. git remote add komutu yeni bir uzak adres ekler, git fetch birleştirmeden değişiklikleri alır ve git pull, git fetch + git merge için bir kısayoldur. Pull Request aracılığıyla kodla çalışmak için bir geliştirici, deponun bir çatalını (fork) oluşturur, klonlar, bir özellik dalında çalışır ve orijinal depoya bir birleştirme isteği gönderir.
# Uzak depo ekleme
git remote add origin https://github.com/user/repo.git
# Uzak depoları görüntüleme
git remote -v
# Sunucuya dal gönderme
git push -u origin feature-auth
# Uzak daldan değişiklik alma
git pull origin main
Uzak depolar, sürüm sürümlerini işaretlemek için etiketlemeyi destekler. Etiketler hafif (yalnızca bir commit'e işaretçi) veya açıklamalı (meta veri içerir: yazar, tarih, mesaj) olabilir. Açıklamalı etiketler, sürüm sürümleri için önerilir çünkü tam sürüm bilgisi taşırlar ve yazarlığın doğrulanması için GPG anahtarıyla imzalanabilirler.
Git Worktree, aralarında geçiş yapmadan farklı dizinlerde aynı anda birden çok dalla çalışmanıza olanak tanır. git worktree add ../feature-auth feature-auth komutu, ana dizinde dal değiştirmeden kod yazabileceğiniz yeni bir çalışma dizini feature-auth oluşturur. Worktree, ana dizin uzun vadeli geliştirme ile meşgulken bir sürüm dalında hızlı düzeltmeler yapmak için kullanışlıdır.
Git Submodules, bir Git deposunu başka bir deponun içine dahil etme mekanizmasıdır. Bir alt modül, harici bir deponun sabit bir commit'ine referans saklar ve derleme tekrarlanabilirliğini garanti eder. git submodule add https://github.com/example/lib.git komutu, harici bir kitaplığı alt modül olarak ekler. Alt modülleri olan bir projeyi klonlarken, tüm bağımlılıkları indirmek için git submodule update --init --recursive çalıştırılması gerekir.
Sıkça sorulan sorular
Git, yerel geçmişi ve çevrimdışı çalışma yeteneği olan dağıtık bir VCS'dir. SVN, dosyaları görüntüleme dışındaki her işlem için sunucuya sürekli bağlantı gerektiren merkezi bir sistemdir.
Güvenli geri alma için git revert HEAD kullanın (yeni bir commit oluşturur). Commit henüz sunucuya gönderilmediyse, git reset --soft HEAD~1 kullanabilirsiniz.
.gitignore, Git'in yok sayması gereken dosya ve dizin kalıplarını listeleyen bir dosyadır. Geçici dosyaları, derlemeleri ve IDE yapılandırmalarını depodan hariç tutmak için kullanılır.
git fetch sunucudan değişiklikleri indirir ancak mevcut dalla birleştirmez. git pull fetch yapar ve hemen bir merge gerçekleştirir. Kontrol için fetch + diff incelemesi kullanın, ardından manuel olarak birleştirin.
git commit --amend kullanın — bu komut, commit mesajını değiştirmek için bir düzenleyici açar. Commit zaten sunucudaysa, git push --force gerekir, bu da paylaşılan dallar için tehlikelidir.
Ö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