Yazılım Sürüm Sistemi (Git) nedir?

Yazılım geliştirme işlemi ile en az bir defa ilgilendiyseniz, en basitinden sadece bir tane programlama dilini amatör düzeyde bile öğrenmeye çalıştıysanız muhakkak GitHub, GitLab, Git-scm veya Gitea kavramlarından bazılarını kesin olarak en az bir tane duymuşsunuzdur. Bunlardan GitHub ve GitLab gibi sistemlerin bir internet sitesi olduğu, Git-scm gibilerin de bir bilgisayar programı olduğu konusunda bir şeyler öğrenmişsinizdir. Fakat giriş düzeyinde yazılım öğrenenlerin hiç biri Git kavramını tam olarak kavrayamayabilir.

Git gibi sistemleri kendin kullanana kadar hiçbir şekilde tam kavramları anlayamıyorsun. Zira bunları internetten öğrenmek çok zor. Çünkü internette bu konu üzerine yazılmış olan makaleler ya kendileri de konuya tam hakim olmadığından yada sadece havalı göründüğünü düşündükleri için (sana kendini geri zekalı gibi hissettirmek için) aşırı derecede jargon ifadeler kullanıyor, Git ile ilgili kavramları aşırı anlaşılmayacak şekilde yan yana ve alt alta diziyorlar. Dolayısıyla konu anlaşılmaz bir hale geliyor. Örnek olarak makalelerde geçen bir cümle aşağıdaki gibi olabilir.

Git reponuza dosyaları push etmeden önce için origin master üzerinde commit yapıyoruz.

Dolayısıyla burada arkadaşlar, git, repo, push, origin, master ve commit kavramlarını bildiğini var sayıyor. İşin garip tarafı diğer yayıncılar da böyle saydığı zaman internette bunu anlamak kendin yapana kadar imkansız oluyor. Dolayısıyla git kavramlarını anlamak için bazı kavramları anlamak gerekiyor. Bu kavramlar da aşağıdaki gibidir:

Git: Yazılım geliştirmek çok zor ve çok sayıda insanın ortaklaşa çalışmasını gerektirecek bir işlemdir. Aynı kayak kod üzerinde ve hatta aynı dosya üzerinde birden fazla geliştiricinin çalışması gerekiyor, testler yapılması lazım, hataların ayıklanması lazım, bu arada eski dosyaların saklanması ve kodun sık sık hatalı veya kabul edilmeyecek bir kod yazıldığında tekrar geri yükleyebilmek için yedek alınması lazım, kod üzerinde yapılan işlem geçmişinin takip edilmesi lazım, aynı zamanda o kod eğer herkesin ulaşabildiği açık kaynaklı bir kod ise başka ekiplerin o kod üzerinden yeni yazılımlar yapması lazım.

İşte bunun gibi çok fazla sayıda işlemi yapmak için geliştirilmiş yazılım geliştirme ortamlarına git denilmektedir. Zaman içerisinde bu işlemleri ve çok daha fazlasını geliştirmek için çeşitli git yazılımları geliştirilmiş, bunların bulut tabanlı olanları veya kendi bilgisayarın üzerinde çalışan türleri geliştirilmiştir.

Temel olarak yapılan işlemi anlamak için şu örneği verebiliriz. Diyelim ki projemizde bulunan helloworld.py adlı dosyada bir değişiklik yaptık, yeni bir algoritma yazdık bu dosyaya. Bu yazılan algoritma doğal olarak bir insanın elinden (senin elinden) çıktığı için hata içeriyor olabilir. Bu kod yazılımda hatalara sebep olması durumunda geri alınarak yazılımı önceki sürümüne geri yüklememiz gerekebilir. Bu sebeple hem dosyanın önceki değiştirilmemiş sürümünün sunucuda bir yerlerde saklanması lazım, hemde yeni sürümünün de sunucuya yüklenmesi lazım. Ayrıca bu dosyada yaptığın değişikliği kısaca birkaç kelimeyle de açıklayarak neyi değiştirdiğini diğer yazılımcılara söylemen ve onların kontrol etmesini kolaylaştırman gerekir.

İşte bu dosyanın sürümlerini, yapılan değişikliklerin listesini, dosyanın zaman içerisindeki evrimini ve diğer her şeyi takip eden bu yazılımlara Git yazılımları veya Sürüm Kontrol Sistemi denilmektedir.

Repository: Bir yazılımın genellikle birden fazla dosyası bulunur. Bu dosyaları bilgisayarında bir klasörde de tutabilirsin, bulut tabanlı bir git sistemi olan Github’a yükleyerek projen üzerinde çalışan diğer programcılara da sunabilirsin. İşte yapmış olduğun yazılım geliştirme projesine ait kaynak kodların tutulduğu bu klasör veya Github bölümüne Repository denilmektedir. Repository kelimesi ingilizcede Depo demektir. Dolayısıyla bazı kaynaklarda Depo ifadesini de görebiliyoruz. İkisi de aynı anlama geliyor. Bir depoda nasıl kutular saklanıyorsa bu depoda da dosyalar saklanıyor gibi düşünebiliriz.

Staging Area: Aslen bir kaynak kodu üzerinde git sistemi ile değişik yapmak çok iyi bir yöntem değildir. Çoğu git sistemi direk depo üzerinde yayınlanan dosya üzerinden değişiklik yapmayı sağlayacak online kod editörleri geliştirmiş olsa da genellikle kodların tamamını bilgisayarına indirip Visual Studio Code, Microsoft Visual Studio jetBrains veya Netbeans gibi kod editörlerinde dosyalar üzerinde değişiklikler ve testler yapılır, sonra değişen dosyalar tekrar uzak depoya (Github veya Gitea üzerinden barındırılan dosyalara) yeni sürümler yüklenir. İşte bu değişen dosyaları yükleme işlemini yapmadan önce üzerinde işlem yaptığın dosyaların değiştirdiğin kısımlarının işlenerek ön belleğe alındığı yere Staging Area deniliyor. Genellikle git sistemlerinde add komutu ile değişiklik yaptığın dosyaları işlemek üzere Staging Area’ya gönderirsin. Aslen add komutunu kullandığında git sistemi depo üzerinde .git veya .github adında bir klasör oluşturur, bu klasör üzerinde senin yazmış olduğun değişiklikleri inceler ve çeşitli şifreler kaydeder. Daha sonra bu şifreleri incelemeleri git sistemine göndermek üzerine depolar.

Remote Repo / Local Repo: Çalışılan kaynak kodunun tutulduğu yere Depo veya Repo/Repository denildiğini söylemiştim. Çoğu yazılımcıların bu kaynak kodları kendi bilgisayarına indirip bazı Kod Editörleri ile (IDE yazılımları ile) kod üzerinde çalıştığını ve sonrasında bunu git sistemine yüklediğini söylemiştim. İşte yazılımın bulut sunucusunda tutulan ve herkesin yapmış olduğu değişiklikleri oraya kaydettiği depoya Remote Repo deniliyor. Örneğin yapmış olduğun değişikliği GitHub Reposuna yüklersen eğer Remote Repo’ya kodları göndermiş olursun. Local Repo ise Remote Reponun bilgisayarında depolandığı klasörüdür. Kodlar üzerinde senin yaptığın değişiklikleri Remote repoya gönderirsin, kendi Local Reponu da Remote Repo ile eşitlersin. Dolayısıyla proje üzerinde senin yaptığın çalışma diğer yazılımcılara giderken onların yapmış olduğu çalışmalar da senin bilgisayarına gelir. Bilgisayarında eşitlenen bu kopyaya da Local Repo deniliyor.

Clone: Üzerinde çalışılacak olan projenin local repoya indirilmesi işlemine klonlama işlemi denir. Bu da terminal üzerinden vermiş olduğun bir git clone komutu ile gerçekleşiyor.

Commit: Bir yazılım genellikle birden fazla kod dosyasından oluşur ve bu kodlar yazılımın sürümleri ilerledikçe değişir, gelişir veya silinir. Yani kodun zaman içerisinde bir evrimi söz konusudur. Dolayısıyla da bu evrimleşme sürecinin diğer yazılımcılar tarafından takip edilmesi gerekir. Bu takip etme işlemini takip etmek için yapılan işleme commit deniliyor. Commit işlemi, sen daha önce add işlemi yaparak Staging Are’ya gönderdiğin dosya değişikliklerine bir mesaj ekliyorsun. Örneğin az önceki helloword.py dosyasına “Merhaba dünya işlemine ilave olarak kullanıcının adını sorarak direk o ada merhaba diyen işlem eklendi” şeklinde bir mesaj yazıyorsun. Bu dosya daha sonra Remote Repo’ya gönderildiğinde dosyanın yeni sürümünün hemen yanında yazmış olduğun bu mesaj diğer geliştiricilerin kontrol etmesi için bir açıklama olarak görüntüleniyor.

Push: Bazı dosyaların üzerine yeni algoritmalar yazdık, değişiklik yaptık. Yapmış olduğumuz değişiklikleri add komutu ile Staging Area’da işledik, Commit ile yapmış olduğumuz değişiklikleri ayrı bir sürüm olarak bir mesaj ile işaretledik, şimdi sıra geldi bu dosyaları Remote Repoya yüklemeye. Bu yükleme işlemine de Push etmek deniliyor. Aslında Push demek ingilizcede itmek, ittirmek deniliyor. Bunu değiştirdiğin dosyaları uzak sunucuya (Remote Repoya) ittiriyorsun gibi düşünebilirsin. Bu işlemi yapmak için terminalden “git remote add origin” şeklinde bir komut veriyorsun, bu komutun yanına boşluk bırakarak git sisteminin sana vermiş olduğu uzak depo URL adresini yazarak git sistemine dosyaları bu repo üzerine yüklemek istiyorum diyorsun. Sonrasında yine terminalde “git push -u origin master” komutunu kullanarak dosyaları uzak sunucuya göndermiş oluyorsun. Yani dosyaları uzak sunucuya göndermek için push komutunu kullandığımız için bu işleme de push deniliyor.

Origin Master: Az önce “remote” komutuyla bilgisayarımıza kurmuş olduğumuz git terminaline uzak reponun adresini belirttiğimizi söylemiştik. Bu adres genellikle github.com/username/project.git şeklinde bir adrestir. Bu direk deponun kendisini gösteriyor. İşte deponun kendisini gösteren adrese Origin deniliyor. Fakat bu project.git deposu üzerinde çeşitli yazılımcılar çeşitli geliştirmeler yaparak kaynak kodun yeni dallarını üretebilir. Yani aynı kaynak kodunu alıp üzerinde değişiklikler yaparak yeni bir yazılım veya o yazılımın daha gelişmiş bir versiyonunu üretebilirler. Buna dal deniliyor. İşte O depo üzerinde yükleme işlemini hangi dal üzerinde yapmak istiyorsan Origin ifadesinden sonra o dalın adını yazıyorsun. Örneğin Origin Master dediğin zaman “bu deponun Master isimli dalına bu çalışmaları yükle” demiş oluyoruz.

Not: Tüm bu işlemleri daha iyi anlamak için bilgisayara kurulan bir git yazılımı ve terminali olan Git-scm yazılımını indirip, bilgisayarına bir proje klasörü oluşturup kendi git deponuzu başlatarak daha iyi anlayabilirsiniz. Git-scm’yi kurduktan sonra proje klasörünün olduğu yerden bir terminal penceresi açarak önce “git init” komutu vererek o klasörden bir git işlemi başlatıyorsun. Daha sonra sırasıyla “git add .”, “git commit –m “mesajın””, “git remote origin master https://github.com/username/project.git” ve son olarak “git push -u origin master” komutu vererek dosyaları project.git deposuna yüklemiş oluyoruz. Burada ki master ifadesini project.git deposundaki hangi dala yükleme yapacaksak o dalın adını yazmalıyız. Örneğin ben çalışmamı “helloworld” dalına yüklemek istersem yeni komutum “git push -u origin helloworld” olur. Bu işlemleri daha iyi anlamanın tek yolu Git-scm terminal yazılımını bilgisayarına indirip kendine Github, Gitlab veya Gitea üzerinden deneme amaçlı bir depo oluşturup o depoya kodlar yükleyerek anlayabilirsin.

TEPEYE DÖN