GIT nedir?

Hana Kamer
Hana Kamer
Published in
3 min readFeb 16, 2016

--

Bu yazıda Git versiyon kontrol sisteminin yapı taşlarından ve temel çalışma prensibinden bahsedeceğim.

Çok sayıda dosya içeren projelerde yapılan değişiklikleri kontrol altında tutmak, yapılan değişiklikleri projenin sürümleri şeklinde depolamak ve gerekirse eski sürüme dönmek için kullanılan sisteme sürüm kontrol sistemi denir. SVN, bitkeeper, mercurial ve Git birer sürüm kontrol sistemidir.

Git, her değişimde bütün dosyaların o anki halinin bir fotografını çekip bu fotoğrafa referans vermektir. SVN’den farklı olarak dağıtık sistemdir ( aynı zamanda bitkeeper ve mercurial da dağıtık sistemlerdir).

Dağıtık sisteme dayalı olması her geliştiricinin kendi bilgisayarında projenin bağımsız bir kopyasını tutmasını sağlar. Böylece internet kesintisi dahi olsa siz projenizde değişiklik yapmaya ve bunu projeye yansıtmaya devam edebilirisiniz.

metadata: Başka veri hakkında bilgi veren veri.

Diğer kontrol sistemleri verilerin metadatasını .cvs, .svn uzantılı dosyalarda saklarken Git, .git klasöründe doğrudan metadata olarak saklar. .git sizin projenizin lokaldeki kopyasını tutmak için gereken bütün verileri, branchleri, tagleri ve versiyon tarihçesini içerir. Bunu dosyanın boyutunu şişirmeden yapar. .git ve .svn dosyalarının boyutlarındaki inanılmaz farkı görmek için buraya bakabilirsiniz. Aşağıdaki komutla .git dosyasının içeriğini incelersek:

ls -C .git

bölümlerinden oluştuğunu görürüz.

Git içeriğinin kriptografik olarak şifrelenmesi SHA-1 algoritması kullanılarak yapılmıştır. Bu da transfer sırasında veri kaybını önlemek açısında Git e büyük avantaj sağlamaktadir. Gitteki içeriğin bozulduğundan şüphelendiğiniz zaman

git fsck 

komutu ile bütün reponuzu baştan sona tarayıp, içeriğin bozulmuş olması durumunda da son sağlam içeriğin kopyasını elde edebilirsiniz.

GIT’in yapısı

commit

Çalışma alanınızda yapılan değişikliklerin anlık çekilmiş bir fotografı olarak tasvir edilebilir.

çalışma alanı

Şuan çalıştığınız dosyalardan oluşuyor (working tree). Burada yaptığınız değişiklikler, indexe aktarılmadan repoya yansıtılamaz.

git index

Yeni commitlerin tutulduğu depo. Index, çalışma alanı ve yerel depo (git repository) arasındaki geçiş basamağıdır ve reponuza değişiklikleri kontrollü bir şekilde aktarmanızı saglar.

repository

Projenin bütün değişim tarihçesini içeren yerdir.

branch

Branch, projenin bir uzantısı olup commitler zincirinden oluşur.

Yapılan son commite referans ve işaretçi görevindedir. Commitleriniz ilerledikçe işaretçi de son commite kayar.

HEAD

Şuan bulunulan branchte son commitin gercekleşitiği zaman çekilmiş resim ve şuanki branchin göstergesidir. Git, HEAD’i hangi branchte olduğunuzu anlamak icin kullanır.

GIT özeti

Git sisteminde, projede yapılan bir değişikliğin yaşam döngüsü şöyledir:

İlk aşama, çalışma alanınızda yaptığınız değişikliklerin izlenmeye alınması ve add komutu ile index’e alınmasıdır. Değişiklik burada ‘staged’ pozisyonunu alır. Index’te yer alan değişikliklerin yerel repoya aktarılması commit komutu ile sağlanır. Artık yerel reponuza da yansımış olan değişiklikleri projenizde yer alan diğer insanların ulaşabilmesi için uzak repoya göndermeniz gerekir. Bu da push komutu ile gerçekleştirilir.

Bu şemada, bir projede yapılana değişikliklerin Git evreleri arasındaki aktarımı ve bunları gerçekleştiren komutları görebilirsiniz.

  -------------         -----         ----------         ---------
|CALISMA ALANI| |INDEX| |YEREL REPO| |UZAK REPO|
------------- ----- ---------- ---------
| | | |
| yapılan | | |
| değişiklikler | ara basamaga | |
| ara basamağa | alınan | |
| alınır | değişiklikler | yerel |
|---------------->| yerel repoya | repoya aktarılan|
| add | aktarılır | değişiklikler |
| |-------------->| uzak repoya |
| | commit | aktarılır |
| | |---------------->|
| | | push |
| | | |
| | | uzak repodaki |
| | | değişiklikler |
| | | çekilir ancak |
|-------------------------------->| çalışma alanına |
| commit -a | yansıtılmaz |
| | |<----------------|
| | | fetch |
| | | |
| | | |
| uzak repodaki değişiklikler çekilir ve çalışma |
| alanına yansıtılır (fetch+merge=pull) |
|<--------------------------------------------------|
| | pull | |

--

--