**Git**, yazılım geliştirme süreçlerinde kullanılan, hız odaklı, dağıtık çalışan bir sürüm kontrol ve kaynak kod yönetim sistemidir. İlk sürümü Linux çekirdeği'nin geliştirilmesinde kullanılmak üzere 2005 yılında bizzat Linus Torvalds tarafından tasarlanıp geliştirilmiş, 2021 yılı itibarıyla %73 pazar payına ulaşmıştır.

Git sürüm kontrol sistemini kullanan her bir çalışma dizini (proje), internet erişimi ya da merkezi bir depo olmaksızın tüm tarihçeyi tutan ve sürüm kontrol sisteminin tamamını içinde barındıran tam yetkili birer depodur. Aynı çalışma dizininin birçok depodan birindeki kopyasında yapılan değişiklikler diğerlerine güven temelli bir değerlendirmeyle kabul edilir; Güvenilmeyenden değişiklik alınmaz, o kendi ayrı sürümünü geliştirmeye devam eder.

Git'in şu anki yazılım bakıcılığını, Junio Hamano üstlenmiş durumda. Git, GNU Genel Kamu Lisansı'nın 2. sürümüyle lisanslanmış bir özgür yazılımdır. 2.26.0 sürümünden itibaren Türkçe dil desteği sunmaktadır.

Tarihçe
-------

Git'in ortaya çıkışı, çok sayıda Linux çekirdeği geliştiricisinin proje yönetimi için bir önceki sürüm kontrol sistemi olan BitKeeper'ı tercih etmesiyle başlamıştır. Andrew Tridgell, bir takım tersine-mühendislik yöntemleriyle BitKeeper protokolüne müdahalelerde bulunmuş ancak BitKeeper'ın telif haklarını elinde bulunduran Larry McVoy, BitKeeper'ın ücretsiz kullanımını reddederek konuyu hukuki platforma taşıyınca BitKeeper'ın kullanımından vazgeçilmiş, böylece Git'in temelleri atılmıştır.

O günlerde Linus Torvalds, BitKeeper uygulamasında olduğu gibi dağıtık çalışan bir sürüm kontrol sistemi istiyordu ancak piyasadaki mevcut özgür çözümlerin hiçbiri özellikle performans konusunda Torvalds'ın beklentilerini karşılamıyordu. Torvalds bu konuyu piyasadaki mevcut sürüm kontrol sistemlerini ele alarak örneklemişti; bir yamanın uygulanarak ilgili tüm veri yapılarının güncellenmesinin 30 saniye sürmesi ve tüm bu değişikliklerin ilgili diğer geliştiricilere iletilebilmesi için aynı işlemin 250 defa tekrarlanmasının Linux çekirdeğinin geliştirilmesi yönünde engel teşkil ettiğinin altını çiziyordu. Torvalds'ın hedefi bu süreyi üç saniyeye düşürmekti.

Bunun dışında Torvalds'ın başka tasarım kriterleri de vardı:

* Ne yapılmaması gerektiği konusunda CVS örneği ele alınmalı, şayet kararsız kalınırsa CVS'in sunduğu çözümün tam tersini yapmalı.
* BitKeeper'a benzer, ağ üzerinde dağıtık çalışmaya izin veren bir iş akışını desteklemeli.
* Zararlı kodlar veya yanlış kullanım nedeniyle veri kaybını önleyecek çok sıkı güvenlik yapıları bulunmalı.

Bu üç kriteri, Monotone dışında o gün piyasada var olan hiçbir sürüm kontrol sistemi yerine getiremiyordu, performans söz konusu olduğunda ise Monotone da eleniyordu. Böylece 2.6.12-rc2 sürümlü linux çekirdeğinin yayınlanmasının hemen ardından Torvalds, kendi sürüm kontrol sistemini yazmaya karar verdi.

Tasarım
-------

Git tasarımında BitKeeper ve Monotone'dan esinlenilmiştir. Git, aslında Cogito veya StGIT gibi düşük seviyeli bir sürüm kontrol sistem motoru üzerine diğerleri tarafından arayüz yazılabilecek şekilde tasarlanmıştır. Ancak çekirdek git projesi doğrudan kullanılabilecek tam bir sürüm kontrol sistemi haline gelmiştir.

Kısaca Git kavramları ve işlemleri
----------------------------------

**Git**, dağıtık bir sürüm kontrol sistemidir. Herhangi bir klasör, **init** veya **clone** komutları ile bir git **repository** yani bir git dosya deposu haline getirilebilir. Her git dosya deposunda **.git** isimli bir alt klasör vardır ve kullanıcının o depo klasörde ve onun alt klasörlerindeki dosyalarının güncel sürümlerinin ve gelişim sürecindeki tüm eski sürümlerinin yerel kopyaları .git klasöründe saklanır.

Depodaki kararlı gövde dosya kümesine **master** denir, bu kümeden geçici dal kümeler **branch** komutu ile oluşturulabilir. Kullanıcı, geliştirmek istediği kümeyi geri getirip (**checkout**), dosyalar üzerinde değişiklikler yapıp, bunları o kümenin yeni bir sürümü şeklinde depolayarak çalışır (**add** ve peşinden **commit**). Üzerinde çalışılan kümeye **head** denir.

**Git** dosyalar arasında değişenleri (**modified** denenler), otomatik algılayabilir. **Git**in takip ettiği dosyalar vardır (**tracked**), hala sürüm kontrolü altında olmayan başka dosyalar vardır (**untracked**). Dosyalar ekleme komutu **add** ile takibe alınabilir, **mv** ile klasörler arasında taşınabilir, **rm** ile silinebilirler. Bazı dosyaları **git'**in umursamaması gerekir, bunların adları **.gitignore** dosyasına yazılır. Dosyalar **add** ile depolanmaya hazır gruba eklenir (**staged**), **commit** ile o andaki halleri açıklama mesajı ekli bir şekilde depolanır, depolanmaya hazır olmayan degişiklikler **save** ve **stash** ile kenara konulup, daha sonra, belki başka kümede kullanılabilir (**pop**, **drop**, **apply**, **clear**), **clean** ile silinebiir. Klasörlerdeki metinler **grep** ile arattırılabilir.

Sürümler **commit** işlemi sırasında üretilmiş uzun **hash** sayısının ilk 6-7 rakamı ile tanınabilir. Dosyalardaki değişiklikler listelenebilir (**status**, **log**, **reflog**), görüntülenebilir (**diff**), vaz geçilebilir (**undo**), baştan alınabilir (**reset**), bir evvelki haline dönülebilir (**revert**), yazarı belirtilebilir (**blame**), her hangi bir dosyanın depodaki herhangi bir sürümü tekrar getirilebilir (**checkout**), belli kümelere isim verilebilir (**tag**).

Dağıtıklık gereği bu yerel depolar ve kümeleri arasında yerel **commit** işlemleri yüzünden farklar oluşur ve aynı depodaki kümeler arası eşitleme alış verişleri gerçekleştirilebilir (**merge**, **rebase**). Bu farklar bağımsız depolar arasında güven temelli teslimat olarak talep edilip veya sunulup kabul veya red edilebilirler ya da uzaktaki bir merkezi ana (**origin**) depodaki kümelerle güncelleme / senkronizasyon gerçekleştirilebilir (**fetch**, **remote add**, **pull**, **pull-request**, **push**), ya da oradan gelen yama uygulanabilir (**am**).

Git genellikle terminal konsolundan bu yukardaki komutlarla kullanılsa da, temelinde git komutları olan birçok daha kullanılışlı grafik arayüzü de bulunmaktadır. En bilinenleri şunlardır: masaüstü uygulaması olarak Sourcetree, IDE içinde menü seçeneği olarak Visual Studio, IntelliJ IDEA, intranet ve birer bulut tabanlı servis olarak Bitbucket, GitHub ve GitLab.

Kaynakça
--------

1. ↑  "OpenHub Compare Repositories". 2021. 15 Ağustos 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 4 Aralık 2021.
2. ↑  "How Tridge reverse engineered BitKeeper (İngilizce)". 16 Ekim 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 1 Eylül 2013.
3. ↑  "Linus Torvald'sın Kernel SCM saga başlıklı e-posta grubu tartışmasında yazdıkları (İngilizce)". 24 Aralık 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 1 Eylül 2013.
4. ↑  "Linus Torvalds'ın Git e-posta grubuna veri kaybı konusunda yazdıkları (İngilizce)". 24 Aralık 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 1 Eylül 2013.
5. ↑  "Linus Torvalds'ın Mayıs 2007 tarihli Google Tech Talk konuşması (İngilizce)". 23 Aralık 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 1 Eylül 2013.

Dış bağlantılar
---------------

* GIT resmi web sitesi
* Github üzerinde orijinal kaynak kod yansısı
* GIT öğrenmek isteyenler için Github tarafından hazırlanmış eğitim sayfası (İngilizce)
* Linux ortamında Git kullanımı  21 Aralık 2016 tarihinde Wayback Machine sitesinde arşivlendi. (Türkçe)

|  |  |
| --- | --- |
| Otorite kontrolü Bunu Vikiveri'de düzenleyin | 
* BIBSYS: 14065119
* BNF: cb17031353d (data)
* GND: 7687494-1
* LCCN: n2013035657
* NKC: ph559299
* NLI: 987007365079405171
* SUDOC: 192014498
* VIAF: 304416640
* WorldCat (LCCN): n2013-035657

 |