1. Giriş ve Git'in Önemi Yazılım geliştirme alanındaki hızlı ilerlemeler, internet altyapılarının ve teknolojik donanımların gelişimi, otomasyon sistemleri ve endüstriyel gelişmeler yazılım teknolojilerinin yaygınlaşmasına neden olmuştur. Günümüzde yazılımlar bankacılıktan savunmaya, sağlık alanından üretime kadar pek çok sektörde aktif olarak kullanılmaktadır. Bu durum, yazılım projelerinin giderek daha büyük ve karmaşık hale gelmesine yol açmış, dolayısıyla profesyonel proje yönetiminde Git ve rsiyon kontrol sistemi (VCS) gibi araçların önemini artırmıştır. Kitap, "özellikle yazılım geliştiriciler tarafından yoğun bir şekilde kullanılmaktadır" belirtildiği üzere, Git'in yazılım dünyasındaki vazgeçilmez yerini vurgulamaktadır. Yazılım geliştirme sürecindeki aksaklıklar, sürekli değişiklikler ve güncellemeler göz önüne alındığında, "versiyon kontrol sistemleri yazılım dünyasında hayat kurtarıcı rolüyle gündeme gelmektedir." Git, sadece yazılım geliştirme süreçlerinde değil, aynı zamanda makale veya kitap yazımı gibi sürekliliği olan ve kontrollü ilerlemesi gereken tüm projelerde de kullanılabilir. Versiyon kontrol sistemleri, yapılan tüm önemli işlemlerin kaydedilmesine, önceki kayıt noktalarına dönülmesine, değişikliklerin karşılaştırılmasına ve sorunlara kimin neden olduğunun tespit edilmesine olanak tanır. Ayrıca, "bilgisayarınıza bir şey olduğunda ya da tüm dosyalarınız silindiğinde, erişiminiz koptuğunda, kolayca uzak repodan kalındığı yerden devam edebilme güvenini" sunar. 2. Versiyon Kontrol Sistemlerinin Türleri Versiyon kontrol sistemleri, evrimsel bir süreçten geçerek farklı türlerde ortaya çıkmıştır: Yerel Versiyon Kontrol Sistemleri (LVCS): İlk zamanlarda bireysel olarak bilgisayarlarda manuel yedekleme şeklinde kullanılan bu sistemler, projenin farklı dizinlerde kopyalarını oluşturma prensibine dayanır. Revision Control System (RCS) bu türün bir örneğidir. Ancak, grup çalışmalarında verimlilik sağlamakta yetersiz kalabilirler. "RCS dosyalar arasındaki farkları özel bir biçimde tutarak, daha sonra tüm dosyaları ekleyerek herhangi bir zamanda bir dosyanın nasıl göründüğünü yeniden oluşturabilmektedir." Merkezi Versiyon Kontrol Sistemleri (CVCS): Birden fazla geliştiricinin ortak bir noktada çalışabilmesi sorununu çözmek için geliştirilmiştir. Tüm sürümleri içeren merkezi bir sunucu ve bu sunucudan dosya alan istemcilerle çalışır. SVN (Subversion) piyasadaki en popüler merkezi VCS'dir. Dezavantajı, merkezi sunucunun zarar görmesi durumunda tüm çalışmaların tehlikeye girebilmesidir, çünkü proje tek bir noktaya bağımlıdır. Dağıtık Versiyon Kontrol Sistemleri (DVCS): Günümüzde en yoğun kullanılan versiyon kontrol sistemleridir. Git ve Mercurial gibi bilinen DVCS'ler, geliştiricilerin sadece projenin son halini değil, "projenin tam geçmişini de kendi bilgisayarlarına indirerek çalışmalarını gerçekleştirmektedirler." Bu sayede, sunucuda veya çalışanların bilgisayarlarından herhangi birinde bir problem olsa bile, "çok daha sınırlı bir kayıp oluşabilmekte ve genellikle de hiç kayıp oluşmamaktadır." Git, bu sistemler arasında dünya genelinde en popüler olanıdır. 3. Git'in Temel Kavramları ve Çalışma Mantığı Git, Linus Torvalds tarafından 2005 yılında Linux çekirdeği projesinin yönetim ihtiyaçları doğrultusunda geliştirilmiş, açık kaynak kodlu bir projedir. Hız, basit kullanım, dallanabilme (branching) yapısı ve dağıtık mimarisi ile öne çıkar. Google, Microsoft, Netflix gibi büyük şirketler tarafından tercih edilmektedir. Git'in çalışma mantığının temelinde üç ana durum bulunur: Working Directory (Çalışma Dizini): Projenin bulunduğu, üzerinde işlemlerin yürütüldüğü, dosya ve dizinlerin takip edildiği alandır. Burada yapılan değişiklikler henüz kaydedilmemiştir. Staging Area (Hazırlama Alanı): Çalışma dizininde yapılan ve bir sonraki aşamada kaydedilmek (commit edilmek) istenen dosyaların işaretlendiği alandır. Repository'ye gönderilmeden önceki kontrollü geçişi sağlar. Repository (Depo): Yapılan değişikliklerin takip edildiği, gerekli işaretlemelerin yapıldığı ve kaydedilmek istenen tüm işlemlerin güvenli bir şekilde saklandığı yerel veri tabanıdır. Commit (Kayıt): Git'in en önemli işlemlerinden biridir. "Git ile projenin durumu sabitlenmek, kaydedilmek istenildiğinde tüm dosyaların o anki görünümünün bir resmi çekilir ve bir referans numarası ile bu işlem kaydedilir." Her commit benzersiz bir SHA-1 özet algoritması ile oluşturulmuş 40 karakterlik bir ID'ye sahiptir. Bu ID, veri bütünlüğünü sağlar ve projenin geçmişindeki belirli bir noktaya erişimi mümkün kılar. Tracked / Untracked Files: Git tarafından izlenen dosyalar "tracked", izlenmeyen dosyalar ise "untracked" olarak sınıflandırılır. Yeni oluşturulan dosyalar varsayılan olarak untracked'dır ve git add komutuyla staging area'ya alınarak tracked hale getirilir. Temel Git Komutları ve İşlemleri: git init: Bir proje dizininde Git versiyon kontrol sistemini başlatır ve .git dizinini oluşturur. git status: Çalışma alanındaki değişiklikleri (yeni, değiştirilmiş, silinmiş, izlenen, izlenmeyen dosyalar) gösterir. git add <file> / git add *: Belirtilen dosyayı veya tüm değişiklikleri hazırlama alanına (staging area) ekler. git commit -m "Mesaj": Hazırlama alanındaki değişiklikleri yerel depoya kaydeder. -a parametresi ile izlenen dosyalardaki değişiklikler doğrudan commit edilebilir. git log: Depodaki tüm commit kayıtlarını detaylı bir şekilde listeler. --oneline, --graph, --author, --since, --before, --pretty gibi parametrelerle özelleştirilebilir. git diff: Çalışma dizini ile hazırlama alanı arasındaki veya iki commit arasındaki değişiklikleri gösterir. --staged parametresiyle hazırlama alanındaki değişiklikler incelenebilir. git rm <file> / git rm -r <directory>: Git tarafından takip edilen bir dosya veya dizini hem çalışma dizininden siler hem de takipten çıkarır. git mv <old_name> <new_name>: Bir dosyanın veya dizinin adını değiştirir veya konumunu taşır. git restore --staged <file>: Hazırlama alanındaki bir değişikliği çalışma dizinine geri döndürür (unstage eder). git restore <file> / git reset HEAD --hard: Çalışma dizinindeki değişiklikleri depodaki son kaydedilen haline geri döndürür. .gitignore: Git tarafından takip edilmesi istenmeyen dosya ve dizinleri belirtmek için kullanılır. Reset vs. Hard Reset: Git'te geçmiş commitleri yönetmek için reset ve hard reset komutları kullanılır: git reset <commit_id>: Belirtilen commite kadar olan commitleri geçmişten siler, ancak bu commitlerde yapılan değişiklikleri çalışma alanında tutar. git reset --hard <commit_id>: Belirtilen commite kadar olan commitleri geçmişten siler ve bu commitlerde yapılan tüm değişiklikleri çalışma dizininden de siler. "Bu işlem reset işlemine göre çok daha risklidir." Özellikle dikkatli kullanılmalıdır. Yanlışlıkla yapılan bir hard reset, üzerinde çalışılan son değişiklikleri kaybolmasına neden olabilir. 4. Branch (Dal) Yönetimi Branch kavramı, Git'in en güçlü özelliklerinden biridir. "Ana projeden ayrılan çalışmaların ilerleyen süreçte, projeyle birleştirilmesini temel alan bir yaklaşım vardır." Bu sayede, geliştiriciler ana projeyi etkilemeden farklı özellikler üzerinde paralel olarak çalışabilirler. Yeni Branch Oluşturma: git branch <branch_name> ile yeni bir dal oluşturulur. git checkout -b <branch_name> veya git switch -c <branch_name> komutları hem yeni bir dal oluşturur hem de o dala geçişi sağlar. Branch Değişimi (git checkout <branch_name> / git switch <branch_name>): Farklı dallar arasında geçiş yapmayı sağlar. Geçiş yapıldığında, çalışma dizini aktif olan dala göre şekillenir. HEAD Kavramı: HEAD, projenin o anki konumunu, yani hangi dal üzerinde ve hangi commit üzerinde çalışıldığını işaret eder. "Head projenin yönünü belirler." Branch Birleştirme (git merge <branch_name>): Farklı dallarda yapılan çalışmaları ana dala veya başka bir dala birleştirmek için kullanılır. Bu işlem sırasında otomatik olarak bir commit de oluşturulur. Fast Forwarding: Eğer ana dal (örneğin master) üzerinde, yan dal (örneğin test1) oluşturulduktan sonra herhangi bir yeni commit yapılmadıysa, birleştirme işlemi "fast forwarding" olarak gerçekleşir. Bu durumda, ana dalın HEAD'i yan dalın son commit'ine taşınır ve sanki tüm değişiklikler ana dal üzerinde yapılmış gibi görünür. Merge Conflict (Çakışma): İki farklı dalda aynı dosyanın aynı bölgelerinde değişiklik yapıldığında ve bu dallar birleştirilmeye çalışıldığında ortaya çıkar. Git, hangi değişikliğin kalacağına karar veremediği için kullanıcıdan manuel müdahale ister. git status komutu ile çakışan dosyalar belirlenir ve bu dosyalar manuel olarak düzenlendikten sonra git add ve git commit ile çakışma çözülür. Branch Listeleme: git branch (tüm yerel dalları), git branch -v (son commit özetleriyle birlikte), git branch --all -r -v (uzak ve yerel tüm dalları) komutlarıyla dallar incelenebilir. Branch Silme (git branch -d <branch_name> / git branch -D <branch_name>): Bir dalı silmek için kullanılır. -d parametresi sadece birleştirilmiş dalları silerken, -D parametresi birleştirilmemiş dalları dahi zorla siler. Dikkatli kullanılmalıdır. Branch İsmi Değiştirme (git branch --move <old_name> <new_name>): Yerel depodaki bir dalın adını değiştirmek için kullanılır. Uzak depodaki ismin de değiştirilmesi gerekiyorsa ek işlemler yapılır (eski uzak dal silinir, yeni isimli dal push edilir). 5. Git Stash (Değişiklikleri Geçici Saklama) Stash, bir dal üzerinde yapılan ve henüz commit edilmemiş değişikliklerin, farklı bir dala geçmek istendiğinde geçici olarak saklanması için kullanılan bir özelliktir. Bu sayede, üzerinde çalışılan dal kirli bırakılmadan başka bir dala geçilebilir ve daha sonra stash'lenen değişiklikler geri getirilebilir. git stash: Çalışma dizinindeki ve hazırlama alanındaki değişiklikleri stash'e kaydeder. git stash list: Stash'e kaydedilmiş tüm değişiklikleri listeler. git stash apply <stash@{sayı}>: Belirtilen stash'i çalışma dizinine uygular, ancak stash'ten silmez. git stash pop <stash@{sayı}>: Belirtilen stash'i çalışma dizinine uygular ve stash listesinden siler. git stash clear: Tüm stash kayıtlarını temizler. 6. Git Alias (Kısayol Tanımlama) Alias, uzun Git komutlarını daha kısa ve akılda kalıcı isimlerle kullanmak için kısayollar tanımlamayı sağlar. Bu, çalışma verimliliğini artırır. Yerel Alias Tanımlama (git config --local alias.<kısayol_adı> "<uzun_komut>"): Sadece aktif depo için geçerli kısayollar oluşturur. Global Alias Tanımlama (git config --global alias.<kısayol_adı> "<uzun_komut>"): Tüm depolarda kullanılabilecek genel kısayollar oluşturur. Alias İnceleme (git config --get alias.<kısayol_adı>): Tanımlı bir alias'ın içeriğini gösterir. Alias Değiştirme: Alias'ı yeniden tanımlayarak (git config --global alias.<kısayol_adı> "<yeni_uzun_komut>") içeriği güncellenebilir. Alias Kaldırma (git config --unset alias.<kısayol_adı>): Tanımlı bir alias'ı siler. 7. GitHub Entegrasyonu GitHub, Git depolarının uzakta saklandığı popüler bir platformdur. "Yazılım dünyasında git denildiğinde yanında Github anıldığı için" bu platformun Git ile entegrasyonu büyük önem taşır. GitHub, sadece bir depolama alanı olmanın ötesinde, işbirliği, proje paylaşımı, proje detayları ve geliştirici takibi gibi birçok önemli özellik sunar. Depo Oluşturma: GitHub üzerinde public (herkese açık) veya private (özel) depolar oluşturulabilir. Push (git push <remote_name> <branch_name>): Yerel depodaki değişiklikleri uzak depoya (GitHub'a) gönderir. -u parametresiyle kullanıldığında (örneğin git push -u origin master), uzak depo ve dal bilgileri hatırlanır, sonraki push işlemleri daha kısa komutlarla yapılabilir. Clone (git clone <repo_url>): Uzak depodaki bir projenin tamamını yerel çalışma dizinine kopyalar. Projenin tüm geçmişini (commitleri) de indirir. Not: Kendi projeniz dışındaki public repoları clone aldığınızda, doğrudan o repoya push yapamazsınız. Bu, projenin güvenliği için zorunlu bir durumdur. Fetch (git fetch <remote_name> <branch_name>): Uzak depodaki değişiklikleri yerel depoya getirir, ancak bu değişiklikleri yerel çalışma dizini veya dallarla birleştirmez. Sadece kontrol etmek amacıyla kullanılır. Getirilen değişiklikler origin/branch_adi alanında saklanır. Pull (git pull <remote_name> <branch_name>): Uzak depodaki değişiklikleri getirir ve yerel dal ile otomatik olarak birleştirir (fetch ve merge işlemlerini bir arada yapar). Önce fetch ile değişiklikleri kontrol edip sonra pull ile birleştirmek genellikle daha güvenli bir yaklaşımdır. Pull Request: Geliştiricilerin bir projeye katkıda bulunmak için değişikliklerini önerdiği bir mekanizmadır. İki dal arasındaki değişiklikler GitHub tarafından kontrol edilir ve çakışma olmadığında birleştirme (merge) önerilir. Proje sahibi, gelen pull request'i inceleyip onaylayarak değişiklikleri ana projeye entegre edebilir. Fork: GitHub'da paylaşılan genel bir projenin bir kopyasını kendi profilinize almak işlemidir. "Fork çatallama, dallandırma gibi düşünülebilir." Fork işlemi sayesinde, projenin sahibi siz olursunuz ve üzerinde clone, push gibi işlemleri yapabilirsiniz. Yapılan değişiklikler, orijinal projeye Pull Request olarak gönderilerek katkıda bulunulabilir. Watch: Beğenilen proje üzerindeki değişikliklerden haberdar olmak için kullanılan bir özelliktir. Star: Beğenilen projeyi işaretleyerek daha sonra kolayca erişim sağlamak için kullanılır, sosyal medyadaki beğeni kavramına benzer. 8. Temel Linux Komutları Git işlemleri genellikle terminal üzerinden yapıldığı için temel Linux komutlarına aşina olmak faydalıdır. Kitapta, sık kullanılan bazı komutlar ve açıklamaları verilmiştir: $ / #: Normal kullanıcı / yönetici (root) yetkileriyle çalışıldığını gösterir. . / ..: Bulunulan dizini / bir üst dizini simgeler. | (pipe): Bir komutun çıktısını diğerine girdi olarak verir. > / >>: Metinsel ifadeyi dosyanın içine yazar (varsa siler) / sonuna ekler (varsa ekler). clear: Terminal ekranını temizler. whoami: Oturum açmış kullanıcı adını gösterir. date: Tarih ve saat bilgisini verir. pwd: Çalışılan dizinin tam yolunu gösterir. history: Son kullanılan komutları listeler. ls: Dosya ve dizinleri listeler (-l detaylı, -a gizli dosyalar dahil). cd: Dizin değiştirmek için kullanılır. cat: Bir dosyanın içeriğini ekrana yazdırır. echo: Belirtilen içeriği ekrana yazdırır. grep: Metin içerisinde arama ve yakalama işlemi yapar. cp: Dosya ve dizinleri kopyalar. mv: Dosya ve dizinleri taşır veya ismini değiştirir. rm: Dosya ve dizinleri siler (-r dizinler için). df: Sistemdeki disk ve bölümler hakkında bilgi verir. id: Oturum açmış kullanıcının grup bilgilerini gösterir. uname: Sistemle ilgili bilgileri ekrana yazdırır. Bu belge, verilen kaynakların ana temalarını ve en önemli fikirlerini/gerçeklerini özetlemektedir. Git'in yazılım geliştirme süreçlerindeki hayati rolünü, versiyon kontrol sistemlerinin türlerini, Git'in temel çalışma prensiplerini, dallanma ve birleştirme mekanizmalarını, değişikliklerin geçici olarak saklanmasını sağlayan stash özelliğini, komut kısayolları için alias kullanımını ve GitHub gibi uzak depo platformlarıyla entegrasyonunu vurgulamaktadır. Her bölümde, okuyucunun konuyu anlamasını kolaylaştırmak amacıyla ekran görüntüleri ve kod açıklamaları ile zenginleştirilmiş uygulamalı örnekler sunulmuştur. ... Devamını Oku