Git (yazılım)

**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ştir. 2022 yılında yapılan Stack Overflow geliştirici anketine göre profesyonel yazılımcıların yaklaşık %95'i Git'i birincil sürüm kontrol aracı olarak kullandığını belirtmiştir.

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.

Torvalds, Git üzerinde çalışmaya muhtemelen 3 Nisan 2005 civarında başladı; projeyi 6 Nisan'da Linux Kernel e-posta listesinde duyurdu. Ertesi gün, 7 Nisan'da Git kendi kendini barındırır (*self-hosting*) hale geldi — ilk commit tarihi de budur. Torvalds 2007'de Git e-posta listesine yazdığı bir mesajda bu tarihleri doğrulamış ve yaklaşık iki haftalık bir hedefe sahip olduğunu belirtmiştir. 16 Haziran'da çekirdek 2.6.12 sürümünün yönetimi Git ile yapılmaya başlandı. 26 Temmuz 2005'te Torvalds, bakım sorumluluğunu projenin önemli katkıcılarından Junio Hamano'ya devretti; Hamano da 21 Aralık 2005'te 1.0 sürümünü yayımladı.

## 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.

### İç yapı ve nesneler
Git'in temelinde içerik adreslemeli (*content-addressable*) bir dosya deposu yatar. Yani Git bir dosyayı isminden değil, içeriğinden üretilen SHA-1 hash değerinden tanır. Bu yapıda dört temel nesne tipi bulunur:

* **Blob:** Tek bir dosyanın salt içeriğini tutar. Dosya adı veya dizin bilgisi blob'da yer almaz.
* **Tree:** Bir dizin yapısını temsil eder. İçinde blob'lara ya da başka tree nesnelerine referanslar, dosya adları ve erişim izinleri bulunur.
* **Commit:** Projenin belli bir andaki halinin kaydıdır. Bir tree nesnesine işaret eder; yanında yazar bilgisi, tarih, açıklama mesajı ve varsa üst (parent) commit'in hash'i yer alır.
* **Tag:** Genelde bir commit'e kalıcı bir isim vermek için kullanılır. Yazılım sürümlerini (v1.0, v2.3 gibi) etiketlemekte yaygındır.

Bu nesnelerin hepsi SHA-1 özeti ile tanımlandığı için herhangi bir commit'in kimliği, ondan önceki bütün tarihçeye bağlıdır. Geçmişte tek bir byte bile değişse hash zinciri bozulur ve fark hemen anlaşılır.

### Güvenlik ve hash yapısı
Git geçmişi yukarıda anlatıldığı gibi SHA-1 hash zinciriyle korunur. Torvalds, hash'leri güvenlikten çok *veri bütünlüğü* için tercih ettiğini açıkça ifade etmiştir — BitKeeper günlerinde CRC ve MD5 kullanılıyordu ama her şeyi kapsamıyordu ve zaman zaman fark edilmeyen bozulmalar yaşanıyordu.

Ancak SHA-1 üzerinde 2017'de gerçekleştirilen SHAttered saldırısının ardından teorik zayıflıklar daha ciddi biçimde gündeme geldi. Git ekibi bunun üzerine SHA-256 desteği üzerinde çalışmaya başladı. Ekim 2020'de yayımlanan Git 2.29 sürümü ile deneysel düzeyde SHA-256 kullanılabilir hale geldi; yine de geçiş süreci oldukça yavaş ilerliyor çünkü mevcut depoların tamamının yeniden hash'lenmesi gerekiyor.

Bunun dışında geliştiriciler, GPG ya da SSH anahtarlarıyla commit ve etiketlerini imzalayabilir. Bu sayede bir değişikliğin gerçekten o kişi tarafından yapılıp yapılmadığı doğrulanabilir; özellikle açık kaynak projelerde sıkça başvurulan bir yöntemdir.

## 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**), herhangi 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, GitLab, Gitea, Codeberg.

## Yaygınlaşması
Git'in bugünkü hakimiyetine ulaşması aslında bir anda olmadı. İlk birkaç yıl boyunca Git, ağırlıklı olarak Linux çekirdeği geliştiricileri arasında kullanılan, komut satırı ağırlıklı ve öğrenme eğrisi hayli dik bir araç olarak görülüyordu. Durumu değiştiren ilk kırılma noktası 2008 yılında Ruby on Rails topluluğunun Git'e geçmesi oldu. Torvalds'ın kendi ifadesiyle, "bir anda daha önce hayatında hiç sürüm kontrolü kullanmamış, bambaşka bir dünyadan gelen genç web geliştiricileri" Git kullanmaya başladı.

Yine 2008'de kurulan GitHub, Git depolarını web üzerinden barındırma, *fork* etme ve *pull request* mekanizmasıyla katkı sunma imkânı getirdi. Bu durum özellikle açık kaynaklı yazılım projelerinde Git'in fiilen standart haline gelmesini sağladı. Arkasından Android projesinin de kaynak kod yönetimini ve katkı kabul mekanizmasını Git üzerine kurması, telekomünikasyon sektöründeki büyük şirketleri de Git'e yönlendirdi.

Bugün Git tabanlı başlıca barındırma servisleri arasında GitHub, GitLab, Bitbucket ve SourceForge sayılabilir. Git'in geliştirilmesine Google, Microsoft, Red Hat gibi şirketlerden ve bağımsız gönüllülerden katkı gelmektedir. "Git" ticari markası, ABD Patent ve Marka Ofisi'nde 4680534 tescil numarasıyla Software Freedom Conservancy adına kayıtlıdır.

### 20. yıl
7 Nisan 2025'te Git'in ilk commit'inin üzerinden tam yirmi yıl geçti. GitHub bu vesileyle Torvalds ile uzun bir söyleşi yayımladı. Söyleşide Torvalds, Git'i toplamda sadece dört ay kadar bizzat yönettiğini, Temmuz-Ağustos 2005 civarında projeyi Hamano'ya devrettikten sonra bir daha geriye dönmediğini anlattı. Torvalds'a göre asıl övgüyü Junio Hamano ve yıllar içinde katkıda bulunan diğer geliştiriciler hak ediyordu.

Torvalds ayrıca günlük işlerinde Git'in yalnızca beş-altı komutunu kullandığını söyledi: **merge**, **blame**, **log**, **commit**, **pull** ve arada bir **status**. Büyük kızının üniversitede bilgisayar bilimleri laboratuvarında kendisini Linux'tan çok Git'in yaratıcısı olarak tanıdıklarını öğrendiğinde şaşırdığını da ekledi: *"Git benim için hiçbir zaman büyük bir şey olmadı. [[Linux çekirdeği]] üzerinde çalışmaya devam edebilmek için 'şunu bir halledeyim' dediğim bir araçtı."*

Kendisine Pijul, Jujutsu gibi alternatifleri deneyip denemediği sorulduğunda kısaca "Hayır" yanıtını verdi. Git'in başarısının arkasında birkaç basit ama sağlam tasarım kararı olduğunu vurgularken, dağıtık yapının GitHub gibi platformların doğmasını ne kadar kolaylaştırdığına dikkat çekti. DevClass'ın yıl dönümü haberinde ise GitHub'ın kurucu ortağı Scott Chacon, aynı dönemde geliştirilen Mercurial'ın "birçok açıdan benzer, hatta bazı yönlerden daha iyi" olduğunu ama çekirdek geliştiricilerinin Git'i seçmesinin tüm yazılım dünyasını o yöne ittiğini belirtti.

## İsmin kökeni
Torvalds, ismin nereden geldiğiyle ilgili birden fazla açıklama yapmıştır. İngiliz argosunda "git" kelimesi kabaca "tatsız, sevimsiz herif" gibi bir anlam taşır. Torvalds bu konuda *"Ben bencil bir herifim ve tüm projelerime kendi adımı veriyorum. Önce 'Linux', şimdi 'git'."* demiştir. Projenin kaynak kodundaki README dosyasında ise Git'in o anki ruh haline göre birkaç farklı şekilde yorumlanabileceği belirtilir:

* İşinize yarayan bir Unix komutu olduğunda: rastgele üç harfli bir bileşim.
* Sinir bozucu olduğunda ve düzgün çalışmadığında: İngiliz argosundaki anlamıyla "aptal, sevimsiz kişi".
* *man* sayfasındaki resmi tanım: "cehennemden gelen aptal içerik izleyicisi" (*the stupid content tracker*).

## Ayrıca bakınız
* Sürüm kontrol sistemi
* GitHub
* GitLab
* Bitbucket
* Mercurial
* Apache Subversion

## Kaynakça

## Dış bağlantılar
* 
* 
* 
* Linux ortamında Git kullanımı http://www.pythontr.com/makale/git-nasil-kullanilir-git-kullanimi-57  (Türkçe)