Git-101

Bilgisayar bilimleri ile uğraşanların şüphesiz en iyi arkadaşı ve hayat kurtarıcısı “Git”. Veri bilimi meraklıları olarak, bizim de en iyi arkadaşımız olmalı mı? Kesinlikle evet! Bu yazımda Git’in ne olduğunu, neden kullanmamız gerektiğini ve nasıl başlayacağımızı açıklayacağım. İlerleyen yazılarımızda bu teknoloji ile projelerimizi etkin bir şekilde yönetmeyi öğreneceğiz.

Son zamanlarda kendimi Veri Bilimi hakkında her gün yeni bir şeyler öğrenmeye adadığım bir “challenge”a başladım. Git ile yollarımız böyle kesişti. Git dağıtık çalışan bir versiyon kontrol sistemidir. Dolayısıyla, yaptığınız değişiklikleri “commit” ettiğimiz sürece bu değişikliklerin versiyonlar altında kayıtlarını tutar. Git’in yardımıyla çalışmanızın önceki sürümlerine bile geri dönebilirsiniz. Dosyaları dağıtılmış bir şekilde depoladığı için verilerinizi kaybetmezsiniz. Hızlı ve dünyanın her yerinden erişilebilirdir. Yerel repolarınızdan veya uzak repolardan çalışabilirsiniz. Konu hakkındaki terminoloji ve terimler gözünüzü korkutmasın, yazıda ilerledikçe ara ara bunların anlamlarına değineceğiz.

Git ve GitHub aynı şey midir?

HAYIR. GitHub, versiyon kontrolü ve işbirliği için bir kod barındırma platformudur. Git dediğimiz teknoloji de bunun “versiyon kontrolü” kısmında devreye girmektedir.

Versiyon: Bir belgenin en son kaydedilen biçimi.

Versiyon kontrolü: Belgeler, programlar, web sitelerindeki değişikliklerin yönetimi.

Versiyon kontrol sistemlerini incelediğimizde 2 farklı çeşitin olduğunu görürüz:  Merkezi ve Dağıtık.

Merkezi Versiyon Kontrol Sistemleri

Herkes bir çevrim içi arşive(repository) bağlıdır. Proje üzerinde çalışırken hepsi çeşitli “commit”ler yapar ve ondan “update”ler alır. İnternet bağlantısını kaybederlerse hiçbir şey yapamaz hale gelirler ve bu durumda değişiklikler eğer “commit” edilmemişse, kaybolur.

Repository: Yazılım arşivi veya kısaca “repo”, yazılım paketleri için bir depolama konumudur. Yerel veya uzak olabilir. Yerel, cihazınızda üzerinde çalıştığınız repo anlamına gelir ve uzak, GitHub’da depolanan repodur.

Working Copy: Şu anda üzerinde çalıştığınız sürüm.

Commit: Değişiklikleri bir repoya kaydetme.

Update: Bir reponun en son sürümünü edinme.

Dağıtık Versiyon Kontrol Sistemleri

Her kullanıcı, cihazında bulunan yerel repodan ayrı olarak çalışır. Working copy üzerinde yapıulan değişiklikler “local repository”e kaydedilir. Ana repoyu (remote repository) güncellemek isterlerse, bu değişiklikleri “push”lamaları gerekir.

Push: Working repository üzerinde commit ettiğiniz değişiklikleri remote repository’e kaydetme işlemi

Pull: Değişiklikleri remote repository’den indirme, örneğin arkadaşınızla bir proje üzerinde çalışıyorsunuz. Proje için kullandığınız ortak bir GitHub reposu var. Arkadaşınız buraya en son değişiklikleri “push”ladı. Yerel reponuzun güncel kalması için bu değişiklikleri almanız gerekecektir. Bunun için “pull” komutunu kullanacağız.

Dağıtık versiyon kontrol sistemleri merkezi olanlara göre neden daha iyidir?

  • Dağıtık sistemler daha hızlıdır.
  • Sürekli internet bağlantısı gerektirmez.
  • Yapılan ve pushlanan değişiklikler kabul veya reddedilebilir.
  • Merkezi veya remote repository’e her zaman bağlı olmak gerekmez, herkes kendi local repository’sinde bulunan versiyon üzerinden çalışmalara devam edebilir, gerekli oldukça güncellemeleri remote repo’ya pushlayabilir.

Peki veri bilimciler olarak neden Git kullanmaya kendimizi alıştırmalıyız?

Artık versiyon kontrol sistemleri ve Git’in hangi kategoriye girdiği hakkında daha fazla bilgi sahibi olduğumuza göre, neden kullanmamız gerektiğini tartışabiliriz.

Git’in bize sağladığı avantajlar:

  • Daha organize takım çalışması: Kurumsal şirketlerde veya birçok kişinin beraber çalıştığı projelerde takım çalışmasını yönetmek ve kişilere atanan taskları takip etmek oldukça zordur. Aynı kod parçası üzerinde çalışan kişilerde süreç başarılı bir şekilde yönetilemezse bu durum karışıklıklara yok açar. Git sayesinde “branch” oluşturarak aynı kod parçası üzerinde güvenle çalışabilir, değişikliklerden memnun oldukça bunları master branch ile “merge” edebilir, yani birleştirebilirsiniz.
  • Zaman içerisinde yapılan değişiklikleri takip etmeyi kolaylaştırır: Değişiklikleri kim/ne zaman yaptı? Bu sürümde farklı olan nedir?
  •  Alandan tasarruf sağlar ve çalışma için yedek oluşturur.
  • Esnek, ücretsiz, hızlı,kullanımı kolay, eski versiyonlara dönmemize izin veriyor, büyük çaplı projelerde sorunsuz çalışılabiliyor.

Branch*: Bir sonraki yazımızda branch kavramı ve tiplerini detaylı olarak inceleyeğiz. Şimdilik kavrama yumuşak bir geçiş sağlamak için aşağıdaki görsel üzerinden ilerleyebiliriz.

Önceki örneğimize geri dönelim. Master branch arkadaşımızla yaptığımız ana projemizdir. Proje üzerinde çalışmaya devam edip ve zamanla değişiklikleri buraya “commit” ederek ekliyoruz. Sonra aniden önceki bölümlerde bir şeyi unuttuğumuzu ya da başka bir özellik eklemek istediğimizi fark ettik, o sürüme geri dönüp bu değişiklikler üzerinde çalışmak için ayrı bir dal yani “branch” oluşturmalıyız. Yapılan işten memnun kaldığımızda, değiştirilen özellikleri master branch ile birleştirebiliriz.

Merge*: Branch üzerinde yürüttüğümüz çalışmayı tamamladığımızda master branch veya başka bir branch ile birleştirme işlemi.

*Daha önce de bahsettiğimiz gibi branching ve merging operasyonlarına ilerleyen zamanlarda detaylıca değineceğiz. Şimdi bu kavramlar karmaşık gelebilir veya gözünüzü korkutabilir, zamanla kullanımına alışacağız.

Veri bilimi ile ilgilenen insanlar olarak bizlerin de kendimizi bir şekilde bu teknoloji ile tanıştırması ve alıştırması gerekiyor. Çoğu kurumsal şirkette ve teknoloji projelerinde iş akışları Git üzerinden takip edilmekte. İleride bu tarz ekiplerin ve çalışmaların parçası olduğumuzda üzerimize atanan taskları rahat ve güvenilir şekilde iletletebiliyor, akışı ve gelişmeleri takip edebiliyor olmamız beklenecektir. Haydi kurulumumuzu gerçekleştirelim ve yavaştan Git kullanma yolunda ilk adımımızı atalım.

Nasıl Git kullanmaya başlayabilirim?

Git’i kullandığımız işletim sistemini göz önünde bulundurarak kurmamız gerekiyor. Kurulum işlemi sonrasında “configuration” dediğimiz belli başlı ayarları da yapıp kendimizi çalışmaya hazır hale getireceğiz. Github’ın web sitesinde önerilen aşamalar şu şekilde:

  1. Windows için en son Git sürümünü edinebileceğiniz siteye “Git for Windows Installer” gidin. [1]
  2. İndirdiğiniz kurucu (installer) yardımı ile Git kurulum sihirbazının önberdiği aşamalarını takip edin. (Kurulumu yaparken Git Bash ve Git GUI eklentilerini de eklemeyi unutmayın!)
  3. Windows komut satırını veya Git Bash’i açın. Komut satırına ulaşmak için windows arama çubuğuna cmd yazabilirsiniz.
  4. Git –version komutunu burada çalıştırarak başarılı bir kurulum yaptığınızdan emin olabilirsiniz.

Git Bash: Windows komut satırına benzer bir platformdur. Buraya çeşitli kodlar yazarak projelerimizin akışını etkili bir şekilde yönetmeyi öğreneceğiz.

Git GUI: Git’in grafiksel kullanıcı arayüzü.

Masa üstünde sağa tıklayın. Git Bash yazısını göreceksiniz. Üzerine tıklayarak açın ve yazdığımız komutu çalıştırın.

Projemiz için Git takibini başlatma (Git initialization)

Git kullanmaya başlamak için sadece kurulum yeterli değildir. İnitializing dediğimiz bir aşama ve daha önce bahsettiğimiz “configuration” ayarlarıı da sisteme tanımlamak gerekir. Bu ayarları bir kere yapacağız ve sonrasında sistemde kaydolduğu için gerektikçe Git bunları oradan kullanacak.

İlk yazdığımız komutun açılımı make directory’dir. Yani bu komutla su an bulunduğumuz dosya yolunda bir klasör oluşturabiliriz. İkinci yazdığımız cd ise change directory anlamına gelir. Yani bulunduğumuz dosya yolundan gitmek istediğimiz klasör ismini vererek üzerine tıklamaya gerek olmadan klasöre erişebiliriz.

EVET! Gördüğünüz gibi oldukça kolay ve sorunsuz bir şekilde ilerliyoruz. Şimdi configuration ayarlarını tamamlayacağız.

Bu komutlar sayesinde proje üzerindeki commit edilmiş değişikliklerin kimler tarafından yapıldığını takip edebileceğiz. GitHub hesabınızdaki kullanıcı isminiz ve email adresinizi kullanmanız gerekiyor. Endişe etmeyin, projemizdeki değişiklikleri “push”lamadıkça bunlar GitHub hesabınıza yüklenmeyecektir.

Eğer son görsele dikkatli bakarsanız sağ üzt köşede çıkan mavi renkli (master) yazısını görebilirsiniz. Bu yazı şu anda bulunduğumuz dosya yolunun Git tarafından takip edilmekte olduğunu gösterir.

Aşağıdaki komutu kullanarak Git’in belirttiğimiz configuration ayarlarını kaydedip kaydetmediğini kontrol edelim:

Biraz sonra bahsedeğimiz komutla ise “status” yani durum kontrolü yapılır. Bu kontrolde Git bize üzerinde çalışmakta olduğumuz versiyon ile son commit edilmiş versiyon arasındaki farkları gösterir.

Henüz klasörümüze herhangi bir şey eklemediğimiz için veya herhangi bir commit işleminde bulunmadığımız için boş görünüyor. Tipik bir veri bilimi projesinde buraya ekleyeceğimiz veri setimiz, readme dosyamız ve kodlarımız olacaktır.

Bu yazıyı şimdilik burada sonlandırıyoruz. Bir sonraki yazıda aşağıdaki konuları detaylı bir şekilde ele alacağız.

  • Projelerimizi nasıl Git takibine alırız ve değişiklikleri nasıl ekleriz?
  • “Staging” nedir, neden önemlidir ve nasıl yapılır?
  • Değişiklikler nasıl “commit” edilir?
  • Çalışmalarımızın eski versiyonlarına nasıl dönebiliriz?
  • “Branching” ve “Merging” operasyonları nasıl yapılır?
  • Değişiklikleri GitHub hesabımıza nasıl “push”larız veya oradaki değişiklikleri nasıl local repositorymizde güncelleriz(“pull”)?
  • Bir başkasının GitHub hesabındaki çalışmaları kendi local repositorymize nasıl klonlarız?
  • Git kullanımında sektörde uygulanan bazı genel/geçer kurallar ve düzgün kullanım örnekleri (common conventions&best practices).

Git kullanmaya alışmak bir süreçtir. Zamanla kullandıkça çok rahat bir şekilde kendi çalışmalarımızı yürütebiliyor hale geleceğiz ve hayatımızı oldukça kolaylaştırdığını fark edeceğiz. Bir sonraki yazıda detaylı bir şekilde kullanıma gireceğimiz için kavramlara alışmak zaman alacaktır. Bu sebeple diğer yazı hazır olana kadar incelemeniz veya kendi kendinize pratiklerde bulunmanız için aşağıya bazı kaynaklar da paylaşıyor olacağım. Umarım Git’in neden önemli olduğunu ve nasıl kullanmaya başlayabileceğimizi açık ve anlaşılır bir şekilde anlatabilmişimdir. Bir sonraki paylaşımda görüşmek dileğiyle!