Her yazılımcının araç çantasında mutlaka bulunan Git ve GitHub’a göz atalım.

Bu konu başlığı altında; uygulama kaynak kod dosyalarının ve projelerinin sürüm kontrolünü gerçekleştirmek ve aynı proje, hatta aynı kod üzerinde ekip arkadaşlarınız ile birlikte çalışabilmek için tüm yazılımcılar ve tabii ki veri bilimcileri arasında en popüler olan versiyon kontrol sistemi Git ve bu çalışmaları depolamanızı ve yönetmenizi kolaylaştıran ortam olan GitHub’a değineceğiz.

Okuyucu ile sohbet bölümü(Teknik bilgi içermez. İsterseniz atlayın, ister sohbete katılın)

Esasında Git ile çalışmak ve birlikte GitHub, BitBucket, hatta AWS gibi bulut ortamlarının kendi versiyon yönetim sistemleri üzerinde proje yürütmek başlı başına ayrı bir eğitim bölümü yada kurs olmalı. Git ile çalışmanız önem olarak bu seviyededir. Ama biz burada şimdilik ihtiyacımız kadarına değinelim ve ilerleyen konularda örnek projelerinizi Git ile bütünleşik kullanmanız için gereken temel bilgiyi edinmenizi sağlayayım istiyorum. Böylece bir taraftan veri bilimi, makine öğrenmesi ve yapay zeka üzerine kendinizi yetiştirirken diğer taraftan da ileride gireceğiniz mülakatlarda size mutlaka sorulacak olan GitHub reposu adresinizi paylaşabilir ve oradaki örnek projelerinizi alan bilginizin ve tecrübenizin kanıtı olarak gösterebilirsiniz.

Özetle, “Aynası iştir kişinin, lafa bakılmaz” atasözümüz oldukça geçerlidir sektörümüzde. Başvuracağınız her işyeri sözleriniz ile değil, daha önce geliştirdiğiniz projeler ile becerilerinizi ölçmek ister. Yaptığınız her işi, geliştirdiğiniz her projeyi, yazdığınız her kodu GitHub üzerinde bir depoda tutmak, bir gün onca zamanı nasıl geçirdiğiniz sorulduğunda açıp gösterecek bir deliliniz olmasını sağlar. Çalışmalarınızı herkese açık(public) ya da özel(private) şekilde depolayabilirsiniz. Dolayısıyla paylaşmak istemediğiniz ya da projenizin özellik ve hassasiyetine, çalıştığınız şirketin kurallarına binaen yayınlayamayacağınız kodlarınızı da özel ve gizli tutabilirsiniz. Gerektiğinde projelerinizden bahsederken kontrollü bir şekilde gösterebilir, üzerinden anlatabilirsiniz. Zaten hiç bir firma sizden başka bir şirket için geliştirdiğiniz kodu gönderin biz rahat rahat geniş zamanda inceleyelim demeyecektir. Eğer böyle söylüyorlarsa da görüşmeyi o noktada sonlandırın derim. Etik değerlere önem vermeyip, kod çalmaya çalışan sahtekarlar, size de gereken değeri maddi, manevi veremez zaten.

Sürüm kontrolünün ne olduğu konusunda temel bir bilgi olmadan Git ve GitHub’ın işleyişi hakkında fikir sahibi olmak zordur. Dolayısıyla önce sürüm kontrolü nedir sorusunun cevabını arayalım.

Sürüm Kontrol Sistemi Nedir, Ne işe yarar?

Sürüm kontrol sistemi, en basit şekliyle belgelerinizdeki değişiklikleri takip etmenizi sağlar. Bu, bir hata yaparsanız belgenizin eski sürümlerine, yani hata olmayan versiyonuna dönmenizi kolaylaştırır. Böylece ekip arkadaşlarınızla birlikte kod geliştirmeyi çok daha kolay hale getirir. Bir başkası sizin kodunuz üzerinde çalışırken bir şeylerin bozulacağı ve emeğinizin kaybolacağı konusunda endişe etmezsiniz, siz de başkalarının kodu üzerinde çalışırken bir hata yapacağınızdan ve yaptıkları işi bozacağınızdan endişe duymazsınız. Nasıl olsa tüm hatalar artık geri alınabiliyor. Bir nevi zaman makinesi gibi. Sürüm kontrol sistemleriyle “geçmişe dönebiliyorsunuz”.  

İşte sürüm kontrolünün nasıl çalıştığını gösteren bir örnek. 

Diyelim ki bir alışveriş listesi yaptınız ve dediniz ki “Aklıma gelmeyen başka eksikler de olabilir. Bir kez de eşim görsün, varsa benim aklıma gelmeyen şeyler, o eklesin. Hatta WhatsApp aile grubunda bu listeyi ekleme yapılabilecek bir form olarak paylaşayım, belki çocukların da istediği bir şeyler vardır.”  

Sürüm kontrolü olmadan bu işi çözmeye çalışırsanız, “Markete gidiyorum, istediğiniz bir şey var mı?” sorusunun ardından herkesin kendi ayrı listesi olacak ve o listeleri birleştirip ortak bir liste oluşturmak başlı başına eziyet olacaktır. 

Sürüm kontrolü ile bu işi çözdüğünüzde ise, herkes diğerlerinin eklediklerini görür, kendi farklı olan ihtiyaçlarını ekler ve sonuçta en az efor, en az karmaşa ile tam olarak neye ihtiyacınız olduğunu bilirsiniz.

Git Sürüm Kontrol Sistemi

Git ve Github ile Çalışmak 1

Git; bir Linux kullanıcısı ve hayranı olarak gururla söyleyebileceğimiz gibi Linux’u da yazan Linus Torvalds tarafından kurgulanmıış ve yazılmıştır. Haliyle arka planında Açık Kaynak Kod(Open Source) felsefesini görürsünüz. Git, GNU Genel Kamu Lisansı altında dağıtılan ücretsiz ve açık kaynaklı bir yazılımdır. 

Git dağıtılmış bir sürüm kontrol sistemidir; bu, dünyanın herhangi bir yerindeki kullanıcıların projenizin bir kopyasını kendi bilgisayarlarına indirebilecekleri anlamına gelir. Değişiklik yaptıklarında ise, kendi sürümlerini paylaşmak için tekrar sunucuya senkronize edebilirler. Böylece, fark ettiğiniz gibi, konumdan bağımsız uzak çalışanlar birlikte kod geliştirebilirler. 

Sürüm kontrol sistemleri, genellikle kodlama için yaygın olarak kullanılır, ancak bunun yanı sıra dokümantasyon ve belgeleri de deponuza ekleyip ekibinizle paylaşabilir ve bir çok dosya türünü de ekleyebilirsiniz. 

Git’i kendi komutları aracılığıyla hiç bir ek uygulamaya gerek kalmadan komut satırı arayüzü üzerinden kullanabilirsiniz, ancak kolay kullanım için zaman içinde bir çok farklı proje geliştirilmiş ve çeşitli arayüzler ile kolayca yönetilebilir hale gelmiştir. 

GitHub, web üzerinde Git depoları barındırmak için kullanılan en popüler hizmetlerden biridir. Benzer GitLab, BitBucket ve Beanstalk gibi sistemler de popüler örneklerindendir. 

Başlamadan önce bilmeniz gereken birkaç temel terim vardır. 

SSH protokolü; bir bilgisayardan diğerine güvenli uzaktan oturum açma için bir yöntemdir. 

Depo(Repository); sürüm denetimi için ayarlanmış proje klasörlerinizdir. 

Çatal(Fork); deponun bir kopyasıdır. Çatal ile depoyu kopyalamak arasında bilişsel bir bağ kurmak zor olduğu için biraz yardımcı olayım. GitHub’da bulunan bir proje klasörünü Fork butonu ile kendi hesabınıza kopyalamanızı ifade ediyor ve o noktadan sonra kopyaladığınız bu proje klasörü üzerinden kodlarınızı ekleyerek kendi projenizi geliştirebilirsiniz. Sizin projeniz diğer proje temelli yeni bir proje olabilir. Fork ifadesini, navigasyon uygulamasında bir yol ayrımına geldiğinizde sesli asistanın size “çatalın sağından gidiniz” uyarısına benzetebilirsiniz. Burada ki “Çatal(Fork)” ifadesi de, ana yoldan(projeden) farklı bir yola(kendi projenize) sapmak gibi düşünülebilir.

Değişiklik isteği(Pull Request); bir ekip arkadaşınızdan yaptığınız değişiklikler kesinleşmeden önce gözden geçirmesini(Code Review) ve onaylamasını(Approve) isteme şeklinizdir. 

Çalışma dizini(Working Directory); bir Git deposuyla ilişkilendirilmiş kişisel bilgisayarınızdaki proje klasörünüzü, dosyaları ve alt dizinleri içerir. 

Git’i nasıl etkili bir şekilde kullanacağınızı öğrenmek ve dünyanın dört bir yanındaki veri bilimcileriyle işbirliği yapmaya başlamak için temel komutları öğrenmeniz gerekir. Github Dokümanlarında git ve github kurulum ve kullanımı ile ilgili bilgiler bulabilirsiniz.

Git’in Tarihçesi

2000’lerin başında Linux geliştirme, BitKeeper olarak bilinen, kullanımı ücretsiz bir sistem üzerinden yönetiliyordu. 2005 yılında BitKeeper, Linux geliştiricileri için birçok nedenden dolayı sorunlu olan, ücretli bir sisteme dönüştü. Dolayısıyla Linux geliştiricilerinin işlerini yürütebilmek için bir sistem ihtiyacı doğdu.

Bunun üzerine Linus Torvalds, bu iş için atanmış bir ekibe öncülük ederek, yazılım kaynak kodu sürüm kontrol sistemi geliştirdi. Üstelik proje çok kısa bir zaman diliminde yürütüldü ve temel özellikleri küçük bir grup tarafından tanımlandı. Az sayıda kişiyle kısa sürede BitKeeper’dan daha iyisini yaptı ve bugün dünyayı domine eden bir sistem yazdı.

Yani konuya farklı bir açıdan bakacak olursak;

Eğer rest çekiyorsanız, dikkat edin de rest çektiğiniz kişinin eli sizden iyi olmasın!  

Bitkeeper’ın bu işe ne kadar bozulduğunu merak ediyorsanız eğer bu yazıyı yazdığım esnada kendi sitesinde yazılanlara göz atabilirsiniz;

Git ve Github ile Çalışmak 2

“Evet, siz kafirler BitKeeper’ın son yayımlanan sürümünü github.com’dan aşağıdaki komutla kopyalayabilirsiniz” diyorlar. ????????????

Tekrar konumuza dönecek olursak; temel git sisteminin ana karakteristikleri şunları içerir: 

  • Doğrusal olmayan geliştirme desteği.(Farklı ekiplerce geliştirilen Linux yamaları saniyede 6,7 yama hızında geliyordu)
  • Dağıtık geliştirme ortamı. Her geliştirici, geliştirme geçmişinin yerel bir kopyasına sahip olabilir. 
  • Mevcut sistemler ve protokollerle uyumluluk. Bu, Linux topluluğunun çeşitliliğini kapsayabilmek için gerekliydi. 
  • Büyük projelerin verimli bir şekilde ele alınması.
  • Tarihin, kriptografik kimlik doğrulaması ile korunması. Bu, dağıtık sistemlerin hepsinin aynı kod güncellemelerine sahip olmasını sağlar. 
  • Eklemeli birleştirme stratejileri. Birçok farklı geliştirme yolu olması, açık entegrasyon stratejileri gerektirebilecek karmaşık entegrasyon kararları gerektirir. Daha önce bunun karmaşık olabileceğinden bahsetmiştim. 

Git Deposu Modelini Özel Kılan Nedir? 

Git, dağıtık sürüm kontrol sistemi(Distributed Version Control System) olarak tasarlanmıştır. 

Öncelikli olarak odaklandığı nokta; geliştirme sırasında kaynak kodunu izlemektir. 

Programcılar arasında koordinasyonu sağlamak, kodda yapılan değişiklikleri izlemek ve doğrusal olmayan iş akışlarını desteklemek için öğeler içerir. 

Özel olarak Çevik Geliştirme(Agile Development) Metodolojilerine odaklanmıştır ve işbirliği için ortak bir merkezi nokta görevi görür. 

Merkezi bir sürüm kontrol sisteminde, her geliştiricinin merkezi sistemdeki kodu kontrol etmesi ve kendi geliştirmeleri ile birlikte tekrar sunması(commit) gerekir. 

Git dağıtılmış bir sürüm denetimi olduğundan, her geliştiricinin geliştirme geçmişinin tam bir yerel bir kopyası vardır ve değişiklikler bir depodan diğerine kopyalanır. Her geliştirici bir hub olarak hareket edebilir.

Git doğru kullanıldığında, uygulamanın dağıtılabilir koduna karşılık gelen bir ana dal(mian branch) vardır. Ekipler, bu ana dal üzerinde yayınlanmaya hazır olan değişiklikleri sürekli olarak entegre edebilir ve aynı anda yayınlanabilir bu sürümler arasında ayrılmış dallarda(branch) çalışabilir.

Git ayrıca her ekip için erişim düzeyi kontrolleriyle görevlerin merkezi olarak yönetilmesine olanak tanır. 

Dallar(Branch) ile Çalışmak

Git ile çalışmanın en eşsiz özelliği aynı projenin üzerinde bir çok geliştiricinin birlikte ekip çalışması yapabilmesini sağlayan dallanma yapısıdır.

Bir dal(branch) oluşturmak, asıl uygulama koduna dokunmadan çalışmak için bir kopyasını oluşturmaktır. Uygulamanın yayınlanabilir kodunun olduğu ana dal Master Branch ya da Main Branch olarak adlandırılır. Burası hata kabul etmediği için test edilmemiş hiç bir kodun bu dal’a eklenmemesi ve stabil olması gerekir. Buradan oluşturulan dal ise kod geliştirme ve test ile ilgili iş akışlarını yürütmek amaçlı kullanılır. Geliştirme kodu son halini aldığında ise ana dal ile birleştirilir.

Eğer kod üzerinde bir değişiklik ya da yenilik yapacak iseniz; bu ana dalın bir alt dalını oluşturmanız gerekir. İşte buna dallanma yapısı, branch oluşturma diyoruz.

Git ve Github ile Çalışmak 3

Bu alt dal(child branch) üzerinde gerekli kod değişiklikleri, eklemeleri yapıldıktan sonra, test edilir ve ana dal ile birleştirilir.

Git ve Github ile Çalışmak 4

Siz yan dal üzerinde geliştirme ve test süreçlerinizi sürdürürken ana dal üzerindeki kodda birleştirme(merge) işlemine kadar hiç bir değişiklik ya da farklılık gerçekleşmez.

Git ve Github ile Çalışmak 5

Uygulama kodlarken bir ekip olarak çalıştığınızda da bireysel ya da alt ekipler olarak farklı özelliklerin geliştirilmesinde görev alabilirsiniz. Bu durumda geliştiricilerin kodlarının karışmaması, geliştirme sürecinin paralel olarak devam etmesinin sağlanması için birden fazla dal(branch) oluşturulabilir.

Git ve Github ile Çalışmak 6

Git Komutları ile Çalışmak

Her zaman kullanacağınız birkaç temel Git komutu vardır. 

git init: Yeni bir projeye başlarken ya da mevcut bir projeyi klonlarken, çalışma dizininizi(working directory) git ile ilişkilendirmek ve bir depo(repository) olarak tanımlamak için sadece bir kez yapmanız gereken bir tanımlama adımı vardır; bir git projesini başlatmak. “git init” komutu bunu yapar.

git add: Yaptığınız değişiklikleri çalışma dizininizden hazırlama alanına(Staging area) taşır. 

git status: Çalışma dizininizin durumunu ve hazırlanmış(staged) değişikliklerinizin anlık bir görüntüsünü görmenizi sağlar. 

git commit: Hazırlanmış(staged) değişikliklerinizin anlık görüntüsünü alır ve bunları projeye işlenmek üzere gönderir.

git revert: İşlenmek üzere gönderdiğiniz(commit ettiğiniz) herhangi bir değişikliği geri almak için kullanılır.  

git reset: Çalışma dizininizdeki dosyalarda yaptığınız değişiklikleri geri alır. 

git log: bir projede yapılmış olan önceki değişikliklere göz atmanızı sağlar. 

git branch: değişiklik yapmak için deponuzda yalıtılmış bir ortam oluşturmanıza olanak tanır. Bu en önemli kavramlardan biridir. Çünkü, ekip çalışmasında herkes eşzamanlı çalışırken birden fazla dal(branch) oluşturur ve aynı dosyalar üzerinde yapılan değişikliklerde bu farklı dalların ana proje ile birleştirilmesi bazen kafa karıştırıcı olabilir.

git checkout: mevcut dalları görmenizi ve değiştirmenizi sağlar. 

git merge: Dalları ana projeye eklemenizi sağlar.

Şimdi bu komutlar ile çalışmaya başlayalım ve nasıl kullanıldıklarını görelim;

Önce bilgisayarımızda uygun bir çalışma dizini içinde terminal açalım. Ben Projects klasörü altında çalışmaları gerçekleştireceğim, siz istediğiniz herhangi bir klasör içinde çalışabilirsiniz.

Git ve Github ile Çalışmak 7
%  mkdir gittest

komutu ile bir çalışma klasörü oluşturalım ve bu klasörün içine geçelim.

% cd gittest

Bu klasörü yerel bir git deposu(repository) yapmak için ilk olarak şu komutu verelim;

% git init

Bu komutun çıktısı;

Initialized empty Git repository in /Users/obenseven/Projects/gittest/.git/

şeklinde olacaktır. Git’i başlatma komutumuz, tüm git dosyalarını içeren bir .git klasörü ile başlatılır. “.” öneki git dizinini gizli hale getirecektir. Bu klasör içindeki dosyalara göz atalım;

% ls -la .git

Kodun çıktısı;

Git ve Github ile Çalışmak 8

Çıktı, git sunucusu tarafından gerekli tüm bilgileri içeren .git alt dizininin içeriğini gösterir.

Şimdi yerel depomuzda yeni bir dosya oluşturalım.

% touch ilk_dosya

Şimdi bu dosyayı gittest klasörü içinde görebiliyor olmalısınız;

% ls -l

Komutun çıktısı;

Git ve Github ile Çalışmak 9

Ancak dikkat etmeniz gereken husus şudur; bu dosya gittest içinde oluşturulmuştur ve gittest bir yerel depodur. Ancak dosyayı yerel depo içinde oluşturmakla git versiyon kontrol sistemince takip edilen bir dosya oluşturmuş olmuyorsunuz. Bunun için dosyayı git vertabanına eklemelisiniz. Yani dosyanın yerel depo içinde versiyon kontrol sistemince takip edilen bir dosya olmasını sağlamalısınız. Bunun için de;

% git add ilk_dosya

komutuyla dosyayı git veritabanına ekliyoruz.

Şimdi bu değişiklikleri işlenmek üzere göndereceğiz(commit). Ancak git verisyon kontrol sistemi henüz bu değişiklikleri yapanı tanımıyor. Bu nedenle önce kendimizi sisteme tanıtalım ki değişiklikleri ekibin hangi üyesi gerçekleştirip, gönderdi takip edilebilsin.

% git config --global user.email "obenseven@obenseven.com"
% git config --global user.name "Oben Seven"

Artık git ayarlarını yaptığımıza göre eklediğimiz dosyayı işleme gönderebiliriz;

% git commit -m "ilk_dosya isimli dosya oluşturuldu"

Kodun çıktısı;

Git ve Github ile Çalışmak 10

Buradaki -m parametresi yapılan commit için açıklama eklemeyi sağlar. Herhangi bir dal belirtmeden yaptığımız bu commit işlemi direkt ana dal(main) üzerinde gerçekleştirilmiştir. Şimdi yeni bir dal oluşturalım;

% git branch yandal1

Eklediğimiz dalın oluşturulup oluşturulmadığını kontrol edelim;

% git branch

Kodun çıktısı;

Git ve Github ile Çalışmak 11

Artık değişikliklerinizi yapmak için yeni dalda çalışmak istediğinizden, bu dala geçmek için aşağıdaki komutu çalıştıralım;

% git checkout yandal1

Kodun çıktısı;

Git ve Github ile Çalışmak 12

Yaptığımız işlemin doğruluğunu test edip yeni dala geçtiğimizi görelim;

% git branch

Kodun çıktısı;

Git ve Github ile Çalışmak 13

Gördüğünüz gibi artık geçtiğimiz dal olan yandal1 yıldız ile işaretlenmiş ve yeşil renk ile görüntüleniyor.

git branch kullanarak bir dal oluşturmak ve ardından git checkout kullanarak bunu aktif hale getirmek yerine, git checkout komutunu -b parametresi ile kullanarak aynı anda hem dalı oluşturabilir hem de o dala geçip, aktif hale getirebilirsiniz.

% git checkout -b yandal1

Şimdi kendi oluşturduğumuz dal üzerine geçtiğimize göre standart uygulama geliştirme senaryosuna göre yeni bir özellik ya da projenin üzerimize düşen bir bölümü için kodlama yapmamız gerekir. Örneğin yeni oluşturduğumuz dosyaya bir metin girelim;

% nano ilk_dosya

Eski terminal kullanıcıları genelde Emcas, Vi/Vim ya da Sed ile çalışmayı severler ama ben daha basit bir metin düzenleyici tercih ediyorum; nano.

Git ve Github ile Çalışmak 14

Kaydedip çıktıktan sonra dosyanın içeriğini kontrol edelim;

% cat ilk_dosya

Komut çıktısı;

Git ve Github ile Çalışmak 15

Bir de yeni bir dosya oluşturalım;

% touch README.md

Dosyayı sadece oluşturmamızın yetmediğinden daha önce bahsetmiştik. Reel olarak dosya artık var olsa da git’in bundan haberi yok. Hemen git depomuza ekleyelim;

% git add README.md

Doğru yaptığımızı kontrol etmeyi de unutmuyoruz;

% git status

Komut çıktısı;

Git ve Github ile Çalışmak 16

git status komutunun çıktısı, README.md dosyasının dala eklendiğini ve git add kullanarak dala eklediğiniz için işlenmeye(commit) hazır olduğunu gösterir. Ancak, ilk_dosya adlı dosyayı değiştirmiş olmanıza rağmen, git add kullanarak git deposuna eklemediğimiz için işlenmeye hazır değil. Gördüğünüz gibi git bizi yapmamız gereken ya da yapmayı unuttuğumuz işler için yönlendiriyor da.

Bazen birden fazla dosya üzerinde aynı anda çalşırsınız ve bu örnekteki gibi içlerinden birini git deposuna eklemeyi unutabilirsiniz. Bunun önüne geçmek ve tüm değişiklikleri tek seferde eklemek için, git add komutunu yıldız işareti * ile birlikte kullanabilirsiniz. Bu aynı zamanda değiştirilen ilk_dosya dosyasını da dala ekleyecek ve işlenmeye(commit) hazır hale getirecektir.

% git add *

Git deposunun durumunu şimdi kontrol edecek olursak;

% git status

Komutun çıktısı;

Git ve Github ile Çalışmak 17

Gördüğünüz gibi biraz önceki hata ortadan kalktı ve her iki dosyada, hem yeni oluşturulan hem de içeriğinde değişiklik yapılan işlenmeye(commit) hazır hale geldiler.

Artık değişiklikleriniz hazır olduğuna göre, değişiklikleri açıklayıcı bir mesaj ile birlikte commit komutunu kullanarak dala kaydedebilirsiniz.

% git commit -m "README.md dosyası oluşturuldu ve ilk_dosya isimli dosyaya içerik eklendi"

İşlenmeye(commit) gönderdiğimiz son işlerin tarihçesine göz atalım;

% git log

Komutun çıktısı;

Git ve Github ile Çalışmak 18

Log dosyası kayıtları bize 2 yeni işlemi gösterir; son commit yandal1 üzerinde yapılırken bir önceki ise main dal üzerinde gerçekleşmiştir.

Ama bazen yeterince test etme fırsatı bulamadan kodu işlenmeye(commit) gönderdiğimiz de olur maalesef. Hatasız kul olmaz! Ama bu da istenmeyen sonuçlara yol açabilir. İşte git revert komutu burada devreye girer ve yaptığımız değişiklikleri geri almamızı sağlar.

Geri almak istediğinizi nasıl belirleyeceğinizi düşünüyorsanız eğer log çıktısına tekrar göz atmanızı isteyeceğim, orada yer alan her commit işlemine ait benzersiz kimlik numarasını vererek hangi değişikliği geri almak istediğinizi belirtebilirsiniz.

% git revert d8affd

Ya da son commit işlemini geri almak istiyorsanız HEAD kullanabilirsiniz;

% git revert HEAD --no-edit

NOT: Eğer –no-edit parametresini kullanmazsanız, geri döndürülecek değişiklikleri içeren mesajı gösteren bir düzenleyici ekranı ile karşılaşabilirsiniz. Bu durumda, Control (veya Ctrl) tuşuna X ile aynı anda basın.

Şimdi birleştirme işlemine örnek olması için yeni bir dosya oluşturup, git deposuna ekleyelim;

% nano ikinci_dosya.py

Bu kez touch yerine nano kullanarak direkt dosyayı oluşturma ile düzenleme işlemini tek adımda hallettik. Tabii siz bu şekilde yapmak zorunda değilsiniz. Dosyalarınızı masaüstü uygulamanızın içinde oluşturup VSCode gibi bir IDE kullanarak düzenleyebilir, terminalde git deposunun içine giderek sadece git komutlarınızı terminalden kullanabilirsiniz.

Git ve Github ile Çalışmak 19
% git add ikinci_dosya.py
% git commit -m "ikinci_dosya isimli Python kod dosyamızı alt dal içinde oluşturduk"
% git log

Komutun çıktısı;

Git ve Github ile Çalışmak 20

Gördüğünüz gibi yeni oluşturduğumuz dosya yandal1 isimli alt dal üzerinde işlenmek(commit) üzere gönderilmiş(HEAD -> yandal1) görünüyor.

git log komutundan sonra geçmiş commit işlemlerini inceleme sayfasından çıkarak yeni komutlar verebileceğiniz şekilde terminale geri dönmek için “Q” tuşuna basmanız yeterlidir.

Şimdi değişikliklerimizi ana dal üzerine işlemek üzere ana dal ile yan dalı birleştirme işlemini uygulayalım. Bunun için kural; hangi dala birleştirecek isek ilk önce ona geçmektir;

% git checkout main

Bu komut bizi yandal1 dalından ana dala(main) döndürüyor.

Git ve Github ile Çalışmak 21

Ana dalda olduğumuzu teyit etmek ve buradaki işlemleri kontrol etmek için şu komutların çıktılarına göz atabilirsiniz;

% git status
% git log

Komut çıktısı;

Git ve Github ile Çalışmak 22

Şimdicyandal1 isimli kendimize ait çalışma dalını ana dal ile birleştirelim. Yani yaptığımız değişiklikleri ana kodumuza ekleyelim;

% git merge yandal1

Komutun çıktısı;

Git ve Github ile Çalışmak 23

Ve son surumu bir kontrol edelim;

% git log

Komutun çıktısı;

Git ve Github ile Çalışmak 24

Gördüğünüz gibi yandal1 dalında yaptığımız tüm değişiklikler ana dala eklenmiş görünüyor. Şu aşamada yan dalımıza ihtiyacımız kalmadığı için bu dalı branch komutuna -d (delete) silme parametresi ile silebiliriz;

% git branch -d yandal1

Komutun çıktısı;

Git ve Github ile Çalışmak 25

Böylece git ile terminalden nasıl çalışabileceğimizi de temel olrak öğrenmiş olduk. Daha fazla detay için ayrı bir Git kursu hazırlayana kadar şimdilik temeller yeterli olacaktır.

Git ile yerel bilgisayarınızda, GitHub Masaüstü uygulaması veya doğrudan GitHub web arayüzüne bağlı bir tarayıcı aracılığıyla da çalışabilirsiniz. Gelin şimdi buna göz atalım.

GitHub Barındırma Hizmeti

Github

GitHub, Git depoları için çevrimiçi bir barındırma hizmetidir. Ücretsiz, Profesyonel ve Kurumsal hesaplar sunar. 

2023 Haziran ayı istatistiklerine göre GitHub’da 100 Milyondan fazla geliştirici tarafından kullanılan, 28 milyonu herkese açık olarak paylaşılmış 420 milyondan fazla kod proje deposuna sahiptir. 

Bir depo(repository), uygulamanın kaynak kodu da dahil olmak üzere tüm belgelerini depolamak için kullanılan bir veri yapısıdır. Bir depo sürüm kontrolünü izleyebilir ve koruyabilir. 

GitHub’a Giriş

GitHub’da kişisel bir ücretsiz hesaba kaydolmak çok hızlı ve kolaydır. GitHub sitesine girin, https://github.com 

Git ve Github ile Çalışmak 26

e-posta adresinizi girdikten sonra yönlendirmeleri takip etmeniz ve bir kullanıcı adı ile şifre seçmeniz yeterlidir. Bot değilde gerçek bir kişi olduğunuzu kanıtlamak için kısa bir testiniz olacak. Sunulan bulmacayı çözdüğünüzde, ücretsiz bir plana katılmak üzere ilerleyebilirsiniz. Varsayılan olan kişisel, ücretsiz bir hesap oluşturmayı seçin. 

GitHub işiniz, programlama deneyiminiz ve ilgi alanlarınız hakkında bazı sorular sorar. İsterseniz bunları atlayabilirsiniz. Son olarak, GitHub’a eriştiğiniz e-postayı doğrulamanız gerekecektir. E-mail adresinize gidip size gönderilen bağlantıyı tıklayın.

Bir depo veya kuruluş oluşturmayı seçebilir ya da GitHub’a Giriş kursuna katılabilirsiniz. Depo’nun ne olduğunu artık biliyorsunuz. Kuruluş ise, depoların sahibi olan bir kullanıcı hesapları koleksiyonudur. Şirketiniz için bir kuruluş hesabı oluşturabilir, idari ayrıcalıklara sahip bir veya daha fazla kullanıcı tanımlayarak şirkete ait depoları yönetebilirsiniz. 

GitHub, etkili bir şekilde çalışmanıza yardımcı olacak birçok kaynak sağlar. Zamanınız olduğunda GitHub kılavuzunu okumanızı tavsiye ederim.

Git tabanlı bir projenin kalbi depodur. Deponuz, tüm uygulama kodunuzu ve ilgili dokümanlar ile birlikte şunları içerir: 

  • Projenin amacını açıklayan bir README dosyası. 
  • İnsanların kodunuzu nasıl kullanabileceklerine dair kuralları tanımlayan bir lisans, vb. 

Ayrıca deponuzu özel (yalnızca görme izni olan hesapları olan kişiler tarafından kullanılabilir) veya herkese açık (aranabilir ve herkes tarafından görülebilir) yapabilirsiniz. 

Menüde bulunan “+” butonuna tıklayıp açılan menüden “New repository” seçerek ilk deponuzu oluşturun.

Git ve Github ile Çalışmak 27

İlk adım olarak deponuz ile ilgili bir takım bilgileri eklemeniz gerekmektedir;

Git ve Github ile Çalışmak 28

Deponuzun adını, ne maksatla oluşturulduğunu ve Herkese Açık(Public)/Gizli(Private) ayarlarını yapabilirsiniz. Ayrıca, aşağıda gördüğünüz şekilde deponuza bir README dosyası ekleyebilir, kullanacağınız dile özel şablonu seçerek .gitignore dosyası oluşturabilir ve diğer insanların kullanım hakları ile ilgili lisans sözleşmenizi seçebilirsiniz.

Git ve Github ile Çalışmak 29

Ardından “Create Repository” butonuna tıklayarak deponuzu oluşturduğunuzda, sizi çalışma alanınız karşılayacaktır.

Git ve Github ile Çalışmak 30

Burada bir dizi sekme olduğunu fark etmişsinizdir. İlk olarak karşınıza “Code” kod sekmesi açılarak gelecektir. Burası tüm kaynak dosyaların bulunduğu yerdir. Ayrıca, README ve oluşturduysanız eğer lisans dosyanızda burada yer alıyor. 

Olaylar(Issues) – Yapılacak işleri, hataları, uygulamaya eklenecek yeni özellik isteklerini ve daha fazlasını kaydedip takip etmek için kullanılır. Olaylar oluşturulduktan sonra burada aranabilir ve filtrelenebilir bir listede görüneceklerdir.

Değişiklik İstekleri(Pull Requests) – diğer kullanıcılarla işbirliği yapma mekanizmasının önemli bir parçasıdır. Değişiklik istekleri, ana(main) kaynak kod ile birleştirilmeden önce işlenmeye ve incelenmeye hazır değişiklikleri ifade eder. 

Aksiyonlar(Actions) – Kodunuzu oluşturup, test etmeniz ve sonrasında yayınlamanız için gereken araçları içerir. Kod incelemelerinin, dal(branch) yönetiminin ve sorun önceliklendirmenin istediğiniz şekilde çalışmasını sağlar. Başlamak için bir iş akışı seçebilirsiniz. İş akışları için farklı yaklaşımlar söz konusudur. İş akışı git ile nasıl çalışacağınızı, nasıl dallar oluşturup ana kod ile birleştireceğinizi belirleyen süreci tanımlar.

Projeler(Projects) — çeşitli projelerinizi yönetmek, sıralamak, planlamak için kullanılır. Bu, GitHub’ın işbirlikçi gücünün özüdür. Buradan deponuzu kullanacak olan projeyi başlatabilir ya da mevcut bir projenin bir bölümüne ait ise proje ile araasında bağlantı kurabilirsiniz. 

Wiki, Güvenlik, ve Öngörüler – genellikle daha ileri düzey kullanıcılar için bırakılır, bu araçlar harici kullanıcı topluluğuna bir iletişim alanı sağlar.

Ayarlar — GitHub, deponuzun adını değiştirmek ve erişimi kontrol etmek de dahil olmak üzere birçok kişiselleştirmeye izin verir. 

GitHub Kullanımı

GitHub üzerinde çalışmaya başlarken temel bazı özellikleri nasıl kullanabileceğinize göz atalım. Kod(Code) sayfasında README dosyanızın sağ tarafında yer alan kalem şeklindeki buton tüm diğer uygulamalardan zaten bildiğiniz üzere dokümanı düzenlemeyi sağlıyor.

Git ve Github ile Çalışmak 31

Tıkladığınızda açılan pencerede içeriği düzenleyebilir ve sonra sağ üst kısımda bulunan değişiklikleri işlenmek üzere gönder “Commit changes…” butonuna tıklayarak kaydedebilirsiniz.

Git ve Github ile Çalışmak 32

Karşınıza “Commit changes” fromu gelecektir. Burada “Commit message” alanına yapılan değişikliği ifade eden kısa bir mesaj giriniz. Daha detaylı ve uzun bir açıklama girecekseniz eğer “Extended description” alanında bunu yapabilirsiniz.

Git ve Github ile Çalışmak 33

Ekip olarak geliştirme yapılan durumlarda her ikisini de açıklayıcı şekilde detaylı doldurmanız ekip arkadaşlarınızın ve sizden sonra kodunuzu kontrol edecek olan ekip üyesinin işini çok kolaylaştıracaktır.

Ayrıca kodda yapılan değişiklikler ile ilgili neler olduğunu görmek istediğinizde geçmişe dönüp, hangi noktada hangi değişikliğin yapıldığını görmek için çok önemlidir. Yani özetle, temiz ve düzenli bir ekip çalışması için bunları ihmal etmemenizi öneririm.

Bu ilk düzenlememizde değişiklikleri direkt olarak ana dal(main branch) üzerine işlemek üzere “Commit directly to the main branch” seçiyoruz. Ancak kod dosyasında yapılan değişikliklerde kontrol edilmeden direkt olarak ana kod üzerinde işlem yapmanız önerilmez. İlerleyen aşamalarda bir CI/CD iş akışı oluşturulduğunda main branch direkt yayınlanan uygulama olacağı için, yaptığınız hatalar da direkt olarak uygulamaya yansıyacaktır. Bu nedenle “Create a new branch for this commit and start a pull request” seçeneği mevcuttur. Böylece yaptığınız değişiklikler ana dal üzerindeki uygulama kodunun bir örneğini içeren yan dal oluşturularak onun üzerinde yapılacak ve sonra ana dal ile birleştirilmeden önce bir başka ekip arkadaşınızın gözünden kontrol edilerek onaylandıktan sonra ana dal ile birleştirilecek ve yayına çıkacaktır.

Git ve Github ile Çalışmak 34

Gördüğünüz gibi yapılan değişikliklerin açıklaması ve değişikliği yapan kişinin kim olduğu kayıt altına alındı. İşte bu kod değişikliklerinin nasıl takip edildiğine güzel bir örnektir. Burada açıklamanın altında yer alan yeşil renkteki +2 ve kırmızı renkteki -1 notu dikkatinizi çekmiştir. Bu rakamlar kaç adet değişiklik yaptığınızı gösteriyor. Üzerine tıkladığınızda ise size yapılan değişiklikleri detaylı olarak gösteriyor;

Git ve Github ile Çalışmak 35

Kırmızı işaretli alanlar dosyanın değiştirilen ve silinen eski halini gösterirken yeşil alanlar yapılan eklemeleri gösteriyor. Dosyada yapılan bu değişiklikleri görmek için Kod(Code) sayfasında yer alan commit mesajının üzerine de tıklayabilirsiniz;

Git ve Github ile Çalışmak 36

Ya da son değişikliklerin görüntülendiği mesaj alanının sağ tarafında yer alan “2 Commits” ağlantısını da tıklayabilirsiniz. Bu da sizi o dosyada yapılan tüm değişikliklerin tarihçesinin görüntülendiği sayfaya götürür;

Git ve Github ile Çalışmak 37

Yapılan değişiklikleri detaylı görmek istediğiniz “commit”in üzerine tıklayarak görüntüleyebilirsiniz.

Şimdi Kod(Code) sayfasına dönerek depomuza yeni bir dosya ekleyelim. Bunun için sağ üstte bulunan “Add file” menüsünde “+ Create new file” seçiniz.

Git ve Github ile Çalışmak 38

Açılan düzenleme ekranında depo adının devamında bulunan metin kutusuna oluşturacağınız dosyanın adını ve dosya uzantısını girebilirsiniz;

Git ve Github ile Çalışmak 39

Örneğin bir Python kodu dosyası oluşturmak için buraya python_test.py olarak dosya adını girip, alt kısımda bulunan metin alanına da kodlarınızı ekleyebilirsiniz;

Git ve Github ile Çalışmak 40

Değişiklikleri kaydedip dosyayı depoya eklemek için sağ üstte bulunan “Commit changes…” butonuna tıklıyoruz.

Git ve Github ile Çalışmak 41

Oluşturulan yeni dosya deponuzda görüntülenecektir;

Git ve Github ile Çalışmak 42

Dilerseniz dosya adının üzerine tıklayarak dosyayı düzenleyebilirsiniz.

Deponuza dosya eklemenin bir yolu da, Kod(Code) ekranındayken “Add file” menüsünden “Upload files” seçmektir. Böylece yerel makinenizden dosyaları GitHub deponuza yükleyebilirsiniz.

Git ve Github ile Çalışmak 43

GitHub üzerinde bir dal oluşturmak için Kod(Code) görünümüne dönüyoruz. Burada “main branch” menüsünde yer alan metin kutusuna bir ad girerek yeni bir dal oluşturabiliriz. Ya da altta yer alan “View all branches” butonuna veya üstte yer alan dal(Branch) menüsünü kullanarak ulaşacağınız tüm dalların listelendiği sayfada yer alan “New branch” butonu ile yeni bir dal oluşturabilirsiniz.

Git ve Github ile Çalışmak 44

Örnek dal için alt_dal_1 ismini seçtik. Ve “Create branch alt_dal_1 from main” butonuna tıklayarak alt dalımızın ana daldan kopyalanmasını istediğimizi belirttik.

Git ve Github ile Çalışmak 45

Artık Kod(Code) görünümümüzde 2 dalımız olduğu görülüyor ve üzerinde çalışacağımız dal ise yeni oluşturduğumuz alt_dal_1 olarak görülüyor.

Git ve Github ile Çalışmak 46

Depoda yer alan dosyaların aynı olması sizi yanıltmasın. Burada yapacağımız değişiklikler uygulama kodunun bir kopyası üzerinde geçekleşecek ve asıl kodu etkilemeyecektir. Ta ki ana dal ile birleştirilinceye kadar.

Örnek olması için buraya yeni bir Python dosyası ekleyelim.

Git ve Github ile Çalışmak 47

“Commit changes…” butonuna tıklayıp;

Git ve Github ile Çalışmak 48

gerekli açıklamaları girdikten sonra “Commit changes” butonu ile onaylıyoruz. Şimdilik ekip çalışması durumuna değinmeyeceğimiz için yine direkt olarak dal’a eklenmesi seçeneğiini tercih edebiliriz.

Şimdi alt dal içinde göreceğiniz yeni dosyamızı;

Git ve Github ile Çalışmak 49

Yukarıda bulunan ve dalları gösteren açılır listeden main branch(ana dal) seçtiğinizde göremeyeceğinizi teyit edelim;

Git ve Github ile Çalışmak 50

Yaptığınız değişiklikler şimdilik alt dal içinde geçerlidir. Zaten deponun hemen üzerinde, alt dal’a bir dosya gönderildiğini(push request) gösteren mesaj kutusunda, her iki dalı birbiri ile karşılaştırıp(compare), alt daldaki değişiklikleri ana dal ile birleştirmek üzere istek(pull request) göndermenizi teklif eden bir uyarı görüyorsunuz.

Değişiklik İsteği(Pull Request) iki dal arasındaki farklılıkların görülmesi ve test edilmiş yeni kodun ana kod içerisine eklenmesi için yapılan bir istektir. Diğer ekip üyelerini yapılan değişiklikler ve ana dalda gerçekleşen düzenlemeler konusunda uyarır. İdeal olan; ekip üyelerinizden Kod İncelemesi(Code Review) yapmak üzere görevlendirilmiş bir geliştiricinin, kodlarda yapılan değişiklikleri inceleyip, hata olmadığını görüp, ana dal üzerine bu değişikliklerin işlenmesi onayını vermesidir.

Git ve Github ile Çalışmak 51

İşte bu alt dalın ana dal ile birleştirilmesi(merge) işlemi Değişiklik İsteği(Pull Request) ile talep edilir. Şimdi bu isteği gerçekleştirmek üzere “Compare & Pull Request” butonuna tıklayalım.

Git ve Github ile Çalışmak 52

“Open a Pull Request” sayfasında Başlık(Add a title) ve açıklama(Add a description) alanına bu kod değişikliğini neden yaptığınızı ve amacınızı detaylı olarak girerseniz sizden sonra Kod İncelemesi(Code Review) yapacak olan geliştirici için bilgilendirme yapmış olursunuz ve süregelmesi muhtemel soruları daha başından ortadan kaldırıp süreci hızlandırmış olursunuz. Hatta daha kodu işlenmek üzere gönderirken yani commit aşamasında açıklamaları iyi girmişseniz, bu aşamada herhangi bir ekleme yapmanız da gerekmeyebilir.

Bu sayfanın hemen alt tarafında da kod dosyası ve içinde yapılan değişiklikler görüntülenmektedir.

Git ve Github ile Çalışmak 53

Burada yer alan “Split” tabına tıklarsanız da dosyanın önceki haliyle sonraki halini aynı anda görüp karşılaştırabilirsiniz.

“Create pull request” butonuna tıkladığınızda karşınıza gelecek olan ekranda değişiklik isteği ile ilgili detaylar görüntülenecektir;

Git ve Github ile Çalışmak 54

Herhangi bir sorun yoksa Kod İnceleme(Code Review) yapan developer(Reviewer) dalları birleştirme isteğini “Merge pull request” butonuna tıklayarak gerçekleştirir. Tabii tek başınıza bir proje geliştiriyorsanız, isteği de yapan, isteği de onaylayan siz olursunuz. Ama bu ikinci bir gözün görmesi uygulaması hataları ortadan kaldıran, kod kalitesini artıran önemli bir taktiktir.

Alt dal, ana dal ile birleştirilince oluşturulma amacını tamamlamış olur. Dolayısıyla karşınıza gelen iki dalın başarıyla birleştirildiği ile ilgili mesaj kutusunda yer alan “Delete branch” butonuna tıklayarak alt dalı silebilirsiniz.

Git ve Github ile Çalışmak 55

Tabii bu dal başka geliştirmeler için de kullanılmayacaksa.

Birleştirme işleminden sonra Kod(Code) tabına göz atack olursanız alt dal içinde yapılan değişikliklerin ana dal’a eklendiğini görürsünüz;

Git ve Github ile Çalışmak 56

Tabii terminal ile çalışmayı seven arkadaşlarımız tüm bu işlemleri GitHub web arayüzü olmadan terminal üzerinden Git komutları ile de yapabilirler.

Aşağıdaki ek kaynaklardan konuyla ilgili detaylı bilgiye ulaşabilirsiniz;