Git Versiyon Kontrol Sistemi : Nedir ? Nasıl Kullanılır ?

Kübra Özden
9 min readOct 17, 2023

--

Git Versiyon Kontrol Sistemi

Günümüzde yazılım geliştirme, büyük ve karmaşık projelere dönüşmüş durumda. Bu projelerde, birden çok kişinin aynı kod üzerinde çalışması ve değişikliklerin koordine edilmesi oldukça zorlayıcı olabilir. Versiyon kontrol sistemleri, bu sorunu çözmek için geliştirilmiş araçlardır.

Versiyon kontrol sistemleri, bir projenin geçmiş halini depolamamızı ve gerektiğinde bu geçmişe dönmemizi sağlar. Bu sayede, yaptığımız değişiklikleri takip edebilir, hataları kolayca düzeltebilir ve projenin geçmiş halini geri yükleyebiliriz.

Git, günümüzde en popüler versiyon kontrol sistemidir. Git, dağıtık bir versiyon kontrol sistemidir. Bu, projenin farklı kopyalarının farklı bilgisayarlarda depolanabilmesi anlamına gelir. Dağıtık sistemler, proje üzerinde çalışan birden çok kişinin daha verimli bir şekilde işbirliği yapmasına olanak tanır.

Bu yazıda, sizlere Git’in temel kavramlarını ve kullanımını anlatmaya çalışacağım.

GİT TEMELLERİ

commit : Projeye yapılan bir değişikliğin kaydedilmesidir. Bir dosya üzerinde yapılan işlemlerin tamamlanması ve artık kaydedilmesine karar verdiğimizde noktada commit ediyoruz.

Bu noktalara (mavi) commit diyoruz ilgili iş tamamlandığında onu kaydederiz yeni kısma geçeriz. Dilersek oradan tekrar başlayabiliriz. Mesela büyük bir proje üzerinde çalışıyoruz ve veritabanını yaptık girişi, çıkışı vs yaptık ama baktık ki bir de mesajlaşma fonksiyonu da gerekiyormuş bu işi bir başkasına arkadaşımıza yaptırmak isteyebiliriz yani aynı anda aynı projenin farklı kısımları üzerinde çalışabiliriz. O yaptığı işleri commit atacak ben yaptığım işleri commit atacağım yani farklı farklı commitler gelecek .

! işte ikiye ayrıldığımız kısma branch (dal) diyoruz.

Mesela buna mesajlaşma branch’i diyelim. Mesajlaşma kısmına kadar olan yani çıkış fonksiyonuna kadar olan bütün commit’ler var. Bundan sonra başka bir kişi bu mesajlaşma için açılan branch’de çalışmaya devam edebilir. Ve bu kısım artık onda diyebiliriz :)

Ve belirli bir yerde artık projeyi birleştirebiliriz. Yeni bir commit’de birleşme yapılır. Ve burada log’larda her şey kayıtlı yani projeye yeni dahil olan veya devreden kişi tüm commit’leri görebilir veya istediği commit’den devam edebilir. Bunu tek başına çalışan biri de yapabilir örneğin projede ilerlerken bir şeye karar veremedik 2 branch olsun 2 farklı şekilde yazılsın sonra karar veririm gibi benzeri şekilde bize kolaylıklar sağlayabilir. Branch olayı tek başına çalışırken de yapılabilir, birçok farklı şekilde kullanılabilir.

Genelde git ile çalışırken bir proje klasörü gibi bir çalışma klasörümüz olacak, içerisinde yazdığımız kodlar vs var. O bizim çalışma klasörümüz, mesela arayüzü tasarladık git add komutu ile bunu index-staging (sahne) dediğimiz bir yere alıyoruz. Bu şu anlama geliyor, yazdık yazdık tamam dedik indeksledik , commit yapacağım ama daha commitlemedim, ortada duruyor yani arafta 😃 duruyor.

sonra git commit komutu ile commit edecek ve artık dosyamızı kaydetmiş olacağız.

Repository — Repo : projenin kendisinden bahsediyoruz. Bir şeyi commit’lediğimizde artık onun içinde saklanıyor. Proje klasörümüzün içinde yeni bir klasör açılıyor bize görünmeyen onun içinde de bu bilgiler kaydediliyor. :)

GİT İNİT ve STATUS

Bir klasöre gittiğimizde ve Git’le ilgili işlemler yapmak istediğimizde
git status komutunu çalıştırmamız gerekiyor. Git’in güncel durumunu göster diyoruz. Git’i klasörde aktif etmek için ve içerisinde kullanılabilecek herhangi bir yazılı belgeyi takip etmek için git init komutunu çalıştırırız. (initializer : başlatıcı ) artık git başlatılmış oluyor. C:/Users/Lenovo/Desktop/GitKursu/.git/
Bu klasör artık bizim Repo’muz bu klasöre koyacağımız bütün her şey git içerisinde tutulacak, kaydedilecek, loglanacak :)

git status dediğimizde master branch’inde olduğumuzu, hiç commit bulunmadığını ve commit yapacak da bir dosyanın, projenin bulunmadığını söylüyor 🙂 git add kullanarak dosya ekleyebilirsin diyor.

git status çalıştırdığımızda böyle bir şey görünüyorsa yani git reposu yok gibi bir hata almıyorsak, git initi çalıştırmamalıyız zaten initalize edilmiş yani başlatılmış. 2 kez initialize edilirse kafası karışabiliyor, çakışmalar olup farklı hatalara neden olabiliyor. O yüzden git init çalıştırılmadan önce git status çalıştırılıp onun güncel durumu önce bir kontrol edilir.

  • Gizli dosyalarda ls -la komutu ile .git klasörünü görebiliriz.
  • cd .git ile bu dosyanın içine girebiliriz ve ls ile içindekileri görebiliriz
  • rm -rf .git komutu ile .git klasörü silinebilir. Yani yanlışlıkla bir yere git eklersek böyle silebiliriz . 🙂
  • GitKursu klasörüne girdikten sonra gizli dosyaları göster diyoruz ls -la ile .git dosyasını görebiliyoruz.
  • GitKursu klasöründe bir Git kurulu olduğu için yani daha önce başlatılan bir git olduğu için bu branch ana (efendi) branch anlamında master olarak görünür.
  • git status komutu ile bu versiyon kontrol sisteminde ne olduğuna bir bakıyoruz
  • içinin boş olduğunu ve ana branch olduğunu bize belirtiyor.
  • touch ilkdefter.txt komutu ile bir txt dosyası açıyoruz. ve ls komutu ile GitKursu klasör içeriğine baktığımızda ilkdefter.txt dosyasını görebiliyoruz.
  • Bu bir python, javascripth veya herhangi bir dosya da olabilirdi.
  • git status ile baktığımızda ana branch’de olduğumuzu ve herhangi bir commit bulunmadığını söylüyor. Fakat Untracked files (izlenmeyen dosyalar) dediğimiz kısım yani eklenen dosyalar var ama bunlar daha repository’e atılmamış ben bunları takip etmiyorum diyor. Yani index-staging (sahne) bölgesinde bekliyorlar . Commmit dediğimizde repo ya atılacaklar.
  • Bazen bir proje içerisinde bazı dosyaları Git’e koymak istemeyebiliriz, mesela kütüphaneler gibi bunlar github’da boşu boşuna yer kaplamasın diye Git’e koymak istemeyebiliriz.
  • Ama takip etmek istiyorsak Git’e eklemeliyiz.
  • git add ilkdefter.txt komutu ile bu dosyayı Git’e ekledik
  • git status dediğimizde ilkdefter.txt dosyasının eklendiğini , ornek.py dosyasının ile hala index-staging (sahne) de olduğunu yani Git’e eklenmediğini görüyoruz.
  • git add ornek.py diyerek onu da ekleyelim

!! ANCAK henüz hala hiçbirini commit etmedik . Şuanda sadece git add yaptık yani hala çalışma klasörümün içinde bir yere gitmiyor ama bunları indeksledi Git, Bunları takip edecez artık birazdan commit atar bu diyor 😂

  • git commit -m “ornek ve ilkdefter olusturuldu” komutu ile commitimizin mesajını yani ne yapıldığına dair bir iki cümlelik bir açıklama mahiyetinde bir mesaj ile commitlerimizi atmış olduk. Ve bize 2 dosyanın değiştirildi, herhangi bir insertions (ekleme) ve deletions (silme) yok diyor. Dosyaların içerisindeki satırları söylüyor aslında bunların içinde hiçbir şey olmadığı için 0 gösteriyor.
  • commitlerimi attıktan sonra git status komutunu çalıştırdığımızda master branch de olduğunu ve commit edecek bir şey bulunmadığı belirtiyor.
  • git log : logları gösteren komut
  • Her commit’in kendine ait bir hash’i (numarası) oluyor (sarı kısım) böylece her commiti birbirinden ayırabiliyoruz ve istediğimiz commite dönüş yapabiliyoruz.
  • Head → master kısmı ise güncel içinde bulunduğumuz branch i gösterir, referans alır ve genelde de bize en son commit’i gösterir.
  • author ve date kısımlarında da commit’in kim tarafından hangi tarihte yapıldığını belirtir.
  • ilkdefter.txt dosyasına 1 satır kod ekledik kaydettik ve GitBash e gidip git status komutunu çalıştırdık bize changes not staged yani değişiklikler indekslenmedi diyor. git add ve git commit dediğimizde bu değişiklikleri alacak ve log’layacak
  • git add sonra git commit yapmak yerine “git commit -a” yaparsak direk bütün değişiklikleri içine alabilir, direk commit yapabilir.
  • indexlenmeyen değişikliklerin olduğunu söylüyor, Bu değişiklikleri tek tek git add ilkdefter.txt gibi yapmak yerine yapılan bütün değişikliklerin indexlenmesi için ” git add . “ şeklinde bir komut kullanabiliriz.
  • git status yaptığımızda bütün değişikliklerin indekslendiğini görebiliyoruz.
  • git commit -m “ilk satır kodlarımızı yazdık “ şeklinde commitimizi atmış olduk .

Burada mesajlar önemlidir, genellikle her şirketin kendine has kuralları vardır ve o kuralları bilmeden takip etmeden commit atarsak büyük sıkıntılar yaşanabilir commit atma kurallarına dikkat etmeliyiz.

  • git status çalıştırdığımızda hiçbir şey yok working tree clean yani temiz bir çalışma alanına sahibiz.
  • git log dediğimizde her 2 commiti de görüyoruz. Ve güncel olan commit şuan da 2. commit yani ilk satır kodlarımızı yazdık dediğimiz yerdeyiz ve head → master burayı görteriyor. Ve böylece 2 tane commit atmış olduk ve kimin tarafından ne zaman atıldığı da görünüyor.
  • ornek.py dosyasında 1 satır sildik ve GitBash e gelip git status dediğimizde changes to be commited ( bu dosyada yapılan değişiklikleri commit et diyor) git add . ile indexliyoruz ardından git commit -m “python kodunda gereksiz satır silindi “ komutu ile commit ediyoruz.
  • git log dediğimizde yapılan commitleri görüyoruz.

Eğer indeksledikten sonra mesajı girmeden direk git commit dersek bize kullandığımız editörü açar ve bu commit in ne olduğuna dair bir mesaj bir başlık girmemizi çünkü commit de mesaj ZORUNLUDUR !

  • Burada editörü açtı ve ilk satıra mesajı girmemiz için belirtti “html dosyası oluşturuldu “ şeklinde girdik ve save ettikten sonra artık kapatabiliriz.
  • Bir tane gizli dosya oluşturmak istedik, yani sadece bizim görmek istediğimiz bir dosya aslında içerisinde API_KEY vs gibi baskasının görmesini istemediğimiz bilgileri içeren bir dosya olabilir.
  • Git Repository’lerimizi komple alıp Githuba atabiliriz ancak bazı durumlarda bazı dosyaları kimse görsün istemeyebiliyoruz o yüzden bunu hiçbir zaman Local Repository içerisine koymamalıyız ve
    İndex — Staging içerisine de koymamam lazım yani git add yapmamamız lazım bunlar normal çalışma klasörümüzde durması gerekiyor.
  • ilkdefter.txt ve ornek.html değiştirildi fakat gizli.txt dosyası da indexlenmediğini belirtiyor.

— > git add . çalıştırırsak bunların hepsini indexler ama ben gizli.txt dosyamın görünmesini yani indexlenmesini istemiyorum o yüzden ya tek tek ekleyeceğiz git add ilkdefter.txt ve git add ornek.html şeklinde komutlar yapacağız böylece gizli.txt dosyamız indexlenmemiş olacak.

  • 2 değişikliğimizi de commit ettik
  • Burada 2 değişikliğimizi de aynı anda commit ettiğimiz için ileride değiştirmeye kalkarsak her ikisini de geriye almış olacağım vs onları ayarlamamız gerekiyor

PEKİ YA BURADA 100 TANE DOSYA OLSAYDI ? hepsini tek tek git add ile indexleyecek miydik ?

  • gitignore ile ignore edeceğimiz yani Git’in görmezden geleceği dosyaları belirtebiliriz.
  • Bunun için git init hangi klasörde yaptıysak yani root klasöründe (ana klasörde) bunun içerisinde .gitignore diye bir dosya oluşturmamız gerekiyor.
  • .gitignore dosyamızı oluşturduk
  • Ardından .gitignore dosyamızın içerisine görünmesini istemediğimiz dosyaları yazıp save ediyoruz. .gitignore git tarafından otomatik okunduğu için gizli.txt dosyası hiçbir şekilde git tarafında çıkmayacak yani Git yapısı .gitignore dosyası içerisinde adı belirtilen dosyaları görmezden gelecek

projenizde kullanacağınız programlama dili çerçevesinde gitignore dosyalarını incelemek ve hangi dosyaların gizli olması gerektiği hakkında bilgi edinmek isterseniz örneğin python dilinde ise “ gitignore template python “ şeklinde aratırsaniz Githubda bu dosyalara ait bilgileri edinebilir fikriniz oluşabilir.

  • python için örnek bir gitignore dosyası oluşturmuşlar ve içine bir çok şey koymuşlar örneğin __pycache__ dosyalarını yani cache dosyalarını almaya gerek. Bunların hiçbirini Repoya dahil etmeyecek

Profesyonel olarak yaptığınız işlerde internete verilerinizi atmadan önce .gitignore dosyamızı buradaki listelerle karşılaştırmamız ve gerçekten doğru şeyleri Repo içerisine ekliyor muyuz bir kontrol etmeliyiz. 🙂

Önemli !!

  • Öncelikle bu güzel bilgileri edindiğim kaynak olan, hocam Atıl Samancığolu’na teşekkür ederim. Sizde Versiyon kontrol sistemleri hakkında daha detaylı bilgi edinmek, Git ve Github kullanımı konusunda takıldığınız noktalarda bilgi edinmek isterseniz linkte verilen ücretsiz eğitime katılabilirsiniz 🙂

--

--