Git Stash ve Tag’leri: Geçici Çalışmaları ve Sürümleri Yönetmek

Git stash ve Git tag’leri birbirinden çok farklı iki sorunu çözer.

Stash geçicidir. Tamamlanmamış yerel değişiklikleri bir kenara almanıza, daha temiz bir çalışma durumuna dönmenize ve çalışmayı daha sonra geri getirmenize yardımcı olur. Tag ise kalıcıdır. Önemli bir Git nesnesine—genellikle bir commit’e—sabit bir ad verir; böylece ekip bir sürümü, deployment’ı, kilometre taşını veya tarihsel kontrol noktasını tanımlayabilir.

Her ikisi de proje durumuna bir referans sağladığı için bu komutlar çoğu zaman birlikte tanıtılır; ancak birbirine karıştırılmamalıdır. Stash’ler genellikle tek bir yerel depoda kalan kişisel çalışma araçlarıdır. Tag’ler ise çoğu zaman ekiple paylaşılan ve sürüm iş akışlarında kullanılan depo referanslarıdır.

Bu rehber iki özelliği de ayrıntılı biçimde açıklar. Stash oluşturmayı, incelemeyi, uygulamayı, silmeyi ve kurtarmayı; tracked, untracked, staged ve ignored dosyaların davranışını; stash conflict’lerini çözmeyi; lightweight, annotated ve signed tag oluşturmayı; eski commit’leri etiketlemeyi; tag’leri incelemeyi ve doğrulamayı; güvenli biçimde yayınlamayı ve tehlikeli yeniden etiketleme hatalarından kaçınmayı öğreneceksiniz.

Neler Öğreneceksiniz?

  • Git stash’in neyi kaydettiğini ve ne zaman uygun olduğunu.

  • stash push, apply ve pop arasındaki farkı.

  • Staged, unstaged, untracked ve ignored dosyaların stash’i nasıl etkilediğini.

  • Seçilen path’lerin veya hunk’ların nasıl stash edileceğini.

  • --keep-index ile index’in nasıl korunacağını.

  • Yalnızca staged değişikliklerin nasıl stash edileceğini.

  • Stash’lerin nasıl inceleneceğini, kavramsal olarak adlandırılacağını, branch’e dönüştürüleceğini, drop edileceğini ve temizleneceğini.

  • Stash conflict’lerinin nasıl oluştuğunu ve çözüldüğünü.

  • Lightweight, annotated ve signed tag’lerin neyi temsil ettiğini.

  • Tag’lerin branch’lerden nasıl ayrıldığını.

  • Daha eski bir commit’in nasıl etiketleneceğini.

  • Tag’lerin nasıl listeleneceğini, filtreleneceğini, sıralanacağını, inceleneceğini, silineceğini ve değiştirileceğini.

  • Tekil tag’lerin ve seçilen release tag’lerinin nasıl push edileceğini.

  • Yayınlanmış bir tag’i değiştirmenin neden tehlikeli olduğunu.

  • Tag’lerin release ve deployment iş akışlarını nasıl desteklediğini.

Birinci Bölüm: Git Stash’i Anlamak

Git stash, seçilen working tree ve index değişikliklerinin mevcut durumunu kaydeder; ardından bu alanları normalde HEAD tarafından temsil edilen duruma geri döndürür.

Yaygın bir senaryo şöyledir:

  1. Bir özelliğin ortasındasınız.

  2. Acil bir düzeltme başka bir branch’e geçmenizi gerektiriyor.

  3. Mevcut değişiklikler anlamlı bir commit için henüz hazır değil.

  4. Geçerli working tree ile hedef branch’e güvenle geçilemiyor.

  5. Tamamlanmamış çalışmayı stash’e alıyor, acil görevi tamamlıyor ve daha sonra çalışmayı geri yüklüyorsunuz.

En basit komut:

git stash push

Tarihsel olarak kullanılan kısa biçim:

git stash

Modern ve açık iş akışlarında git stash push daha anlaşılırdır; çünkü mesajları, pathspec’leri ve seçim seçeneklerini kabul eder.

Stash Normal Bir Branch veya Commit Değildir

Stash dahili olarak Git nesneleri ve commit benzeri yapılar üzerinden temsil edilir; ancak sıradan bir geliştirme branch’i yerine özel bir referans ve reflog aracılığıyla yönetilir.

Stash’ler normalde stack benzeri bir listede görünür:

stash@{0}
stash@{1}
stash@{2}

stash@{0} genellikle en yeni stash’tir.

Stash, önemli çalışmalar için kalıcı depolama sistemi haline gelmemelidir. Uzun ömürlü ve anlamlı geliştirme çalışmaları, anlaşılır commit’lere sahip bir branch üzerinde daha güvenlidir.

Git Stash Ne Zaman Kullanılmalı?

Stash şu durumlarda kullanışlıdır:

  • Geçici olarak başka bir branch’e geçmeniz gerektiğinde.

  • Pull, rebase veya test öncesinde temiz working tree gerektiğinde.

  • Mevcut çalışmayı temiz proje durumuyla karşılaştırmak istediğinizde.

  • Bir sonraki commit’e girmemesi gereken ilgisiz yerel düzenlemeler bulunduğunda.

  • Riskli bir işlem öncesinde kısa ömürlü yerel checkpoint istediğinizde.

  • Tamamlanmamış değişiklikleri yeni bir branch’e taşımak istediğinizde.

Stash şu durumlarda daha az uygundur:

  • Çalışma zaten commit edilebilecek anlamlı bir checkpoint olduğunda.

  • Çalışmanın başka bir geliştiriciyle paylaşılması gerektiğinde.

  • Değişikliklerin uzun vadeli ve güvenilir biçimde korunması gerektiğinde.

  • Belirsiz mesajlara sahip çok sayıda eski stash bulunduğunda.

  • Commit ve branch düzenlemekten kaçınmak için stash kullanıldığında.

Deneme Deposu Oluşturun

Örneklerde Task Notes adlı küçük bir proje kullanılacaktır.

macOS, Linux veya Git Bash

mkdir git-stash-tags-demo
cd git-stash-tags-demo
git init -b main

cat > app.txt <<'EOF'
Task Notes
Depolama: yerel
Arama: devre dışı
EOF

cat > README.md <<'EOF'
# Task Notes

Git stash ve tag’lerini uygulamak için küçük bir proje.
EOF

git add app.txt README.md
git commit -m "Task Notes projesini oluştur"

PowerShell

New-Item -ItemType Directory git-stash-tags-demo
Set-Location git-stash-tags-demo
git init -b main

@"
Task Notes
Depolama: yerel
Arama: devre dışı
"@ | Set-Content app.txt

@"
# Task Notes

Git stash ve tag’lerini uygulamak için küçük bir proje.
"@ | Set-Content README.md

git add app.txt, README.md
git commit -m "Task Notes projesini oluştur"

Başlangıç noktasını doğrulayın:

git status
git log --oneline

İlk Stash’inizi Oluşturun

app.txt dosyasını değiştirin:

Task Notes
Depolama: yerel
Arama: anahtar kelime

Depoyu kontrol edin:

git status
git diff

Yararlı bir mesajla stash oluşturun:

git stash push -m "WIP: anahtar kelime aramasını ekle"

Durumu inceleyin:

git status

Tracked değişiklik normalde working tree’den kaldırılarak mevcut commit durumuna dönmelidir.

Stash’leri listeleyin:

git stash list

Örnek:

stash@{0}: On main: WIP: anahtar kelime aramasını ekle

Tam çıktı branch ve commit bağlamını içerebilir.

Stash’e Her Zaman Mesaj Ekleyin

Özel mesaj olmadan birden fazla stash’i ayırt etmek zorlaşabilir:

stash@{0}: WIP on main: ...
stash@{1}: WIP on main: ...
stash@{2}: WIP on main: ...

Yararlı bir mesaj tamamlanmamış görevi açıklar:

git stash push -m "WIP: içe aktarılan görev tarihlerini doğrula"
git stash push -m "Debug: yavaş rapor sorgusunu incele"
git stash push -m "Experiment: yeni arama sonucu düzeni"

Ön ek isteğe bağlıdır. Önemli olan mesajın çalışmayı daha sonra tanımanızı sağlamasıdır.

Bir Stash’i İnceleyin

En son stash’in özetini gösterin:

git stash show

Tam patch’i gösterin:

git stash show -p

Seçilen stash’i inceleyin:

git stash show -p stash@{1}

Stat özetini kullanın:

git stash show --stat stash@{0}

Eski bir stash’i uygulamadan önce içeriğini inceleyin. Mesaj, içerdiği tüm dosyaları göstermeyebilir.

Apply ve Pop Farkı

En son stash’i listede tutarak geri yükleyin:

git stash apply

Seçilen stash’i geri yükleyin:

git stash apply stash@{1}

En son stash’i geri yükleyin ve başarılı uygulama sonrasında listeden kaldırın:

git stash pop

Seçilen stash’i pop edin:

git stash pop stash@{1}
KomutDeğişiklikleri Geri YüklerStash’i Otomatik Kaldırır
git stash applyEvetHayır
git stash popEvetBaşarılı uygulamadan sonra

Daha güvenli inceleme adımı istediğinizde veya aynı stash’i birden fazla yerde kullanmanız gerektiğinde apply kullanın. Stash’in geri yüklenip kaldırılacağından eminseniz pop kullanın.

Conflict temiz bir pop işlemini engellediğinde Git normalde stash’i otomatik kaybetmemeniz için listede tutar.

Stash Untracked Dosyaları İçerir mi?

Varsayılan olarak git stash push temel olarak tracked değişiklikleri ve staged değişiklikleri kaydeder. Normal untracked dosyalar otomatik olarak dahil edilmez.

Untracked dosya oluşturun:

echo "Geçici arama notları" > search-notes.txt

Kontrol edin:

git status --short

Tracked ve untracked değişiklikleri stash’e alın:

git stash push -u -m "WIP: arama uygulaması ve notlar"

Uzun seçenek:

git stash push --include-untracked

Ardından untracked dosya normalde working tree’den kaldırılıp stash içinde saklanmalıdır.

Ignored Dosyaları Stash’e Almak

Ignored dosyalar -u ile dahil edilmez.

Ignored dosyaları da dahil etmek için:

git stash push -a -m "WIP: üretilmiş yerel dosyaları dahil et"

Uzun seçenek:

git stash push --all

--all seçeneğini dikkatli kullanın. Ignored dizinler şunları içerebilir:

  • Büyük dependency klasörleri.

  • Build çıktıları.

  • Log’lar.

  • Yerel cache’ler.

  • Üretilmiş asset’ler.

  • Ortama özel dosyalar.

Tüm ignored içeriği stash’e almak yavaş olabilir ve depo içinde önemli alan tüketebilir.

Stash İçindeki Staged ve Unstaged Değişiklikler

Bir dosya aynı anda staged ve unstaged değişiklikler içerebilir.

Örnek:

  1. README.md dosyasını düzenleyin.

  2. git add README.md çalıştırın.

  3. README.md dosyasını tekrar düzenleyin.

  4. git status --short çalıştırın.

Şunu görebilirsiniz:

MM README.md

Normal stash hem index durumunu hem working tree durumunu koruyabilir. Ancak geri yükleme biçimi apply seçeneklerine bağlıdır.

Staged durumu da geri yüklemeyi denemek için:

git stash apply --index

Veya:

git stash pop --index

--index olmadan içerik geri yüklenebilir, ancak aynı staged düzeni yeniden oluşturulmayabilir.

Mevcut depo durumu eski staging yapısının temiz biçimde yeniden oluşturulmasına izin vermediğinde index geri yüklemesi başarısız olabilir.

Staged Değişiklikleri Yerinde Tutun

Bazen tamamlanmış bir staged düzeltmeniz ve buna ek tamamlanmamış working tree değişiklikleriniz vardır. Yalnızca tamamlanmamış kısmı stash’e alıp index’i commit için hazır tutmak isteyebilirsiniz.

Şunu kullanın:

git stash push --keep-index -m "WIP: tamamlanmamış dokümantasyon düzenlemeleri"

Staged değişiklikler hazır kalırken diğer uygun değişiklikler stash’e alınır.

Uygulamalı bir iş akışı:

git add fix.php
git stash push --keep-index -m "WIP: ilgisiz deneyler"
git diff --staged
git commit -m "Fatura yuvarlamasını düzelt"
git stash pop

Stash işleminden sonra her zaman durumu inceleyin. Seçenekler farklı depo katmanlarını etkiler ve staged ile unstaged sürümlerin karışımı dikkatli inceleme gerektirir.

Yalnızca Staged Değişiklikleri Stash’e Alın

Index içeriğini stash’e alıp diğer working tree değişikliklerini görünür bırakmak istediğinizde:

git stash push --staged -m "WIP: staged arama uygulaması"

Staged değişiklikler ayrı bir grup oluşturuyor ve unstaged çalışma görünür kalacaksa kullanışlıdır.

Öncesinde ve sonrasında inceleyin:

git status
git diff
git diff --staged
git stash push --staged -m "WIP: staged arama uygulaması"
git status

Staged ve unstaged değişiklikler Git’in güvenle ayıramayacağı şekilde çakışıyorsa işlem durabilir veya değişiklikleri önce yeniden düzenlemeniz gerekebilir.

Seçilen Dosyaları Stash’e Alın

Tüm working tree’yi stash’e almak zorunda değilsiniz.

Tek dosyayı stash’e alın:

git stash push -m "WIP: README yeniden yazımı" -- README.md

Birden fazla path’i stash’e alın:

git stash push -m "WIP: arama dosyaları" -- app.txt search-notes.txt

Bir dizini stash’e alın:

git stash push -m "WIP: rapor modülü" -- src/Report/

--, komut seçeneklerini pathspec’lerden ayırır.

Path ile sınırlı stash, aynı working tree içinde birden fazla bağımsız görev karıştığında kullanışlıdır; ancak çalışmayı daha erken aşamada branch ve commit’lerle ayırmak çoğu zaman daha temizdir.

--patch ile Etkileşimli Stash

Seçilen hunk’ları etkileşimli biçimde stash’e alın:

git stash push -p -m "WIP: seçilen arama değişiklikleri"

Uzun seçenek:

git stash push --patch

Git hunk’ları gösterir ve her birinin dahil edilip edilmeyeceğini sorar.

Yaygın yanıtlar:

  • y: Bu hunk’ı dahil et.

  • n: Bu hunk’ı working tree içinde bırak.

  • s: Mümkünse hunk’ı böl.

  • e: Patch’i manuel düzenle.

  • q: Seçimi durdur.

  • ?: Yardımı göster.

Ardından çalıştırın:

git status
git stash show -p stash@{0}

Amaçlanan hunk’ların stash’e girdiğini ve kalan düzenlemelerin working tree içinde kaldığını doğrulayın.

Temiz Working Tree’yi Stash’e Alabilir misiniz?

Uygun yerel değişiklik bulunmadığında Git normalde kaydedilecek bir şey olmadığını bildirir.

Stash, zaten commit edilmiş bir durum için adlandırılmış checkpoint oluşturmanın yerine kullanılmaz. Bu amaçla branch veya tag kullanın.

Stash’i Başka Bir Branch’te Uygulayın

Stash, oluşturulduğu branch’e kalıcı olarak bağlı değildir.

Başka branch’e geçip uygulayabilirsiniz:

git switch feature/search
git stash apply stash@{0}

Değişiklikler yanlış branch üzerinde başlatıldıysa kullanışlıdır.

Ancak stash’i farklı bir kod durumuna uygulamak conflict olasılığını artırır. Önce branch farkını ve stash patch’ini inceleyin.

Stash’ten Branch Oluşturun

Stash oluşturulduğundan beri mevcut branch önemli ölçüde değiştiyse doğrudan uygulamak conflict oluşturabilir.

Şunu kullanın:

git stash branch feature/search-recovery stash@{0}

Bu komut stash’in ilk oluşturulduğu commit’ten yeni bir branch oluşturur, ona geçer, stash’i uygular ve uygulama başarılı olursa stash’i drop eder.

Eski bir stash’i normal branch tabanlı çalışmaya dönüştürmenin en güvenli yollarından biridir.

Stash Conflict’leri

Mevcut dosyalar stash değişiklikleriyle uyumsuz biçimde değiştiğinde stash uygulaması conflict oluşturabilir.

Örnek:

  1. Depolama satırındaki değişikliği stash’e alın.

  2. Aynı satırda farklı bir değişikliği commit edin.

  3. Eski stash’i uygulayın.

Git conflict işaretleri ekleyebilir:

<<<<<<< Updated upstream
Depolama: şifreli yerel
=======
Depolama: bulut
>>>>>>> Stashed changes

Conflict’i merge conflict’i gibi çözün:

  1. git status çalıştırın.

  2. Her conflict içeren dosyayı açın.

  3. Mevcut ve stash içindeki niyeti anlayın.

  4. Doğru birleşik sonucu düzenleyin.

  5. Conflict işaretlerini kaldırın.

  6. Çözülen dosyaları git add ile stage edin.

  7. Testleri çalıştırın.

  8. Geri getirilen çalışma anlamlı duruma ulaştığında commit oluşturun.

Aktif merge işleminden farklı olarak stash uygulaması aynı git merge --abort iş akışını sağlamaz. Kurtarma belirsizleşirse dosyaları reset veya restore etmeden önce mevcut çalışmayı koruyun.

Tek Bir Stash’i Drop Edin

Seçilen stash’i silin:

git stash drop stash@{1}

En son stash’i silin:

git stash drop

Drop etmeden önce stash’i inceleyin:

git stash show -p stash@{1}

Bir stash drop edildikten sonra liste reflog tabanlı olduğu için stash indeksleri değişebilir. Başka bir konuma başvurmadan önce git stash list komutunu yeniden çalıştırın.

Tüm Stash’leri Temizleyin

git stash clear

Bu komut stash referansındaki tüm girişleri kaldırır.

Varsayılan olarak etkileşimli onay istemez. Temizlemeden önce:

git stash list
git stash show -p stash@{0}
git stash show -p stash@{1}

Önemli çalışmalar stash listesinde bırakılmak yerine branch veya commit’e dönüştürülmelidir.

Drop Edilmiş Bir Stash’i Kurtarmak

Yakın zamanda drop edilmiş bir stash sınırlı süre boyunca unreachable Git nesneleri olarak kalabilir; ancak kurtarma garanti edilmez.

Olası inceleme araçları:

git fsck --unreachable
git fsck --no-reflogs

Dangling veya unreachable commit benzeri nesneleri bulabilir ve adayları şu komutla inceleyebilirsiniz:

git show <object-id>

Doğru nesne bulunursa hemen koruyun:

git branch stash-recovery <object-id>

Kurtarma; garbage collection, depo bakımı ve nesne reachability durumuna bağlıdır. Drop edilmiş veya temizlenmiş stash’leri potansiyel olarak kaybolmuş kabul edin.

Gelişmiş Stash Oluşturma Komutları

Çoğu geliştirici git stash push kullanmalıdır. Git ayrıca daha düşük seviyeli stash işlemleri sunar.

Stash Listesine Kaydetmeden Oluşturun

git stash create "geçici stash nesnesi"

Bu komut stash benzeri bir commit nesnesi oluşturup kimliğini yazdırır; normal stash referansını güncellemez.

Mevcut Stash Nesnesini Saklayın

git stash store -m "Kurtarılan geçici çalışma" <object-id>

Bu komutlar script ve kurtarma iş akışlarında kullanışlıdır; ancak push komutuna göre yanlış kullanıma daha açıktır.

Stash İçin En İyi Uygulamalar

  • Açıklayıcı mesajlar kullanın.

  • Stash oluşturmadan önce working tree’yi inceleyin.

  • Yalnızca untracked dosyalar gerekli olduğunda -u kullanın.

  • Ignored dosyaların gerçekten korunması gerekmiyorsa -a kullanmaktan kaçının.

  • Bir stash’i uygulamadan veya drop etmeden önce inceleyin.

  • Durum riskliyse pop yerine apply tercih edin.

  • Staged düzeni geri yüklemek önemli olduğunda --index kullanın.

  • Uzun ömürlü stash’leri branch’e dönüştürün.

  • Stash’i anlamlı commit’lerin yerine kullanmayın.

  • Artık gerekmediğini doğruladıktan sonra eski stash’leri temizleyin.

İkinci Bölüm: Git Tag’lerini Anlamak

Git tag’i, belirli bir nesneye—genellikle bir commit’e—okunabilir bir ad verir.

Tag’ler yaygın olarak şu amaçlarla kullanılır:

  • Yazılım sürümleri.

  • Production deployment’ları.

  • Herkese açık kilometre taşları.

  • Uyumluluk baseline’ları.

  • Önemli tarihsel checkpoint’ler.

  • İmzalı release referansları.

Branch’ten farklı olarak tag, yeni commit’ler oluşturulduğunda otomatik olarak hareket etmez.

Tag ve Branch Farkı

Bir branch ve tag’in ikisinin de C commit’ine işaret ettiğini varsayın:

A---B---C
        ^ main
        ^ v1.0.0

main üzerinde yeni commit oluşturun:

A---B---C---D
        ^     ^
      v1.0.0  main

Branch D commit’ine ilerler. Tag C üzerinde kalır.

BranchTag
Yeni commit’ler oluşturuldukça hareket ederNormalde sabit kalır
Aktif bir geliştirme hattını temsil ederBelirli bir nesneyi veya kilometre taşını işaretler
Devam eden çalışma için genellikle checkout edilirGenellikle incelenir veya release referansı olarak kullanılır
Branch referansları altında saklanırTag referansları altında saklanır

Tag’leri Listeleyin

Tüm tag’leri listeleyin:

git tag

Eşdeğer liste biçimi:

git tag --list

Shell tarzı pattern ile filtreleyin:

git tag --list "v1.*"

Varsa annotation bilgileriyle listeleyin:

git tag -n

Daha fazla mesaj satırı gösterin:

git tag -n3

Lightweight Tag’ler

Lightweight tag, doğrudan bir nesneye—genellikle commit’e—işaret eden bir addır.

Geçerli commit üzerinde oluşturun:

git tag v0.1.0

İnceleyin:

git show v0.1.0

Lightweight tag; tagger, tarih ve mesaj içeren ayrı bir annotated tag nesnesi oluşturmaz.

Lightweight tag’ler şu amaçlarla kullanılabilir:

  • Geçici yerel etiketler.

  • Kişisel bookmark’lar.

  • Kısa ömürlü test işaretleri.

  • Basit dahili checkpoint’ler.

Resmî sürümlerde annotated tag’ler genellikle daha fazla bilgi sağlar.

Annotated Tag’ler

Annotated tag oluşturun:

git tag -a v1.0.0 -m "Sürüm 1.0.0"

Annotated tag şu meta verileri içeren tag nesnesi oluşturur:

  • Etiketlenen nesnenin referansı.

  • Tag adı.

  • Tagger adı ve e-posta adresi.

  • Oluşturulma tarihi.

  • Annotation mesajı.

  • Signing kullanıldığında isteğe bağlı kriptografik imza.

İnceleyin:

git show v1.0.0

Çıktı normalde tag mesajını ve referans verilen commit hakkındaki bilgileri içerir.

Lightweight ve Annotated Tag Farkı

ÖzellikLightweight TagAnnotated Tag
Ayrı tag nesnesiHayırEvet
Tagger kimliğiÖzel tagger meta verisi yokEvet
Tag mesajıHayırEvet
Tag nesnesinde oluşturulma tarihiHayırEvet
Tag imzası taşıyabilirHayırEvet
Tipik kullanımGeçici veya kişisel etiketlerSürümler ve önemli kilometre taşları

Bazı Git komutları açık release tarzı tag nesnelerini temsil ettikleri için varsayılan olarak annotated tag’leri tercih eder.

Tarihsel Bir Commit’i Etiketleyin

Yalnızca geçerli commit’i etiketlemek zorunda değilsiniz.

Hedefi bulun:

git log --oneline

Daha eski bir commit üzerinde annotated tag oluşturun:

git tag -a v0.9.0 7a93c2e -m "Release candidate baseline"

Tarihsel lightweight tag oluşturun:

git tag test-baseline 7a93c2e

Etiketlemeden önce hedefi doğrulayın:

git show --no-patch --format=fuller 7a93c2e

Yanlış commit’i etiketlemek özellikle yayınlamadan sonra deployment ve release karışıklığı oluşturabilir.

Tag Referanslarını Kesin Biçimde İnceleyin

Tag adının referans verdiği nesneyi gösterin:

git rev-parse v1.0.0

Annotated tag için bu normalde tag nesnesinin kendisini tanımlar.

Tag’i nihai olarak referans verdiği commit’e peel edin:

git rev-parse v1.0.0^{}

Referans verilen nesnenin commit olmasını zorunlu kılın:

git rev-parse v1.0.0^{commit}

Referans türünü gösterin:

git cat-file -t v1.0.0

Tipik sonuçlar:

  • Annotated tag nesnesi için tag.

  • Doğrudan commit’e işaret eden lightweight tag için commit.

Bir Commit’e İşaret Eden Tag’leri Gösterin

Doğrudan HEAD’e işaret eden tag’leri listeleyin:

git tag --points-at HEAD

Başka bir revision’ı kontrol edin:

git tag --points-at 7a93c2e

Seçilen commit üzerinde release tag’inin zaten bulunup bulunmadığını doğrulamaya yardımcı olur.

Bir Commit’i İçeren Tag’leri Listeleyin

Referans verdikleri commit geçmişi seçilen commit’i içeren tag’leri gösterin:

git tag --contains <commit>

Commit’i içermeyen tag’leri gösterin:

git tag --no-contains <commit>

Şu soruları yanıtlamaya yardımcı olabilir:

  • Hangi sürümler güvenlik düzeltmesini içeriyor?

  • Bir hata release öncesinde mi sonrasında mı eklendi?

  • Hangi release hatları seçilen commit’i içeriyor?

Containment, aynı kodun başka yerde bağımsız olarak eklenmesine değil commit ancestry’sine dayanır.

Tag’leri Sıralayın

Lexicographic sıralama şaşırtıcı sonuçlar verebilir:

v1.10.0
v1.2.0
v1.9.0

Version-aware sıralama kullanın:

git tag --sort=version:refname

Ters sıralayın:

git tag --sort=-version:refname

Annotated tag’leri tagger tarihine göre sıralayın:

git tag --sort=-taggerdate

Lightweight tag’lerin özel tagger tarihi yoktur; bu nedenle tarihe dayalı gösterimler tag türüne göre farklı alanlar gerektirebilir.

Özel tag listesi biçimlendirin:

git for-each-ref \
  --sort=-version:refname \
  --format="%(refname:short) %(objecttype) %(subject)" \
  refs/tags

Tag Adlarında Arama Yapın

Kararlı version-one tag’lerini listeleyin:

git tag -l "v1.*"

Release candidate tag’lerini listeleyin:

git tag -l "*-rc.*"

Wildcard pattern’ları tırnak içine alın; böylece shell, Git pattern’ı almadan önce bunları dosya adlarıyla genişletmez.

Yerel Tag’i Silin

git tag -d v0.1.0

Bu komut yerel tag referansını kaldırır.

Daha önce remote depoya yayınlanmış tag’i otomatik olarak kaldırmaz.

Silmeden önce:

git show v0.1.0
git rev-parse v0.1.0^{}

Amaçlanan referansı kaldırdığınızı doğrulayın.

Yerel Tag’i Değiştirin veya Taşıyın

Tag’lerin sabit kalması beklenir; ancak özel yerel hazırlık sırasında bir tag’i düzeltmeniz gerekebilir.

Silip yeniden oluşturun:

git tag -d v1.0.0
git tag -a v1.0.0 <correct-commit> -m "Sürüm 1.0.0"

Veya yerelde zorlayarak değiştirin:

git tag -f -a v1.0.0 <correct-commit> -m "Sürüm 1.0.0"

Force replacement, adın tanımladığı nesneyi değiştirir. Tag paylaşıldıktan sonra bunu dikkatsizce yapmayın.

Yayınlanmış Tag’ler Neden Değişmez Kabul Edilmelidir?

Bir ekibin v1.0.0 tag’ini A commit’ine işaret edecek şekilde yayınladığını düşünün. Kullanıcılar, CI sistemleri, deployment araçları ve package builder’lar bu tag’i indirmiş veya cache’lemiş olabilir.

Tag daha sonra B commit’ine taşınırsa aynı release adı farklı kişiler için farklı anlamlara gelebilir:

Geliştirici 1: v1.0.0 -> A
Geliştirici 2: v1.0.0 -> B
Build cache: v1.0.0 -> A
Deployment sistemi: v1.0.0 -> B

Bu durum yeniden üretilebilirliği ve güveni zedeler.

Yayınlanmış release yanlışsa daha güvenli yaklaşım genellikle yeni bir version oluşturmaktır:

v1.0.1
v1.0.0-hotfix.1
v1.0.1-rc.1

Projenin benimsediği versioning kuralını kullanın.

Signed Tag’ler

Signing anahtarları ve Git yapılandırması hazırlandığında annotated tag kriptografik olarak imzalanabilir.

Signed tag oluşturun:

git tag -s v1.0.0 -m "Sürüm 1.0.0"

Yapılandırılmış signing formatına ve anahtar ayarlarına bağlı olarak Git, tag nesnesinde bir imza oluşturur.

Tag imzasını doğrulayın:

git tag -v v1.0.0

Veya:

git verify-tag v1.0.0

Doğrulama uygun public key veya trust yapılandırmasına erişim gerektirir.

Geçerli kriptografik imza, tag nesnesinin karşılık gelen private key sahibince imzalandığını doğrular. Yazılımın güvenli, hatasız veya organizasyonunuzca onaylanmış olduğunu otomatik olarak kanıtlamaz.

Signed Tag ve Signed Commit Farkı

Signed tag, tag nesnesini imzalar. Signed commit ise tek bir commit nesnesini imzalar.

Birbirlerinden bağımsız kullanılabilirler:

  • Signed release tag, unsigned commit’lere işaret edebilir.

  • Signed commit, unsigned tag’e sahip olabilir.

  • Proje ikisini de zorunlu tutabilir.

  • Proje hosting platformundaki release attestation’larına veya başka doğrulama sistemine dayanabilir.

Tek bir imzanın tüm artifact ve süreçleri kapsadığını varsaymak yerine projenin belirlediği release trust politikasını izleyin.

Uygulamalı Release Tag Oluşturun

Release’i etiketlemeden önce:

  1. Doğru branch’i doğrulayın.

  2. Working tree’nin temiz olduğundan emin olun.

  3. Ekip politikasına göre remote durumunu fetch edin veya senkronize edin.

  4. Testleri ve build kontrollerini çalıştırın.

  5. Etiketlenecek commit’i inceleyin.

  6. Version numarasını doğrulayın.

  7. Annotated veya signed tag oluşturun.

  8. Yayınlamadan önce tag’i inceleyin.

Örnek:

git switch main
git status
git log -1 --format=fuller
git diff HEAD^ HEAD
git tag -a v1.0.0 -m "Task Notes 1.0.0 sürümünü yayınla"
git show v1.0.0

Tag, commit edilmemiş working directory yerine test edilmiş tam bir commit’i tanımlamalıdır.

Tek Tag’i Remote’a Push Edin

Normal branch push işlemleri tüm yerel tag’leri otomatik olarak yayınlamayabilir.

Tek tag’i açıkça push edin:

git push origin v1.0.0

Bu, tam olarak amaçlanan tag’i yayınladığı için en güvenli yaygın release davranışıdır.

Tüm Yerel Tag’leri Push Edin

git push origin --tags

Bu komut remote’da bulunmayan tüm yerel tag’leri push eder.

Dikkatli kullanın. Geliştiricinin yayınlanmaması gereken geçici, kişisel, deneysel veya eski yerel tag’leri olabilir.

Çalıştırmadan önce:

git tag --list
git for-each-ref --format="%(refname:short) %(objecttype) %(subject)" refs/tags

--follow-tags ile Ulaşılabilir Annotated Tag’leri Push Edin

Branch’leri push ederken şunu kullanın:

git push --follow-tags

Bu seçenek remote’da bulunmayan ve push edilen commit’lerden ulaşılabilir annotated tag’leri push edebilir.

--tags ile tamamen aynı davranmaz ve tüm yerel lightweight tag’leri yayınlamaz.

Bu nedenle annotated tag kullanan ve ilgisiz yerel etiketleri yayınlamak istemeyen release iş akışlarında kullanışlıdır.

Remote Tag’i Silin

Açık remote ref işlemiyle silin:

git push origin --delete v1.0.0

Başka bir açık biçim:

git push origin :refs/tags/v1.0.0

Remote tag’i silmek, diğer kullanıcıların daha önce fetch ettiği kopyaları otomatik olarak silmez.

Yayınlanmış tag’in değiştirilmesi gerekiyorsa açık iletişim kurun, açık refspec’ler kullanın ve istemcilerin eski tag’i bilinçli olarak güncelleyene veya silene kadar saklayabileceğini anlayın.

Tag’leri Fetch Edin

Normal fetch işlemleri Git’in tag-following davranışına göre fetch edilen geçmişe işaret eden tag’leri çoğu zaman alır.

Tag’leri açıkça fetch edin:

git fetch --tags

Tek tag’i açık refspec ile fetch edin:

git fetch origin tag v1.0.0

Fetch sonrasında inceleyin:

git tag --list
git show v1.0.0

Bir tag’in remote üzerinde bulunması nedeniyle güvenilir olduğunu varsaymayın. Projenin güvenlik modeline göre hedefini, meta verisini ve imzasını doğrulayın.

Bir Tag’i Checkout Edin

Etiketlenmiş sürümü detached-HEAD modunda inceleyin:

git switch --detach v1.0.0

Şu işler için kullanışlıdır:

  • Eski bir release’i build etmek.

  • Tarihsel testleri çalıştırmak.

  • Production sürümünü incelemek.

  • Sürümler arasındaki davranışı karşılaştırmak.

Çalışmayı korumayı planlamıyorsanız detached modda devam eden geliştirme yapmayın.

Tag’den maintenance branch oluşturun:

git switch -c support/1.0 v1.0.0

Artık yeni commit’ler maintenance branch’i hareket ettirirken tag sabit kalır.

Release’leri Karşılaştırın

Sürümler arasında eklenen commit’leri listeleyin:

git log --oneline v1.0.0..v1.1.0

İçeriği karşılaştırın:

git diff v1.0.0 v1.1.0

Özet istatistikleri gösterin:

git diff --stat v1.0.0 v1.1.0

Değişen path’leri gösterin:

git diff --name-status v1.0.0 v1.1.0

Bu komutlar release note’ları, regression araştırması ve deployment incelemesi için kullanışlıdır.

Commit’i Tag’lere Göre Tanımlayın

git describe, yakındaki ulaşılabilir tag’e dayalı okunabilir bir ad oluşturur:

git describe

Örnek:

v1.0.0-5-g7a93c2e

Bu genellikle şu anlama gelir:

  • Dikkate alınan en yakın tag v1.0.0.

  • Commit bu tag’den beş commit sonra.

  • Kısaltılmış nesne kimliği 7a93c2e ile başlıyor.

Lightweight tag’leri dahil edin:

git describe --tags

Uygun tag bulunamadığında bile fallback nesne kimliği gösterin:

git describe --tags --always

Development build kimlikleri için kullanışlı olabilir.

Tag Adlandırma Kuralları

Yaygın release adları:

v1.0.0
v1.2.3
v2.0.0-rc.1
release-2026.07
production-2026-07-10

Yararlı bir kural şunları sağlamalıdır:

  • Tutarlılık.

  • Dokümante edilmiş olması.

  • Release araçlarınca sıralanabilir veya parse edilebilir olması.

  • Package ve deployment sistemleriyle uyumluluk.

  • Yayınlandıktan sonra kararlılık.

Açık bir neden olmadan ilgisiz birden fazla şemayı karıştırmayın.

Semantic Versioning’e Genel Bakış

Birçok proje şu version yapısını kullanır:

MAJOR.MINOR.PATCH

Örneğin:

2.4.1

Tipik yorum:

  • MAJOR: Geriye uyumsuz public değişiklikler.

  • MINOR: Geriye uyumlu yeni işlevler.

  • PATCH: Geriye uyumlu düzeltmeler.

Prerelease tanımlayıcıları candidate sürümleri temsil edebilir:

2.5.0-alpha.1
2.5.0-beta.1
2.5.0-rc.1

Git Semantic Versioning’i zorunlu kılmaz. Tag adı yalnızca bir referans adıdır. Version’ın anlamı proje ve release politikası tarafından tanımlanmalıdır.

Tag Nesneleri Commit Dışındaki Nesnelere de İşaret Edebilir

Release tag’leri normalde commit’e işaret etse de Git tag referansı başka türde bir nesneyi tanımlayabilir.

Annotated tag nesneleri commit, tree, blob veya başka tag nesnelerine işaret edebilir.

Çoğu geliştirici iş akışı commit’leri etiketlemelidir; çünkü commit tam proje anlık görüntüsünü ve geçmiş bağlamını tanımlar.

Release Tag’leri ve Hosting Platformu Release’leri

Git tag’i ile hosting platformu release’i ilişkili ancak aynı şey değildir.

Git tag’i depo referansıdır. Platform release’i şu ekleri sağlayabilir:

  • Release note’ları.

  • İndirilebilir arşivler.

  • Derlenmiş binary dosyalar.

  • Asset’ler.

  • Onay iş akışları.

  • Deployment entegrasyonu.

  • Provenance veya attestation bilgileri.

Release arayüzü genellikle Git tag’ini kaynak version olarak kullanır; ancak çevresindeki meta veriler hosting platformuna aittir.

Uygulamalı İş Akışı: Acil Düzeltme İçin Özelliği Duraklatmak

1. Tamamlanmamış Çalışmayı İnceleyin

git status
git diff
git diff --staged

2. Untracked Dosyalarla Birlikte Stash’e Alın

git stash push -u -m "WIP: görev arama filtrelemesi"

3. Temiz Durumu Doğrulayın

git status
git stash list

4. Düzeltme Branch’ine Geçin

git switch main
git switch -c hotfix/task-import

5. Düzeltmeyi Uygulayın ve Commit Edin

git add -p
git commit -m "Hatalı içe aktarılan görev tarihlerini reddet"

6. Özelliğe Geri Dönün

git switch feature/search

7. Stash’i İnceleyin ve Uygulayın

git stash show -p stash@{0}
git stash apply stash@{0}

8. Drop Etmeden Önce Doğrulayın

git status
# Testleri çalıştırın ve dosyaları inceleyin
git stash drop stash@{0}

apply kullanıp sonrasında bilinçli drop işlemi yapmak bir doğrulama adımı sağlar.

Uygulamalı İş Akışı: Eski Stash’i Branch’e Dönüştürmek

Stash’i inceleyin:

git stash list
git stash show -p stash@{2}

İlk base’inden branch oluşturun:

git stash branch feature/recovered-search stash@{2}

Ardından:

git status
git diff
git diff --staged

Kurtarılan değişiklikleri anlamlı commit’ler halinde düzenleyin.

Uygulamalı İş Akışı: Release Tag Oluşturup Yayınlamak

1. Release Commit’ini Doğrulayın

git switch main
git status
git log -1 --format=fuller
git show --stat HEAD

2. Release Kontrollerini Çalıştırın

# Yalnızca örnekler; projenin gerçek komutlarını kullanın
php vendor/bin/phpunit
npm run build

3. Annotated Tag Oluşturun

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

4. Tag’i İnceleyin

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

5. Yalnızca Amaçlanan Tag’i Yayınlayın

git push origin v1.0.0

6. Remote Release Otomasyonunu Doğrulayın

CI, package oluşturma, deployment ve release-note iş akışlarının başarıyla tamamlandığını doğrulayın.

Yaygın Stash Hataları

Untracked Dosyaların Otomatik Dahil Edildiğini Sanmak

Untracked dosyalar stash’e dahil olacaksa -u kullanın.

Ignored İçeriği İncelemeden --all Kullanmak

Ignored dependency ve build dizinleri stash’i beklenmedik ölçüde büyütebilir.

Eski Stash’i İncelemeden Pop Kullanmak

Önce stash show kullanın ve apply seçeneğini değerlendirin.

Önemli Çalışmayı Aylarca Stash’te Tutmak

Önemli çalışmayı commit içeren bir branch’e dönüştürün.

Yanlış Stash Numarasını Drop Etmek

Silme sonrasında stash konumları değişebilir. Drop işleminden hemen önce git stash list çalıştırın.

--index Seçeneğinin Her Zaman Kusursuz Geri Yüklemesini Beklemek

Mevcut depo durumu eski index düzeninin temiz biçimde uygulanmasını engelleyebilir.

Stash’in Remote ile Paylaşıldığını Sanmak

Stash girişleri normalde yereldir ve sıradan branch push işlemleriyle yayınlanmaz.

Düzensiz Working Tree’yi Gizlemek İçin Stash Kullanmak

Mesajsız ve temizlenmeyen tekrar eden stash kullanımı anlaşılması zor ikinci bir backlog oluşturur.

Yaygın Tag Hataları

Tag ile Branch’i Karıştırmak

Tag normalde sabit kalır; branch geliştirmeyle birlikte hareket eder.

Yanlış Commit’i Etiketlemek

Release tag’i oluşturmadan önce commit’i ve test sonucunu inceleyin.

Resmî Release İçin Bilinçsizce Lightweight Tag Kullanmak

Annotated tag’ler release’e özel meta verileri ve mesajları korur.

Tüm Tag’leri Körlemesine Push Etmek

git push --tags kişisel veya deneysel yerel tag’leri yayınlayabilir.

Yayınlanmış Version Tag’ini Taşımak

Farklı kullanıcılar ve build sistemleri aynı ad için farklı hedefleri saklayabilir.

Signed Tag’in Yazılım Güvenliğini Kanıtladığını Sanmak

İmza, yazılımın doğruluğunu değil tag nesnesini ve anahtar ilişkisini doğrular.

Remote Tag’i Silince Her Yerden Kaybolacağını Sanmak

Diğer clone’lar eski yerel tag’i bilinçli olarak silene veya değiştirene kadar saklayabilir.

Temiz Olmayan Working Tree’den Release Oluşturmak

Tag commit edilmiş bir nesneyi tanımlar. Commit edilmemiş yerel dosyalar release referansına dahil edilmez.

Stash Komutları Referansı

KomutAmacı
git stash push -m "message"Tracked working tree ve index değişikliklerini mesajla stash’e almak
git stash push -uUntracked dosyaları dahil etmek
git stash push -aUntracked ve ignored dosyaları dahil etmek
git stash push --keep-indexStaged değişiklikleri index içinde tutmak
git stash push --stagedStaged değişiklikleri stash’e almak
git stash push -pHunk’ları etkileşimli biçimde seçmek
git stash push -- pathSeçilen path’leri stash’e almak
git stash listStash girişlerini listelemek
git stash show -pEn son stash patch’ini incelemek
git stash applyDeğişiklikleri geri yükleyip stash’i korumak
git stash apply --indexDeğişiklikleri ve staged durumu geri yüklemeyi denemek
git stash popDeğişiklikleri geri yükleyip başarıdan sonra drop etmek
git stash branch name stash@{n}Stash’in ilk base’inden branch oluşturup stash’i uygulamak
git stash drop stash@{n}Tek bir stash girişini kaldırmak
git stash clearTüm stash girişlerini kaldırmak

Tag Komutları Referansı

KomutAmacı
git tagYerel tag’leri listelemek
git tag v1.0.0Lightweight tag oluşturmak
git tag -a v1.0.0 -m "message"Annotated tag oluşturmak
git tag -s v1.0.0 -m "message"Signed annotated tag oluşturmak
git tag -a v1.0.0 commitSeçilen tarihsel commit’i etiketlemek
git show v1.0.0Tag’i ve referans verilen nesneyi incelemek
git tag --points-at HEADRevision’a işaret eden tag’leri listelemek
git tag --contains commitGeçmişleri commit’i içeren tag’leri listelemek
git tag --sort=version:refnameAdları version-aware sıralamayla sıralamak
git tag -d v1.0.0Yerel tag’i silmek
git tag -v v1.0.0Signed tag’i doğrulamak
git push origin v1.0.0Tek tag’i yayınlamak
git push origin --tagsTüm yerel tag’leri yayınlamak
git push --follow-tagsBranch güncellemeleriyle uygun ulaşılabilir annotated tag’leri push etmek
git push origin --delete v1.0.0Remote’daki tag’i silmek
git switch --detach v1.0.0Etiketlenmiş sürümü incelemek
git switch -c support/1.0 v1.0.0Tag’den branch oluşturmak

Stash Kontrol Listesi

Stash oluşturmadan önce:

  • git status çalıştırın.

  • Untracked veya ignored dosyaların gerekli olup olmadığına karar verin.

  • Staged ve unstaged değişiklikleri inceleyin.

  • Açıklayıcı mesaj kullanın.

  • Branch ve commit’in daha güvenli olup olmayacağını değerlendirin.

Stash’i uygulamadan veya drop etmeden önce:

  • git stash list çalıştırın.

  • Seçilen patch’i inceleyin.

  • Geçerli branch’i ve working tree’yi kontrol edin.

  • Doğrulama gerekiyorsa apply tercih edin.

  • Geri yüklemeden sonra testleri çalıştırın.

  • Çalışmanın başka yerde korunduğunu doğruladıktan sonra drop edin.

Release Tag Kontrol Listesi

  • Amaçlanan release commit’i kontrol edilmiş ve test edilmiştir.

  • Working tree temizdir.

  • Version adı proje kurallarına uygundur.

  • Tag türü release politikasına uygundur.

  • Annotation release’i açıklar.

  • Tag doğru commit’e işaret eder.

  • Gerekli signing ve doğrulama adımları tamamlanmıştır.

  • Yalnızca amaçlanan tag yayınlanır.

  • Release artifact’leri etiketlenmiş commit’ten oluşturulur.

  • Yayınlanan tag dikkatsizce taşınmaz.

Sık Sorulan Sorular

Git Stash Untracked Dosyaları Kaydeder mi?

Varsayılan olarak hayır. Untracked dosyaları dahil etmek için git stash push -u kullanın.

-u Ignored Dosyaları Dahil Eder mi?

Hayır. Ignored dosyaların da dahil edilmesi gerektiğinde -a veya --all kullanın.

Apply ve Pop Arasındaki Fark Nedir?

İkisi de stash değişikliklerini geri yükler. apply stash girişini korur; pop başarılı uygulamadan sonra kaldırır.

Stash’i Başka Branch’e Uygulayabilir miyim?

Evet; ancak hedef branch stash’in ilk base’inden önemli ölçüde farklıysa conflict olasılığı artar.

Stash’i Paylaşabilir miyim?

Normal stash girişleri yereldir. İş birliği için branch oluşturup çalışmayı commit edin veya bilinçli gelişmiş transfer iş akışı kullanın.

Stash Uzun Vadeli Çalışma İçin Güvenli mi?

Temel olarak geçici yerel çalışma için tasarlanmıştır. Önemli uzun vadeli değişiklikler branch, commit ve remote kopyalarıyla korunmalıdır.

Lightweight ve Annotated Tag Arasındaki Fark Nedir?

Lightweight tag doğrudan referanstır. Annotated tag ise tagger meta verisi, tarih, mesaj ve isteğe bağlı imza içeren tag nesnesi oluşturur.

Release’lerde Annotated Tag Kullanılmalı mı?

Annotated veya signed tag’ler açık release meta verisi sakladıkları için resmî sürümlere genellikle daha uygundur.

git push Tag’leri Otomatik Yayınlar mı?

Normal branch push işlemi her yerel tag’i zorunlu olarak yayınlamaz. Amaçlanan tag’i açıkça yayınlayın veya dikkatle seçilmiş tag-push seçeneği kullanın.

Tag’i Değiştirebilir miyim?

Yerel tag değiştirilebilir; ancak yayınlanmış tag’i değiştirmek clone’lar ve sistemler arasında tutarsız release kimlikleri oluşturabilir.

Tag Bir Branch’e İşaret Edebilir mi?

Tag, branch’in gelecekteki hareketine değil bir nesneye çözülür. Branch adı kullanılarak tag oluşturulduğunda branch’in o anda referans verdiği nesne etiketlenir.

Tag Checkout Edilmişken Commit Oluşturabilir miyim?

Detached-HEAD modunda commit oluşturabilirsiniz; ancak hiçbir branch otomatik ilerlemez. Çalışmanın açık biçimde korunması gerekiyorsa önce branch oluşturun.

Signed Tag Release Binary’sinin İmzalandığı Anlamına mı Gelir?

Hayır. Git tag nesnesini imzalar. Release binary’leri, container’lar, package’lar ve attestation’lar ayrı signing ve doğrulama gerektirebilir.

Sonuç

Git stash ve tag’ler geliştirme iş akışının iki farklı ucunda çalışır.

Stash tamamlanmamış yerel çalışmayı yönetir. Working tree’yi geçici olarak temizlemenizi, seçilen tracked veya untracked değişiklikleri korumanızı, çalışmayı başka branch’e taşımanızı ve daha sonra geri dönmenizi sağlar. Bu güç sorumluluk getirir: neyin saklandığını inceleyin, açıklayıcı mesajlar kullanın, dikkatli geri yükleyin ve önemli uzun ömürlü çalışmayı normal commit’lere dönüştürün.

Tag’ler kararlı tarihsel noktaları tanımlar. Lightweight tag’ler basit etiketler sunarken annotated ve signed tag’ler daha güçlü release meta verisi taşır. İyi yönetilen tag test edilmiş bir commit’e işaret eder, tutarlı versioning kuralını izler ve yayınlandıktan sonra sabit kalır.

En önemli fark dayanıklılık ve amaçtır. Stash geçici ve kişisel bir çalışma kapsayıcısıdır. Release tag’i ise belirli bir adın belirli bir proje durumunu tanımladığına dair paylaşılan bir sözdür.

Bir sonraki makale Git iş akışlarını inceleyecektir: feature branch’ler, GitHub Flow, Git Flow, trunk-based development, release branch’leri, hotfix stratejileri ve ekip boyutuna ve teslimat modeline uygun iş akışının nasıl seçileceği.

Resmî Kaynaklar ve Ek Okumalar