Git Sözlüğü: Her Geliştiricinin Bilmesi Gereken Temel Terimler

Git terminolojisi netleştiğinde Git çok daha kolay hale gelir. Başta birbirinden bağımsız görünen add, commit, switch, merge, fetch ve rebase gibi komutların tümü aslında birbirine bağlı az sayıdaki kavram üzerinde çalışır.

Bu sözlük, bu kavramları pratik bir dille açıklar. Yalnızca alfabetik bir sözlük değildir. Terimler, geliştiricilerin karşılaşma biçimine göre gruplandırılmıştır: depo yapısı, dosya durumları, geçmiş, branch’ler, iş birliği, entegrasyon, kurtarma, release süreçleri ve Git’in iç yapısı.

Her tanım bağlam, ilgili komutlar ve yaygın yanlış anlamaları içerir. Git belgelerini okurken, bir pull request’i incelerken, bir depodaki sorunu araştırırken veya alışılmadık bir iş akışını öğrenirken bu makaleyi referans olarak kullanabilirsiniz.

Bu Git Sözlüğü Nasıl Kullanılır?

Sözlüğü baştan sona kısa bir Git kursu gibi okuyabilir veya belirli bir kategoriye geçebilirsiniz:

  • Version control ve depo temelleri.

  • Working tree, index ve dosya durumları.

  • Commit’ler ve geçmiş.

  • Branch’ler ve referanslar.

  • Remote depolar ve senkronizasyon.

  • Merge, rebase ve entegrasyon.

  • Geri alma, kurtarma ve geçici çalışma.

  • Tag’ler, release’ler ve doğrulama.

  • İş birliği ve hosting platformu terimleri.

  • Git internals ve ileri düzey kavramlar.

Git terimleri bazen hem genel yazılım geliştirme anlamına hem de Git içindeki kesin bir anlama sahiptir. Bu makale onların Git bağlamındaki anlamına odaklanır.

Version Control ve Depo Temelleri

Version Control System

Version control system, dosyalardaki değişiklikleri zaman içinde kaydederek önceki durumların incelenmesini veya geri yüklenmesini sağlar. Ayrıca değişiklikleri, yazarları ve sürümler arasındaki ilişkileri tanımlayarak iş birliğini destekler.

Git dağıtık bir version control system’dir.

Distributed Version Control System

Distributed version control system, her tam clone’a kendi depo geçmişini verir; böylece geçmişle ilgili her işlem için merkezi bir sunucuya bağlanmak gerekmez.

Git ile geliştiriciler commit oluşturabilir, geçmişi inceleyebilir, branch oluşturabilir ve birçok merge işlemini yerelde gerçekleştirebilir.

Repository

Repository, dosyaları ve sürüm geçmişi dahil olmak üzere Git tarafından yönetilen projedir.

Normal bir çalışma deposu şunları içerir:

  • Görünür proje dosyaları.

  • Git meta verilerini ve nesnelerini içeren gizli .git dizini.

Yaygın komutlar:

git init
git clone
git status

Local Repository

Local repository, geliştiricinin bilgisayarında bulunur. Bu clone için kullanılabilir commit’leri, branch’leri, tag’leri, yapılandırmayı ve diğer Git verilerini içerir.

Yerel commit oluşturmak onu otomatik olarak herhangi bir yere yüklemez.

Remote Repository

Remote repository, yerel deponun iletişim kurabildiği başka bir Git deposudur. Genellikle GitHub, GitLab, Bitbucket, Azure Repos veya özel bir sunucuda barındırılır.

Remote repository şu amaçlarla kullanılabilir:

  • İş birliği.

  • Kod incelemesi.

  • Paylaşılan geçmiş.

  • Commit edilmiş çalışmanın yedeği.

  • CI/CD tetikleyicileri.

Bare Repository

Bare repository, Git depo verilerini içerir ancak normalde checkout edilmiş bir working tree içermez.

Genellikle ortak sunucu tarafı deposu olarak kullanılır.

Şöyle oluşturulur:

git init --bare project.git

Working Tree

Working tree, working directory olarak da adlandırılır ve şu anda checkout edilmiş, düzenlenebilir dosyaları içerir.

Hem staging area’dan hem de en son commit’ten farklı olabilir.

Working Directory

Working directory, çoğu zaman working tree ile eş anlamlı kullanılır. Teknik olarak geçerli dosya sistemi dizinini ifade edebilir; ancak günlük Git konuşmalarında genellikle checkout edilmiş proje dosyaları anlamına gelir.

.git Directory

.git dizini; nesneler, referanslar, yapılandırma, log’lar ve index dahil olmak üzere deponun iç verilerini saklar.

Bu dizini silmek yerel Git geçmişini kaldırır ve klasörü sıradan bir dizine dönüştürür.

Clone

Clone, var olan bir depodan oluşturulan yeni yerel depodur.

git clone https://example.com/team/project.git

Normal bir clone depo geçmişini kopyalar, remote yapılandırması oluşturur ve working tree’yi checkout eder.

Initialize

Bir depoyu initialize etmek, bir dizinin içinde Git meta verisi oluşturmak anlamına gelir.

git init

Bu işlem yeni bir yerel depo oluşturur. Remote depo oluşturmaz veya dosyaları yüklemez.

Working Tree, Index ve Dosya Durumları

Index

Index, Git’in bir sonraki commit için önerdiği snapshot’tır. Genellikle staging area olarak adlandırılır.

Bir dosya stage edildiğinde Git onun geçerli içeriğini index’e kaydeder.

Staging Area

Staging area, working tree ile bir sonraki commit arasındaki hazırlık katmanıdır.

Temel akış şöyledir:

Working Tree
    |
    | git add
    v
Staging Area / Index
    |
    | git commit
    v
Repository History

Stage

Bir değişikliği stage etmek, geçerli içeriğini bir sonraki commit’e dahil edilmek üzere index’e yerleştirmek anlamına gelir.

git add app.php

Bir dosyayı stage etmek commit oluşturmaz.

Tracked File

Tracked file, Git tarafından index veya depo geçmişi üzerinden bilinen dosyadır.

Tracked file şu durumda olabilir:

  • Değişmemiş.

  • Modified.

  • Staged.

  • Silinmiş.

Untracked File

Untracked file working tree içinde bulunur ancak index’e eklenmemiş veya commit edilmemiştir.

Kısa status çıktısı bunu şöyle gösterir:

?? filename.txt

Modified File

Modified file, working tree içeriği index’teki sürümden farklı olan tracked file’dır.

Staged File

Staged file, index içeriği geçerli commit’ten farklı olan dosyadır.

Bir sonraki commit’e dahil edilmek üzere hazırlanmıştır.

Committed File

Committed, dosyanın seçilen bir sürümünün depo geçmişine kaydedildiği anlamına gelir.

Aynı dosya daha sonra yeniden değiştirilebilir; commit edilmiş sürüm ise korunmaya devam eder.

Ignored File

Ignored file, bir ignore kuralıyla eşleşen untracked path’tir.

Ignore kuralları şuralardan gelebilir:

  • Depodaki .gitignore.

  • İç içe ignore dosyaları.

  • Global excludes dosyası.

  • Depoya özel exclude yapılandırması.

.gitignore

.gitignore dosyası, Git’in normalde görmezden gelmesi gereken untracked dosyalar için pattern’lar tanımlar.

Örnek:

.env
*.log
node_modules/
vendor/
dist/

Daha önce commit edilmiş dosyaların takibini durdurmaz.

.gitattributes

.gitattributes dosyası, eşleşen path’ler için depo düzeyindeki davranışları tanımlar.

Şunları kontrol edebilir:

  • Metin ve binary sınıflandırması.

  • Satır sonları.

  • Diff driver’ları.

  • Merge driver’ları.

  • Export davranışı.

  • Git LFS pattern’ları.

Pathspec

Pathspec, bir komutun hangi path’ler üzerinde çalışacağını Git’e bildirir.

Örnekler:

git add src/
git log -- README.md
git diff -- "*.php"

Pathspec’ler normal shell path’lerinin ötesinde pattern ve özel söz dizimini destekleyebilir.

Hunk

Hunk, diff içinde gösterilen ilişkili değişmiş satırlar bölümüdür.

Etkileşimli staging, tek tek hunk’ların seçilmesine izin verir:

git add -p

Partial Staging

Partial staging, bir dosyanın working tree’deki tüm sürümü yerine yalnızca bazı değişikliklerini stage etmek anlamına gelir.

Tek dosyada birden fazla mantıksal değişiklik bulunduğunda kullanışlıdır.

Clean Working Tree

Working tree, çalışma dosyaları ve index geçerli commit’e göre raporlanabilir değişiklik içermediğinde clean kabul edilir.

Tipik status:

nothing to commit, working tree clean

Dirty Working Tree

Dirty working tree; modified, staged, silinmiş veya ilgili untracked dosyalar içerir.

Dirty, bozuk anlamına gelmez. Yalnızca geçerli durumun commit edilmiş mevcut snapshot’tan farklı olduğunu belirtir.

Commit’ler ve Proje Geçmişi

Commit

Commit, Git geçmişinde kaydedilmiş bir noktadır. Proje snapshot’ına referans, meta veriler, mesaj ve bir veya daha fazla parent ilişkisi içerir.

Şu komutla oluşturulur:

git commit -m "Görev arama doğrulamasını ekle"

Commit Object

Commit object, bir commit’i temsil eden Git iç nesnesidir.

Şunları içerir:

  • Bir tree referansı.

  • Parent commit referansları.

  • Author bilgileri.

  • Committer bilgileri.

  • Commit mesajı.

Commit Hash

Commit hash, bir commit’i tanımlamak için kullanılan object identifier’dır.

Tam veya kısaltılmış biçimde gösterilebilir:

8f31d97

Kesin identifier, deponun object format’ına ve commit içeriğine bağlıdır.

Object ID

Object ID; commit, tree, blob veya annotated tag gibi bir Git nesnesini tanımlar.

Genellikle OID olarak kısaltılır.

Snapshot

Snapshot, bir commit tarafından temsil edilen projenin tam durumudur.

Git içeriği verimli biçimde sakladığı için değişmeyen veriler gereksiz yere çoğaltılmak yerine yeniden kullanılabilir.

Parent Commit

Parent commit, bir commit tarafından referans verilen önceki commit’tir.

Normal commit genellikle bir parent’a sahiptir. İlk commit’in parent’ı yoktur. Merge commit iki veya daha fazla parent’a sahip olabilir.

Root Commit

Root commit, parent’ı olmayan commit’tir. Bir geçmiş hattını başlatır.

Normal bir depoda genellikle tek root commit bulunur; ancak olağandışı geçmişlerde birden fazla olabilir.

Merge Commit

Merge commit, birden fazla parent’a sahip commit’tir ve normalde ayrışmış geçmişler birleştirildiğinde oluşturulur.

Hem birleştirilmiş snapshot’ı hem de geçmişler arasındaki ilişkiyi kaydeder.

Author

Author, commit’in temsil ettiği değişikliği başlangıçta oluşturan kişidir.

Committer

Committer, commit’in geçerli biçimini geçmişe kaydeden kişidir.

Author ve committer çoğu zaman aynıdır; ancak patch uygulama, cherry-pick veya rebase sonrasında farklı olabilir.

Commit Message

Commit message, commit’in amacını ve bağlamını açıklar.

Genellikle şunları içerir:

  • Kısa bir başlık.

  • İsteğe bağlı açıklayıcı gövde.

  • İsteğe bağlı yapılandırılmış trailer’lar.

Trailer

Trailer, commit mesajının sonuna yakın yerleştirilen yapılandırılmış meta veridir.

Örnekler:

Signed-off-by: Jane Developer <jane@example.com>
Reviewed-by: Alex Maintainer <alex@example.com>
Fixes: #142

Revision

Revision, komuta bağlı olarak bir commit’e veya commit kümesine referans veren ad ya da ifadedir.

Örnekler:

HEAD
main
v1.0.0
HEAD~2
main..feature/search

History

Git history, commit’lerin ve parent ilişkilerinin oluşturduğu grafiktir.

Şu komutla incelenir:

git log --oneline --graph --decorate --all

Reachable Commit

Git bir referanstan parent bağlantılarını takip ederek bir commit’e ulaşabiliyorsa bu commit o referanstan reachable’dır.

Reachability, birçok log ve range işleminde hangi commit’lerin gösterileceğini belirler.

Unreachable Commit

Unreachable commit, branch veya tag gibi sıradan referanslardan ulaşılamayan commit’tir.

Geçici olarak var olmaya devam edebilir ve cleanup kaldırmadan önce reflog veya nesne incelemesiyle bazen bulunabilir.

Commit Graph

Commit graph, commit’ler ve parent ilişkilerinin oluşturduğu yönlü geçmiş yapısıdır.

Yalnızca zaman damgalarıyla belirlenmez.

First Parent

First parent, bir commit’te ilk sırada kaydedilen ana parent’tır.

Merge commit için first-parent geçmişi genellikle merge işlemini alan branch’i takip eder.

git log --first-parent

Ancestor

Bir commit, daha sonraki commit’ten parent bağlantıları geriye doğru takip edildiğinde ulaşılabiliyorsa diğerinin ancestor’ıdır.

Descendant

Eski commit parent ilişkileri üzerinden yeni commit’ten ulaşılabiliyorsa yeni commit eski commit’in descendant’ıdır.

Referanslar, Branch’ler ve HEAD

Reference

Reference, genellikle ref olarak kısaltılır ve object ID’ye işaret eden addır.

Branch ve tag’ler yaygın referanslardır.

Ref

Ref, reference için kullanılan yaygın kısaltmadır.

Tam referans adlarına örnekler:

refs/heads/main
refs/tags/v1.0.0
refs/remotes/origin/main

Branch

Branch, bir geliştirme hattını tanımlamak için kullanılan hareketli referanstır.

Geçerli branch üzerinde commit oluşturulduğunda branch normalde yeni commit’e ilerler.

Local Branch

Local branch, yerel depoda bulunan ve checkout edilip yerel commit’lerle güncellenebilen branch’tir.

Örnekler:

main
feature/task-search
fix/payment-timeout

Remote-Tracking Branch

Remote-tracking branch, yerel deponun remote depodaki bir branch için bildiği en son durumu kaydeder.

Örnek:

origin/main

Normal yerel commit’lerle değil, fetch işlemleriyle güncellenir.

Default Branch

Default branch, repository hosting platformu veya clone işlemi tarafından varsayılan olarak seçilen branch’tir.

Genellikle main olarak adlandırılır; ancak adı yapılandırılabilir.

Feature Branch

Feature branch, tek bir feature veya mantıksal değişikliği geliştirmek için kullanılan geçici branch’tir.

Genellikle incelenir, merge edilir ve entegrasyon sonrasında silinir.

Release Branch

Release branch, bir release hattını hazırlamak veya sürdürmek için kullanılır.

Kesin rolü proje iş akışına bağlıdır. Stabilizasyon için geçici veya desteklenen sürümler için uzun ömürlü olabilir.

Hotfix Branch

Hotfix branch, production veya yayınlanmış kod hattı üzerinden acil onarım yapmak için kullanılır.

Topic Branch

Topic branch; feature, fix veya deney gibi tek bir kavramsal değişikliği içeren kısa ömürlü branch için genel terimdir.

HEAD

HEAD, şu anda checkout edilmiş konumu tanımlar.

Normalde geçerli branch’e sembolik olarak işaret eder:

HEAD -> main -> commit

Symbolic Reference

Symbolic reference, doğrudan object ID yerine başka bir referansa işaret eder.

HEAD genellikle geçerli branch’e symbolic reference olarak davranır.

Detached HEAD

Detached HEAD, HEAD’in branch yerine doğrudan commit’e işaret etmesi anlamına gelir.

Tarihsel sürümleri incelemek için kullanışlıdır; ancak yeni commit’ler branch oluşturularak korunmalıdır.

git switch --detach v1.0.0
git switch -c support/1.0

Branch Tip

Branch tip, branch’in şu anda referans verdiği commit’tir.

Upstream Branch

Upstream branch, local branch ile ilişkili branch olarak yapılandırılan branch’tir.

Ahead/behind raporlamasını ve senkronizasyon komutlarının varsayılanlarını destekler.

Tracking Branch

Tracking branch, upstream branch yapılandırılmış local branch’tir.

Remote-tracking branch ile karıştırılmamalıdır.

Ahead

Local branch, upstream’de bulunmayan commit’lere sahipse upstream’inin ahead’indedir.

Behind

Upstream, local branch’te bulunmayan commit’lere sahipse local branch upstream’inin behind’ındadır.

Diverged

Her iki taraf da diğerinde bulunmayan commit’lere sahipse branch’ler diverged olmuştur.

Revision Söz Dizimi ve Commit Seçimi

HEAD^

HEAD^ normalde HEAD’in first parent’ına referans verir.

Merge commit için:

HEAD^1
HEAD^2

farklı parent’ları seçer.

HEAD~n

HEAD~n, first-parent ilişkisini n kez takip eder.

HEAD~3

HEAD’den önceki üç first-parent adımı anlamına gelir.

Two-Dot Range

Revision-walking komutlarında A..B genellikle B’den reachable olan ancak A’dan olmayan commit’leri seçer.

git log main..feature/search

Three-Dot Range

git log için A...B, taraflardan birinden reachable olan ancak ikisinden birden olmayan commit’leri seçer.

git diff için three-dot söz dizimi, merge base ile sağ taraftaki revision’ı karşılaştırır.

Merge Base

Merge base, iki commit’in en iyi ortak ancestor’ıdır.

git merge-base main feature/search

Branch’lerin nerede ayrıştığını belirlemek için yaygın olarak kullanılır.

Peeling a Tag

Peeling, annotated tag nesnesinden referans verdiği nesneye ilerlemek anlamına gelir.

git rev-parse v1.0.0^{}
git rev-parse v1.0.0^{commit}

Reflog Selector

Reflog selector, bir referansın daha önce kaydedilmiş konumuna referans verir.

HEAD@{1}
main@{yesterday}

Kullanılabilirlik yerel reflog geçmişine bağlıdır.

Remote Depolar ve Senkronizasyon

Remote

Remote, başka bir depoyu temsil eden yapılandırılmış ad ve URL’dir.

Remote’ları listeleyin:

git remote -v

origin

origin, clone edilen depoya verilen geleneksel varsayılan addır.

Özel bir sunucu türü değildir ve yeniden adlandırılabilir.

upstream

upstream, origin kişisel fork’a işaret ederken resmî depo için kullanılan yaygın remote adıdır.

Bu bir kural değil, adlandırma geleneğidir.

Remote URL

Remote URL, Git’e başka bir depoyla nasıl iletişim kuracağını bildirir.

Yaygın biçimler:

https://example.com/team/project.git
git@example.com:team/project.git
ssh://git@example.com/team/project.git

Fetch

Fetch, nesneleri indirir ve remote-tracking referanslarını günceller; ancak bunları geçerli branch’e otomatik olarak entegre etmez.

git fetch origin

Pull

Pull, remote değişikliklerini fetch eder ve ardından yapılandırma ile seçeneklere göre entegre eder.

Entegrasyon merge, rebase veya fast-forward-only davranışı kullanabilir.

git pull --ff-only

Push

Push, nesneleri gönderir ve remote depodaki referansları günceller.

git push origin main

Daha yeni remote geçmişin üzerine yazacaksa push reddedilebilir.

Refspec

Refspec, referansların local ve remote depolar arasında nasıl eşleşeceğini açıklar.

Örnek:

refs/heads/main:refs/heads/main

Refspec’ler fetch ve push işlemlerinde kullanılır.

Fast-Forward Push

Yeni remote branch tip mevcut remote tip’in descendant’ıysa push fast-forward’dur.

Remote commit’ler branch geçmişinden kaldırılmaz.

Non-Fast-Forward Push

Non-fast-forward push, remote branch tip’i mevcut tip’i içermeyen bir commit ile değiştirecektir.

Force davranışı kullanılmadıkça normalde reddedilir.

Force Push

Force push, normal fast-forward güvenliği başarısız olsa bile remote referansı günceller.

git push --force

Paylaşılan geçmişin üzerine yazabilir.

Force with Lease

--force-with-lease, yalnızca remote referans yerel deponun beklediği durumla hâlâ eşleşiyorsa force güncellemesi yapar.

git push --force-with-lease

Kör force push’tan daha güvenlidir; ancak yine de remote geçmişi yeniden yazar.

Prune

Pruning, karşılık gelen remote branch artık var olmayan eski remote-tracking referanslarını kaldırır.

git fetch --prune

Fork

Fork, bir deponun başka bir hesap veya namespace altında bulunan sunucu tarafı kopyasıdır ve genellikle hosting platformu üzerinden oluşturulur.

Dış katkılarda yaygın olarak kullanılır.

Mirror

Mirror, başka bir deponun referanslarını kapsamlı biçimde çoğaltmak amacıyla kullanılan depodur.

Mirror clone ve push işlemleri normal branch senkronizasyonundan daha kapsamlıdır.

Merge ve Entegrasyon

Merge

Merge, geliştirme geçmişlerini geçerli branch içinde birleştirir.

git switch main
git merge feature/search

Fast-Forward Merge

Fast-forward merge, mevcut branch üzerinde birleştirilmesi gereken ayrışmış commit bulunmadığı için branch’in doğrudan diğer branch tip’ine ilerleyebildiği durumdur.

Three-Way Merge

Three-way merge şunları birleştirir:

  • Geçerli branch tip’i.

  • Diğer branch tip’i.

  • İkisinin merge base’i.

Geçmişler ayrışmışsa normalde merge commit oluşturur.

Merge Conflict

Merge conflict, Git güvenli bir birleşik sonucu otomatik olarak belirleyemediğinde oluşur.

Geliştiricilerin amaçlanan içeriği çözmesi ve sonucu stage etmesi gerekir.

Conflict Marker

Conflict marker’lar rekabet eden metin bölümlerini gösterir:

<<<<<<< HEAD
Geçerli branch içeriği
=======
Gelen branch içeriği
>>>>>>> feature/search

Çözüm sırasında kaldırılmalıdır.

Ours

Normal merge sırasında ours, geçerli branch tarafını ifade eder.

Theirs

Normal merge sırasında theirs, merge edilen branch tarafını ifade eder.

Rebase işlemlerinde bakış açısı daha az sezgisel olabilir; bu nedenle her zaman geçerli işlemi inceleyin.

Merge Strategy

Merge strategy, Git’in geçmişleri birleştirmek için kullandığı üst düzey algoritmadır.

Şöyle seçilebilir:

git merge -s <strategy>

Strategy Option

Strategy option, seçilen merge strategy içindeki davranışı değiştirir.

git merge -Xours feature/search

-Xours, ayrı ours merge strategy ile aynı değildir.

Octopus Merge

Octopus merge, ikiden fazla head’i tek merge commit içinde birleştirir.

Normalde bağımsız ve conflict oluşturmayan topic’ler için kullanılır.

Squash Merge

Squash merge, bir branch’in net değişikliklerini hedef branch üzerinde tek yeni commit halinde birleştirir.

Normal merge commit’in yaptığı gibi orijinal branch’in parent ilişkisini korumaz.

Rebase

Rebase, commit’leri yeni bir base üzerinde yeniden oynatarak yerlerine geçen commit’ler oluşturur.

git rebase main

Doğrusal geçmiş oluşturabilir; ancak commit ID’lerini değiştirir.

Interactive Rebase

Interactive rebase, seçilen commit’lerin yeniden sıralanmasına, düzenlenmesine, birleştirilmesine, mesajının değiştirilmesine veya kaldırılmasına izin verir.

git rebase -i HEAD~5

Squash

Commit’leri squash etmek, birkaç commit’i tek commit içinde birleştirmek anlamına gelir.

Interactive rebase veya hosting platformundaki squash merge ile yapılabilir.

Fixup Commit

Fixup commit, autosquash rebase sırasında daha önceki commit ile otomatik olarak birleştirilmek üzere oluşturulan commit’tir.

git commit --fixup=<commit>

Autosquash

Autosquash, tanınan fixup! ve squash! commit’lerini interactive rebase sırasında hedeflerinin yanına taşır.

git rebase -i --autosquash main

Cherry-Pick

Cherry-pick, var olan bir commit’in getirdiği değişikliği geçerli branch üzerine yeni commit olarak uygular.

git cherry-pick abc1234

Backport ve seçili düzeltmeler için yaygın olarak kullanılır.

Backport

Backport, daha yeni bir fix veya feature’ı bakımı sürdürülen eski release hattına uygular.

Genellikle cherry-pick kullanılır ve ardından eski ortam üzerinde test yapılır.

Revert

Revert, başka bir commit’in getirdiği değişiklikleri tersine çeviren yeni bir commit oluşturur.

git revert abc1234

Orijinal commit’i silmeden paylaşılan geçmişi geri almak için uygundur.

Geri Alma, Kurtarma ve Geçici Çalışma

Restore

git restore, working tree veya index içeriğini başka bir kaynaktan günceller.

Örnekler:

git restore file.txt
git restore --staged file.txt

İlki unstaged çalışmayı silebilir. İkincisi working file’ı korurken değişiklikleri unstaged hale getirir.

Reset

Reset, branch referansını hareket ettirir ve moda bağlı olarak index ile working tree’yi de güncelleyebilir.

Soft Reset

Soft reset, index ve working tree içeriğini korurken branch’i hareket ettirir.

git reset --soft HEAD~1

Mixed Reset

Mixed reset, branch’i hareket ettirir ve index’i sıfırlarken working tree değişikliklerini korur.

Varsayılan reset modudur.

Hard Reset

Hard reset, branch’i hareket ettirir ve hem index’i hem de working tree’yi sıfırlar.

git reset --hard HEAD~1

Commit edilmemiş çalışmayı yok edebilir.

Stash

Stash, seçilen yerel değişiklikleri geçici olarak saklar ve normalde daha temiz bir çalışma durumu geri yükler.

git stash push -m "WIP: görev araması"

Stash Entry

Stash entry, stash reflog üzerinden tanımlanan tek bir kaydedilmiş stash durumudur:

stash@{0}

Apply

Bir stash’i apply etmek değişikliklerini geri yükler ve stash entry’yi korur.

git stash apply

Pop

Bir stash’i pop etmek değişiklikleri uygular ve başarılı uygulamadan sonra stash’i kaldırır.

git stash pop

Drop

Stash’i drop etmek bir stash entry’yi kaldırır.

git stash drop stash@{1}

Clear

Stash’leri clear etmek tüm stash entry’leri kaldırır.

git stash clear

Reflog

Reflog, HEAD ve branch tip’leri gibi referanslarda yapılan yerel güncellemeleri kaydeder.

git reflog

Reset, rebase, amend, branch silme veya detached çalışma sonrasında commit’leri kurtarmaya yardımcı olabilir.

Recovery Branch

Recovery branch, reflog veya nesne incelemesiyle bulunan commit’i korumak için oluşturulan yeni branch’tir.

git branch recovery HEAD@{2}

Clean

git clean, untracked dosyaları kaldırır.

Önce önizleyin:

git clean -nd

Untracked dosya ve dizinleri silin:

git clean -fd

Başka yerde saklanmayan yerel dosyaları kalıcı olarak kaldırabilir.

Amend

Amend, en son commit’i güncellenmiş içerik veya meta veri içeren yeni commit ile değiştirir.

git commit --amend

Commit ID değişir.

Tag’ler, Release’ler ve Doğrulama

Tag

Tag, bir nesneye—genellikle commit’e—kararlı bir ad vermek için kullanılan referanstır.

Tag’ler genellikle release ve milestone’ları tanımlar.

Lightweight Tag

Lightweight tag doğrudan bir nesneye işaret eder.

git tag v1.0.0

Ayrı tag mesajı veya tagger meta verisi içermez.

Annotated Tag

Annotated tag; tagger, tarih, mesaj ve isteğe bağlı imza içeren tag object oluşturur.

git tag -a v1.0.0 -m "1.0.0 sürümünü yayınla"

Signed Tag

Signed tag, kriptografik imza taşıyan annotated tag’dir.

git tag -s v1.0.0 -m "1.0.0 sürümünü yayınla"

Release Tag

Release tag, yayınlanmış commit’i tanımlamak için tag kullanan proje kuralıdır.

Git version anlamını zorunlu kılmaz.

Semantic Versioning

Semantic Versioning şu yapıya dayalı version adlandırma kuralıdır:

MAJOR.MINOR.PATCH

v2.4.1 gibi tag adlarında sık kullanılır; ancak Git’in yerleşik özelliği değildir.

Describe

git describe, yakındaki bir tag’i temel alarak commit için okunabilir bir ad oluşturur.

git describe --tags --always

Verification

Verification, imzayı veya nesne ilişkisini kontrol eder.

Örnekler:

git verify-tag v1.0.0
git verify-commit abc1234

Signed Commit

Signed commit, commit object ile ilişkili kriptografik imza içerir.

Sign-Off

Sign-off, commit mesajına eklenen metinsel Signed-off-by trailer’ıdır.

git commit --signoff

Kriptografik imzalama ile aynı değildir.

İş Birliği ve Hosting Platformu Terimleri

Pull Request

Pull request, değişikliklerin incelenip başka bir branch’e merge edilmesini öneren hosting platformu iş birliği özelliğidir.

Yerel bir Git nesnesi değildir.

Merge Request

Merge request, GitLab’in inceleme ve entegrasyon önerisi için kullandığı yaygın terimdir. Kavramsal olarak pull request’e benzer.

Code Review

Code review, önerilen değişiklikleri entegrasyon öncesinde inceleme ve tartışma sürecidir.

Şunları içerebilir:

  • Satır içi yorumlar.

  • Tasarım geri bildirimi.

  • Test incelemesi.

  • Güvenlik analizi.

  • Onay kararları.

Reviewer

Reviewer, önerilen değişiklikleri değerlendirmesi istenen kişidir.

Approval

Approval, reviewer’ın önerilen değişikliği proje politikasına göre kabul ettiğini belirten hosting platformu inceleme durumudur.

Draft Pull Request

Draft pull request, çalışma merge edilmeye hazır olmadan önce tartışma ve CI için görünür hale getirir.

Protected Branch

Protected branch, hosting platformu kuralları tarafından kontrol edilen ve doğrudan push, force push, silme veya merge işlemlerinin kısıtlanabildiği branch’tir.

Required Check

Required check, entegrasyon öncesinde başarılı olması gereken otomatik sonuçtur.

Status Check

Status check, commit veya pull request ile ilişkili otomatik doğrulamanın sonucunu bildirir.

CI

Continuous Integration, sık entegre edilen değişiklikleri build, test, analiz ve ilgili kontrollerle otomatik olarak doğrular.

CD

CD, Continuous Delivery veya Continuous Deployment anlamına gelebilir.

  • Continuous Delivery: Yazılım release için hazır tutulur; deployment onay gerektirebilir.

  • Continuous Deployment: Kabul edilen değişiklikler otomatik olarak deploy edilir.

Pipeline

Pipeline; test, build, paketleme, tarama ve deployment gibi job’lardan oluşan otomatik sıralamadır.

Workflow

Git workflow, ekibin branch, commit, inceleme, entegrasyon, release ve bakım sürecidir.

Platform otomasyon workflow’u ise yapılandırılmış otomatik süreçtir. Anlamı bağlam belirler.

GitHub Flow

GitHub Flow; korumalı default branch, kısa ömürlü branch’ler, pull request’ler, inceleme, kontroller ve sık entegrasyona dayalı hafif bir workflow’dur.

Git Flow

Git Flow; uzun ömürlü main ve develop branch’leriyle feature, release ve hotfix branch’lerini kullanan release odaklı branch modelidir.

Trunk-Based Development

Trunk-based development, genellikle çok kısa ömürlü branch’ler ve feature flag’lerle tek ana branch’e sık entegrasyonu vurgular.

Forking Workflow

Forking Workflow, her katkıcıya kişisel sunucu tarafı fork verir ve resmî depoya pull request kullanılmasını sağlar.

CODEOWNERS

CODEOWNERS, seçilen path’ler için inceleme sorumluluğu atayan hosting platformu kuralıdır.

Git çekirdek davranışının bir parçası değildir.

Diff, İnceleme ve Hata Ayıklama Terimleri

Diff

Diff, iki durum arasındaki farkları açıklar.

Örnekler:

git diff
git diff --staged
git diff v1.0.0 v1.1.0

Patch

Patch, incelenebilen veya uygulanabilen değişikliklerin metinsel gösterimidir.

Unified Diff

Unified diff, context satırlarını ve ekleme ya da silmeleri gösteren yaygın patch formatıdır.

Eklenen satırlar +, silinen satırlar - ile başlar.

Context Line

Context line, patch’in anlaşılmasını ve uygulanmasını kolaylaştırmak için değişen satırların çevresinde gösterilen değişmemiş satırdır.

Blame

git blame, satırları en son değiştiren commit’lerle işaretler.

git blame app.php

Kişisel suç atamak için değil, bağlamı araştırmak için kullanılmalıdır.

Pickaxe Search

Pickaxe search, içerik değişikliklerine göre commit arar.

Tam string sayısındaki değişiklikler:

git log -S"functionName" -p

Regular expression ile eşleşen değişmiş satırlar:

git log -G"function.*Name" -p

Bisect

git bisect, davranışın ilk kez bozulduğu commit’i bulmak için commit’ler arasında binary search yapar.

Good Commit

Bisect sırasında good commit, sorunu içermediği bilinen commit’tir.

Bad Commit

Bisect sırasında bad commit, sorunu içerdiği bilinen commit’tir.

Shortlog

git shortlog, commit’leri author’a göre gruplandırarak özetler.

Mailmap

.mailmap dosyası, raporlama amacıyla alternatif ad ve e-posta adreslerini standart katkıcı kimlikleriyle eşleştirir.

Range-Diff

git range-diff, bir commit serisinin iki sürümünü karşılaştırır.

Rebase veya revision sonrasında patch serisinin nasıl değiştiğini incelemek için kullanışlıdır.

Git Internals

Object Database

Object database, object ID ile adreslenen Git nesnelerini saklar.

Yaygın nesne türleri:

  • Blob.

  • Tree.

  • Commit.

  • Tag.

Blob

Blob object, dosya içeriğini saklar.

Dosya adını kendi içinde saklamaz. Dosya adları tree object’ler üzerinden ilişkilendirilir.

Tree

Tree object, adları blob veya diğer tree’lerle eşleştiren dizin benzeri snapshot’ı temsil eder.

Tag Object

Tag object, annotated tag meta verisini saklar ve başka bir nesneye işaret eder.

Content-Addressable Storage

Git, nesneleri içeriklerinden ve meta veri gösterimlerinden türetilen identifier’larla saklar.

Nesne değişirse ID’si de değişir.

Plumbing Command

Plumbing command; script, araç ve iç workflow’lar için tasarlanan daha düşük seviyeli Git işlemlerini açığa çıkarır.

Örnekler:

git cat-file
git hash-object
git update-index
git write-tree
git commit-tree

Porcelain Command

Porcelain command, kullanıcıya yönelik daha yüksek seviyeli interface sağlar.

Örnekler:

git add
git commit
git switch
git merge
git status

Packfile

Packfile, verimlilik için birçok Git nesnesini sıkıştırılmış biçimde saklar.

Loose Object

Loose object, packfile içinde değil ayrı olarak saklanan nesnedir.

Garbage Collection

Garbage collection, depo depolamasını optimize eder ve sonunda unreachable nesneleri kaldırabilir.

git gc

Prune

Nesne bakımında prune, politikaya göre yeterince eski olan unreachable nesnelerin kaldırılması anlamına gelebilir.

Bu, eski remote-tracking referanslarını prune etmekten farklıdır.

Index Entry

Index entry; mode, object ID ve stage numarası dahil olmak üzere path ile ilişkili staged bilgileri kaydeder.

Index Stage

Conflict sırasında index birden fazla stage içerebilir:

  • Stage 1: Merge base.

  • Stage 2: Ours.

  • Stage 3: Theirs.

Hooks

Hooks, Git işlemlerinin belirli noktalarında çağrılan programlardır.

Örnekler:

  • pre-commit.

  • commit-msg.

  • pre-push.

  • post-merge.

Worktree

Git worktree, aynı depo verisine bağlı ek working tree’dir.

git worktree add ../project-hotfix hotfix/login

Bağımsız tam clone oluşturmadan birden fazla branch’in ayrı dizinlerde checkout edilmesine izin verir.

Submodule

Submodule, parent depo içinde belirli bir commit’te başka bir Git deposunu kaydeder.

Projelerin bağımsız olarak version’lanması gerektiğinde kullanışlıdır; ancak senkronizasyon ve onboarding karmaşıklığı ekler.

Superproject

Superproject, bir veya daha fazla submodule içeren depodur.

Shallow Clone

Shallow clone, sınırlı geçmiş içerir ve genellikle şu komutla oluşturulur:

git clone --depth=1 URL

Daha fazla geçmiş fetch edilene kadar bazı geçmiş işlemleri sınırlıdır.

Partial Clone

Partial clone, seçilen nesne içeriğini başlangıçta dahil etmez ve gerektiğinde indirir.

Büyük depolar için kullanışlıdır.

Sparse Checkout

Sparse checkout, working tree içinde hangi tracked path’lerin görüneceğini sınırlar.

Depo, şu anda checkout edilmemiş path’leri yine de biliyor olabilir.

Git LFS

Git Large File Storage, Git içinde küçük pointer dosyaları tutarken büyük içeriği ayrı yerde saklayan eklentidir.

Büyük binary asset’ler için kullanışlıdır; ancak sunucu ve istemci desteği gerektirir.

Komut Satırı ve Yapılandırma Terimleri

Option

Option, komut davranışını değiştirir.

Örnekler:

--staged
--oneline
--all
-p

Argument

Argument; branch, commit, remote veya path gibi komuta verilen değerdir.

git show v1.0.0

v1.0.0 bir argument’tır.

Double Dash

--, genellikle seçenekleri veya revision’ları path’lerden ayırır.

git log -- README.md
git diff HEAD~1 HEAD -- src/

Configuration Scope

Git yapılandırması birkaç scope’ta bulunabilir:

  • System.

  • Global.

  • Local repository.

  • Worktree.

  • Command invocation.

Daha özel ve geçerli ayarlar normalde daha genel ayarların üzerine yazar.

Global Configuration

Global configuration, geçerli işletim sistemi kullanıcısı için varsayılanlar sağlar.

git config --global user.name "Jane Developer"

Local Configuration

Local configuration tek bir depoya uygulanır ve normalde .git/config içinde saklanır.

Alias

Alias, Git komutu veya komut dizisi için daha kısa bir ad oluşturur.

git config --global alias.lg "log --graph --decorate --oneline --all"

Credential Helper

Credential helper, Git remote işlemlerine yönelik kimlik doğrulama bilgilerini saklar, getirir, cache’ler veya yönetir.

Commit kimliği ayarları authentication credentials değildir.

Pager

Pager, uzun çıktıyı bir seferde bir ekran gösterir.

git log gibi komutlar genellikle pager kullanır.

Yaygın pager ortamlarında çıkmak için q tuşuna basın.

Diff Driver

Diff driver, Git’in seçilen dosya türlerini nasıl karşılaştıracağını özelleştirir.

Merge Driver

Merge driver, seçilen path’lerin nasıl merge edileceğini özelleştirir.

Clean Filter

Clean filter, içerik index üzerinden Git object storage’a girerken onu dönüştürür.

Smudge Filter

Smudge filter, içerik working tree’ye yazılırken onu dönüştürür.

Git LFS, işleyişinin bir parçası olarak filter mekanizmalarını kullanır.

Sık Karıştırılan Git Terimleri

Git ve GitHub

Git, version control system’dir. GitHub ise Git depoları etrafında oluşturulmuş hosting ve iş birliği platformudur.

Stage ve Commit

Stage, içeriği index içinde hazırlar. Commit ise staged snapshot’ı geçmişe kaydeder.

Fetch ve Pull

Fetch, remote bilgileri entegre etmeden indirir. Pull ise fetch yapar ve ardından seçilen davranışa göre entegrasyon gerçekleştirir.

Pull ve Push

Pull, remote değişikliklerini local depoya getirir. Push ise local değişiklikleri remote depoya gönderir.

Branch ve Tag

Branch yeni commit’ler oluşturuldukça hareket eder. Tag normalde tek bir nesnede sabit kalır.

Local Branch ve Remote-Tracking Branch

Local branch yerel geliştirme için kullanılır. Remote-tracking branch ise remote branch’in en son fetch edilmiş durumunu kaydeder.

Upstream Branch ve upstream Remote

Upstream branch, local branch için tracking yapılandırmasıdır. upstream adlı remote ise fork workflow’larında yaygın olarak kullanılan adlandırma geleneğidir.

Merge ve Rebase

Merge mevcut geçmişleri birleştirir ve çok parent’lı commit oluşturabilir. Rebase commit’leri yeniden oynatır ve yerine geçen yeni commit’ler oluşturur.

Revert ve Reset

Revert yeni bir geri alma commit’i oluşturur. Reset branch’i hareket ettirir ve index ile working tree’yi değiştirebilir.

Restore ve Reset

Restore, working tree veya index içindeki dosya içeriğine odaklanır. Reset ise referansları hareket ettirebilir ve depo katmanlarını güncelleyebilir.

Apply ve Pop

Stash apply değişiklikleri geri yükler ve stash’i korur. Pop ise geri yükler ve başarıdan sonra kaldırır.

Sign-Off ve Signature

Sign-off bir mesaj trailer’ıdır. Signature ise commit veya annotated tag’e eklenen kriptografik veridir.

Commit Hash ve Branch Name

Commit hash tek bir nesneyi tanımlar. Branch name ise zaman içinde farklı commit’lere işaret edebilen hareketli referanstır.

Working Tree ve Repository

Working tree görünür ve checkout edilmiş dosyalardır. Repository ise Git geçmişini, nesneleri ve referansları içerir.

Ignored ve Untracked

Ignored dosyalar ignore kurallarıyla eşleşen untracked path’lerdir. Her untracked dosya ignored değildir.

Merge Conflict ve Failed Merge

Conflict, seçilen path’ler için Git’in insan kararına ihtiyaç duyduğu anlamına gelir. Merge işlemi çözüm sonrasında devam ettirilebilir veya iptal edilebilir.

Pratik Git Terminolojisi Örneği

Şu workflow’u düşünün:

git clone https://example.com/team/project.git
git switch -c feature/task-search

# Dosyaları düzenleyin
git status
git add -p
git commit -m "Görev anahtar kelime eşlemesini ekle"

git fetch origin
git rebase origin/main
git push -u origin feature/task-search

Terminoloji şöyledir:

  • Clone: Remote repository’den local repository oluşturur.

  • Remote: origin adlı sunucu tarafı deposudur.

  • Branch: feature/task-search hareketli local reference’tır.

  • Working tree: Düzenlenen proje dosyalarıdır.

  • Status: Tracked, untracked, staged ve modified path’lerin raporudur.

  • Partial staging: git add -p hunk’ları seçer.

  • Commit: Staged snapshot’ı kaydeder.

  • Fetch: Remote-tracking bilgilerini günceller.

  • Rebase: Feature commit’lerini güncellenmiş remote base üzerinde yeniden oynatır.

  • Push: Local branch’i yayınlar.

  • Upstream: -u, remote branch ilişkisini yapılandırır.

Temel Terimler Kontrol Listesi

Yeni başlayan biri şunları açıklayabilmelidir:

  • Repository.

  • Working tree.

  • Index veya staging area.

  • Tracked ve untracked dosyalar.

  • Commit.

  • Branch.

  • HEAD.

  • Remote.

  • Fetch, pull ve push.

  • Merge ve conflict.

  • Tag.

  • Stash.

  • Revert ve reset.

Orta düzey Git kullanıcısı ayrıca şunları anlamalıdır:

  • Upstream branch’ler.

  • Remote-tracking branch’ler.

  • Revision range’leri.

  • Merge base’ler.

  • Rebase ve cherry-pick.

  • Reflog.

  • Annotated tag’ler.

  • Force-with-lease.

  • Interactive staging ve rebase.

İleri düzey kullanıcı şunları anlamalıdır:

  • Object türleri.

  • Reference namespace’leri.

  • Index stage’leri.

  • Refspec’ler.

  • Reachability.

  • Plumbing command’lar.

  • Packfile ve bakım.

  • Partial clone ve sparse checkout.

  • Submodule ve worktree’ler.

Sık Sorulan Sorular

Commit ile Dosya Sürümü Aynı Şey mi?

Hayır. Commit yalnızca tek dosyayı değil, proje snapshot’ını ve meta verileri temsil eder.

Branch Projenin Bir Kopyası mı?

Hayır. Branch commit’e işaret eden hareketli referanstır. Branch değiştirildiğinde working tree güncellenir.

origin Her Zaman GitHub mı?

Hayır. origin yalnızca geleneksel remote adıdır ve uyumlu herhangi bir Git deposuna işaret edebilir.

git add Dosya Yükler mi?

Hayır. Dosyayı yerelde stage eder. Commit edilmiş nesnelerin yüklenmesi push gerektirir.

git pull İndirme Anlamına mı Gelir?

Fetch aracılığıyla indirir ve ardından entegrasyon adımı gerçekleştirir. Anında entegrasyon olmadan indirmek istediğinizde git fetch kullanın.

HEAD Tüm Depodaki En Son Commit mi?

Hayır. HEAD şu anda checkout edilmiş konumu tanımlar. Başka bir branch daha yeni veya farklı commit’ler içerebilir.

Commit ID’leri Kalıcı mı?

Var olan commit object ID’sini korur; ancak rebase, amend ve cherry-pick yeni ID’lere sahip yeni commit’ler oluşturur.

Branch Silmek Commit’lerini de Siler mi?

Branch referansını kaldırır. Commit’ler diğer referanslardan reachable olduğu sürece kalır ve reflog üzerinden geçici olarak kurtarılabilir olabilir.

Pull Request Git’in Bir Parçası mı?

Hayır. Repository hosting platformlarının sağladığı bir özelliktir.

Tag Bir Release mi?

Tag bir Git referansıdır. Proje onu release’i tanımlamak için kullanabilir; hosting platformu ise release note’ları ve indirilebilir asset’ler ekleyebilir.

Reflog Remote ile Paylaşılır mı?

Hayır. Reflog’lar her repository clone için yereldir.

Merge Conflict Bir Depo Hatası mı?

Hayır. Git’in amaçlanan birleşik içeriği otomatik olarak seçemediği anlamına gelir.

Staging Area İçin Neden Bu Kadar Çok Terim Var?

Staging area kullanıcıya yönelik kavramdır. Index geleneksel teknik terimdir. İkisi de genellikle önerilen sonraki snapshot’ı ifade eder.

Sonuç

Git terminolojisi birbirine bağlı tek bir modeli açıklar. Working tree geçerli dosyaları, index önerilen sonraki snapshot’ı içerir ve commit’ler depo geçmişini oluşturur. Branch ve tag’ler bu geçmişteki noktaları adlandırırken HEAD geçerli konumu tanımlar.

Remote’lar depoların fetch, pull ve push aracılığıyla nesne ve referans alışverişi yapmasını sağlar. Merge, rebase, cherry-pick ve revert geçmişlerin birbiriyle nasıl ilişkili olduğunu değiştirir. Stash ve reflog geçici çalışmayı yönetmeye ve yerel geçmişi kurtarmaya yardımcı olur. Hosting platformları çekirdek Git davranışının çevresine pull request, inceleme, koruma ve CI/CD ekler.

Önce öğrenilmesi gereken en önemli terimler repository, working tree, index, commit, branch, HEAD, remote, merge ve tag’dir. Bu kavramlar netleştiğinde ileri düzey komutlar kolaylaşır; çünkü bunlar yalnızca aynı nesneler, snapshot’lar ve referanslar üzerinde farklı işlemlerdir.

Bu sözlük Git temelleri serisini tamamlar. Sonraki doğal adım; remote repository oluşturma, HTTPS ve SSH authentication, clone, push, fork, pull request, issue, release, branch koruması, ekip izinleri ve GitHub Actions konularını kapsayan özel bir GitHub serisidir.

Resmî Kaynaklar ve Ek Okumalar