Git ile Versiyon Kontrolü
Projelerinizi güvenle yönetin, işbirliği yapın ve kodunuzu takip edin.
Git Nedir?
Git'in Tanımı ve Tarihi
Git, 2005 yılında Linux işletim sisteminin yaratıcısı Linus Torvalds tarafından geliştirilmiş, dağıtık bir versiyon kontrol sistemidir. Linus, Linux çekirdeği geliştirmesi için daha iyi bir araç arayışındaydı ve mevcut çözümlerden memnun olmadığı için Git'i oluşturdu.
Git'in adı, Linus'un kendi ifadesiyle "aptal, basit ama etkili" anlamına gelen İngilizce bir argo kelimeden gelmektedir. Başlangıçta sadece 2 hafta içinde temel yapısı oluşturulmuş ve kısa sürede Linux çekirdeğinin geliştirilmesinde kullanılmaya başlanmıştır.
Git'in Doğuşu
Linus Torvalds tarafından Linux çekirdeği için geliştirildi
GitHub'ın Kuruluşu
Git tabanlı proje barındırma servisi GitHub kuruldu
GitLab'ın Ortaya Çıkışı
Açık kaynaklı Git yönetim sistemi GitLab geliştirildi
Microsoft Dönemi
Microsoft, GitHub'ı 7.5 milyar dolara satın aldı
Neden Git Kullanmalıyız?
Versiyon Geçmişi
Git, projenizin tüm geçmişini saklar. Her değişiklik, kim tarafından ne zaman yapıldığı bilgisiyle birlikte kaydedilir. Bu sayede herhangi bir zamandaki projenizin durumuna geri dönebilirsiniz.
İşbirliği
Birden fazla geliştirici aynı projede çalışırken, Git çakışmaları (conflict) yönetmeyi ve değişiklikleri birleştirmeyi kolaylaştırır. Ekip üyeleri aynı anda farklı özellikler üzerinde çalışabilir.
Dallanma Kolaylığı
Git'in güçlü dallanma mekanizması, yeni özellikleri ana koddan izole bir şekilde geliştirmenize olanak tanır. Bu, stabil bir ana kod tabanını korurken yeni özellikler eklemeyi mümkün kılar.
Dağıtık Yapı
Her geliştirici, projenin tam bir kopyasına sahiptir. Bu, internet bağlantısı olmadan bile çalışmaya devam edebilmenizi ve merkezi sunucu çökmesi durumunda veri kaybı yaşamamanızı sağlar.
Veri Bütünlüğü
Git, her commit'in benzersiz bir hash değeriyle tanımlanmasını sağlayarak, projenizin bütünlüğünü korur. Bu, herhangi bir değişikliğin fark edilmeden yapılmasını imkansız hale getirir.
Performans
Git, büyük projeler ve binlerce dal (branch) ile bile hızlı çalışacak şekilde tasarlanmıştır. Çoğu işlem yerel olarak gerçekleştiği için ağ gecikmesi yaşanmaz.
Git vs Diğer Versiyon Kontrol Sistemleri
| Özellik | Git | SVN | Mercurial |
|---|---|---|---|
| Mimari | Dağıtık | Merkezi | Dağıtık |
| Çevrimdışı Çalışma | |||
| Dallanma Performansı | Çok Hızlı | Yavaş | Hızlı |
| Öğrenme Eğrisi | Orta | Kolay | Orta |
| Topluluk Desteği | Çok Geniş | Orta | Geniş |
Temel Git Komutları
Git'i kullanmaya başlamak için bilmeniz gereken temel komutlar aşağıda açıklanmıştır. Bu komutlar, günlük Git iş akışınızın temelini oluşturur.
git init
Yeni bir Git deposu oluşturur. Bu komut, mevcut bir dizini Git deposuna dönüştürerek versiyon kontrolü başlatır. Bu işlem, projenizin kök dizininde gizli bir .git klasörü oluşturur.
$ git init
$ git init
Initialized empty Git repository in .git/
git add
Dosyaları hazırlama alanına (staging area) ekler. Bu, değişikliklerinizi bir sonraki commit için hazırlar. Belirli dosyaları eklemek için git add dosya.txt veya tüm değişiklikleri eklemek için git add . kullanabilirsiniz.
$ git add dosya.txt
$ git add dosya.txt
Changes staged for commit
git commit
Hazırlama alanındaki değişiklikleri depoya kaydeder. Her commit, projenizin bir anlık görüntüsünü oluşturur ve benzersiz bir kimlik (hash) ile tanımlanır. İyi bir commit mesajı, değişikliğin amacını açıkça belirtmelidir.
$ git commit -m "Mesaj"
$ git commit -m "İlk commit"
[main f7d2e3a] İlk commit
1 file changed, 10 insertions(+)
git status
Mevcut çalışma dizininin durumunu gösterir. Değişiklik yapılan, hazırlama alanına eklenen ve commit için hazır olan dosyaları listeler.
$ git status
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: index.html
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
modified: style.css
git push
Yerel depodaki commit'leri uzak depoya gönderir. Bu komut, yaptığınız değişiklikleri diğer geliştiricilerle paylaşmanızı sağlar.
$ git push origin main
$ git push origin main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 353 bytes | 353.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/username/repo.git
a1b2c3d..f7d2e3a main -> main
git pull
Uzak depodaki değişiklikleri yerel deponuza çeker ve birleştirir. Bu komut, diğer geliştiricilerin yaptığı değişiklikleri kendi yerel kopyanıza almak için kullanılır.
$ git pull origin main
$ git pull origin main
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 3 (delta 1)
Unpacking objects: 100% (3/3), 340 bytes | 34.00 KiB/s, done.
From https://github.com/username/repo
a1b2c3d..e5f6g7h main -> origin/main
Updating a1b2c3d..e5f6g7h
Fast-forward
README.md | 5 +++++
1 file changed, 5 insertions(+)
Dallanma (Branching)
Dallanma, Git'in en güçlü özelliklerinden biridir ve paralel geliştirmeyi mümkün kılar. Farklı dallar oluşturarak, ana kod tabanını etkilemeden yeni özellikler geliştirebilirsiniz.
Git'in en güçlü özelliklerinden biri dallanma mekanizmasıdır. Dallanma, ana kod tabanından ayrı olarak yeni özellikler geliştirmenize olanak tanır. Bu, stabil bir ana dalı (genellikle main veya master) korurken, yeni özellikler veya hata düzeltmeleri üzerinde çalışmanızı sağlar.
Dallanma stratejileri, projenizin ihtiyaçlarına göre değişebilir. Yaygın stratejiler arasında Git Flow, GitHub Flow ve GitLab Flow bulunur.
$ git branch yeni-ozellik
$ git checkout yeni-ozellik
veya tek komutla:
$ git checkout -b yeni-ozellik
Uzak Depolar (Remote Repositories)
Uzak depolar, kodunuzu başkalarıyla paylaşmanızı ve işbirliği yapmanızı sağlar. GitHub, GitLab ve Bitbucket gibi platformlar, Git tabanlı uzak depo hizmetleri sunar.
Yerel Depo
Uzak Depo
Uzak Depolarla Çalışma
Uzak depolar, kodunuzu başkalarıyla paylaşmanızı ve işbirliği yapmanızı sağlar. Uzak bir depo, internet veya ağ üzerinde barındırılan bir Git deposudur.
En popüler Git barındırma hizmetleri arasında GitHub, GitLab, Bitbucket ve Azure DevOps bulunur. Bu platformlar, kod inceleme, sorun takibi ve sürekli entegrasyon gibi ek özellikler sunar.
Uzak Depo Ekleme
$ git remote add origin https://github.com/kullanici/repo.git
Bu komut, yerel deponuza "origin" adında bir uzak depo ekler. "origin" geleneksel olarak ana uzak depo için kullanılan isimdir, ancak istediğiniz herhangi bir ismi kullanabilirsiniz.
Değişiklikleri Gönderme (Push)
$ git push -u origin main
Bu komut, yerel "main" dalındaki değişiklikleri "origin" uzak deposuna gönderir. "-u" parametresi, gelecekteki push işlemleri için varsayılan uzak depo ve dalı ayarlar.
Değişiklikleri Çekme (Pull)
$ git pull origin main
Bu komut, "origin" uzak deposundaki "main" dalındaki değişiklikleri yerel deponuza çeker ve birleştirir. Aslında bu komut, git fetch ve git merge komutlarının birleşimidir.
Uzak Depoları Görüntüleme
$ git remote -v
Bu komut, tüm uzak depoları ve URL'lerini listeler. "-v" parametresi "verbose" (ayrıntılı) anlamına gelir ve hem push hem de fetch URL'lerini gösterir.
Uzak Depo Bilgilerini Güncelleme
$ git remote set-url origin https://github.com/yeni-kullanici/repo.git
Bu komut, mevcut bir uzak deponun URL'sini değiştirir. Örneğin, depo sahipliği değiştiğinde veya depo taşındığında kullanışlıdır.
Git İş Akışı
Temel Git iş akışı, dosyalarınızı değiştirme, değişiklikleri hazırlama alanına ekleme, commit etme ve uzak depoya gönderme adımlarını içerir. Bu döngü, Git ile çalışmanın temelidir.
Değişiklikler Yapın
Dosyalarınızı düzenleyin ve geliştirin.
Bu aşamada, projenizde gerekli değişiklikleri yapıyorsunuz. Yeni dosyalar oluşturabilir, mevcut dosyaları düzenleyebilir veya silebilirsiniz.
Değişiklikleri Ekleyin
git add ile değişiklikleri hazırlama alanına ekleyin.
Değişiklikleri hazırlama alanına (staging area) eklemek, hangi değişikliklerin bir sonraki commit'e dahil edileceğini belirtir.
$ git add dosya.txt # Belirli bir dosyayı ekle
$ git add . # Tüm değişiklikleri ekle
Commit Edin
git commit ile değişiklikleri kaydedin.
Commit, hazırlama alanındaki değişiklikleri projenizin geçmişine kaydeder. Her commit, benzersiz bir kimlik (hash) ile tanımlanır.
$ git commit -m "Açıklayıcı bir commit mesajı"
Açıklayıcı ve anlaşılır commit mesajları yazmak, projenizin geçmişini daha iyi anlamak için çok önemlidir.
Push Edin
git push ile değişiklikleri uzak depoya gönderin.
Bu adım, yerel deponuzdaki commit'leri uzak depoya gönderir, böylece diğer geliştiriciler değişikliklerinizi görebilir ve çekebilir.
$ git push origin main
Git İpuçları ve En İyi Uygulamalar
Git'i daha etkili kullanmanıza yardımcı olacak bazı ipuçları ve en iyi uygulamaları derledik.
Anlamlı Commit Mesajları Yazın
Commit mesajlarınız, değişikliğin ne yaptığını ve neden yapıldığını açıkça belirtmelidir. İyi bir format şöyledir:
Kısa özet (50 karakter veya daha az)
Daha detaylı açıklama. Gerekirse birden fazla
paragraf kullanabilirsiniz. Satırları yaklaşık
72 karakterde kesin.
Sık Sık Commit Yapın
Küçük, mantıklı parçalar halinde sık sık commit yapmak, değişiklikleri takip etmeyi kolaylaştırır ve sorun çıktığında belirli bir noktaya geri dönmeyi mümkün kılar.
.gitignore Dosyası Kullanın
Geçici dosyaları, derleme çıktılarını, kişisel IDE ayarlarını ve hassas bilgileri içeren dosyaları izlememek için bir .gitignore dosyası oluşturun.
# Örnek .gitignore içeriği
node_modules/
*.log
.env
.DS_Store
.idea/
Sürümleri Etiketleyin
Sürüm numaralarını veya önemli noktaları etiketlemek, daha sonra bu noktalara kolayca erişmenizi sağlar.
$ git tag -a v1.0.0 -m "Sürüm 1.0.0"
$ git push origin v1.0.0
Dallanma Stratejinizi Belirleyin
Projeniz için uygun bir dallanma stratejisi belirleyin ve ekip üyelerinizin buna uymasını sağlayın. Bu, kod tabanınızın düzenli ve yönetilebilir kalmasına yardımcı olur.
Geçmişi Yeniden Yazarken Dikkatli Olun
Git, geçmişi değiştirmenize olanak tanır (git rebase, git commit --amend), ancak bu, zaten paylaşılmış commitler için sorunlara neden olabilir. Paylaşılmış dalların geçmişini yeniden yazmaktan kaçının.