Git Nasıl Çalışır?

Gökhan Şengün
Sep 11, 2017 · 3 min read

Bu flood’da sizlere Git versiyon kontrol sisteminin akıllara durgunluk veren basit ve usta işi mimarisi anlatacağım.

Git, Linus Torvalds’ın Linux Kernel’i yönetecek adamakıllı bir versiyon kontrol sistemi bulamaması ve “İki haftada SVN ve CVS’den daha kullanılabilir bir sistem yazabilirim” demesi ve sonunda gerçekten de iki haftada yazması sonucu ortaya çıktı.

Git, kısaca tanıyacağımız bu mimarinin sağladığı esneklik ve optimizasyonlar sayesinde 2–3 yıl gibi kısa bir sürede önce açık kaynaklı projeler tarafından benimsendi. Daha sonra ise en kurumsal olanımızın bile ana versiyon kontrol sistemi oldu :-)

Linus’un OS deneyiminden olsa gerek ki Git, yönettiği repo ile ilgili bilgileri dosya sisteminde (repo altındaki .git adlı klasörde) tutmakta ve bir veritabanı kullanmamaktadır. Hepimizin bildiği dağıtık yapıda olma özelliği bu sayede çok kolay bir şekilde sağlanmıştır.

Commit’ler, kaynak dosya içerikleri (blob), dosya/klasör yapısı (tree) ve tag'ler Git tarafından birer obje olarak değerlendirir.

Git, bu objelerin SHA1 hash’ini alarak dosya sisteminde oluşan SHA1'i dosyanın ismi olarak kullanıp bir dosya yaratır ve içeriği kaydeder.

Şimdi örnek bir Git repo üzerinden Git’in nasıl çalıştığına detaylı olarak bakalım. Öncelikle basit bir repo yaratalım.

Image for post
Image for post

Git’in her şeyi dosya sistemindeki git klasöründe tuttuğunu söylemiştik. İlk olarak bu klasörün içeriğine bakalım.

Image for post
Image for post

Git’in objelerin SHA1 hash’ini kullandığını söylemiştik, o zaman bu hex karakterli dosyalar objeleri tutuyor olmalı.

Dosyalar sıkıştırılarak saklansa da içeriklerini ekrana dökmek için git cat-file -p <hash-of-object> komutunu kullanabiliriz.

Image for post
Image for post

Şimdi README dosyasında küçük bir değişiklik yapalım.

Image for post
Image for post

Ve şimdi de .git klasöründe az önce yaptığımız commit'in sonucu meydana gelen değişiklikleri gözlemleyelim.

Image for post
Image for post

Yukarıda görebileceğiniz üzere dosyamızın (obje) içeriğinde bir değişiklik yaptık. Yapılan commit'le birlikte dosyadaki değişiklik kendi hash'ini değiştirdiği için Git, yeni bir blob (dosya içeriği) ile yeni commit'ten gösterilebilmek için yeni bir tree yarattı.

Buraya kadar Git’in en güçlü özelliklerinden biri olan branch’lerden hiç bahsetmedik. Branch’ler refs/heads klasörü içerisinde tutulur.

Şimdi yeni bir branch yaratalım. .git/refs/heads klasöründe oluşturulan dosya içeriği mevcut commit'i gösterecektir.

Image for post
Image for post

Gördüğünüz gibi bir branch açmak diğer versiyon kontrol sistemlerinin aksine tek bir dosya yaratmak kadar basit ve maliyetsizdir.

Son olarak repo’da hangi branch/commit’in aktif olduğunu gösteren HEAD'e bakalım. .git/HEAD dosyasının içeriği repo'da o anda görünen (genellikle) branch ya da commit'i gösterecektir. Aşağıda .git/HEAD dosyası değiştirilerek Git CLI kullanılmadan branch değiştirilmiştir.

Image for post
Image for post

Gördüğünüz gibi Git basit ancak çok akılcı bir mimari ile tasarlanmıştır. Bu flood’daki bilgilerle bir haftasonu projesi olarak çok basit işlevleri yerine getirebilecek şekilde kendi basit Git istemcinizi yazabilirsiniz.

Konu ile ilgili detaylı bilgi almak isteyenler bu linki https://git-scm.com/book/en/v2/Git-Internals-Git-Objects kullanabilirler.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch

Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore

Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store