Kitap 06 · Özet sayfa
Sürüm Kontrolü
Kod değişikliklerini takip etmek ve ekip olarak birlikte çalışmak için Git kavramları.
Software Dictionary · softwaredictionary.org/tr/kutuphane/version-control/ozet
- 01.gitignore
- .gitignore, Git'in izlememesi gereken bağımlılık, derleme çıktısı, günlük ve gizli bilgi gibi dosya ve klasörlerin kalıplarını listeleyen düz metin dosyadır.
- .gitignore, Git'in izlememesi gereken dosyaların kalıplarını listeler.
- Tipik girdiler bağımlılıkları, derleme çıktılarını, günlükleri ve gizli bilgiler içeren .env dosyalarını kapsar.
- Kalıplar joker karakterleri (*), dizin kurallarını (dist/), yorumları (#) ve istisnaları (!) destekler.
- 02Branch
- Git'te branch, bir özellik ya da düzeltme üzerinde, birleştirene kadar ana kodu etkilemeden çalışmanızı sağlayan bağımsız bir geliştirme hattıdır.
- Branch, bir depo içindeki yalıtılmış bir geliştirme hattıdır.
- Git'te branch, bir commit'i gösteren hafif bir işaretçiden ibarettir.
- Varsayılan branch genellikle main olarak adlandırılır.
- 03Cherry-pick
- Git'te cherry-pick, belirli bir commit'in değişikliklerini geldiği branch'in geri kalanını birleştirmeden, mevcut branch'inize yeni bir commit olarak kopyalar.
- git cherry-pick <hash> tek bir commit'in değişikliklerini mevcut branch'e uygular.
- Orijinali taşımak yerine yeni hash'e sahip yeni bir commit oluşturur.
- Düzeltmeleri release branch'lerine taşımak ya da yanlış yere yapılmış bir commit'i başka yere almak için yaygın olarak kullanılır.
- 04Code Review
- Code review, kod değişikliklerinin birleştirilmeden önce başka geliştiricilerce incelenmesidir; hataları yakalar, kaliteyi artırır, bilgi paylaşımını sağlar.
- Code review, kod değişikliklerinin birleştirilmeden önce meslektaşlar tarafından kontrol edilmesidir.
- Genellikle bir pull request içinde, belirli satırlara yapılan yorumlarla gerçekleşir.
- Otomatik denetimler biçimlendirmeyi ve testleri üstlenir; insanlar mantığa, tasarıma ve anlaşılırlığa odaklanır.
- 05Commit
- Commit, Git'te projenin dosyalarının; benzersiz bir kimlik, yazar, zaman damgası ve değişikliği anlatan bir mesajla kaydedilmiş anlık görüntüsüdür.
- Commit, hazırlanmış değişikliklerin anlık görüntüsü ile yazar, tarih, mesaj ve üst commit gibi meta verilerden oluşur.
- Her commit'i tanımlayan benzersiz bir hash vardır.
- Commit'ler, uzak bir depoya push edilene kadar yerelde kalır.
- 06Conventional Commits
- Conventional Commits, feat: add search gibi yapılandırılmış commit mesajları için bir şartnamedir; araçlar değişiklik günlüğü üretip sürümü otomatik seçer.
- Conventional Commits, yapılandırılmış bir commit mesajı biçimi tanımlar.
- Mesajlar tür(kapsam): açıklama biçimindedir, feat: ya da fix: gibi.
- Bir ! ya da bir BREAKING CHANGE alt satırı kırıcı değişiklikleri işaretler.
- 07Detached HEAD
- Detached HEAD, bir branch yerine belirli bir commit'i checkout ettiğiniz ve yaptığınız yeni commit'lerin hiçbir branch'e ait olmadığı bir Git durumudur.
- HEAD normalde bir branch'i gösterir; detached HEAD durumunda doğrudan bir commit'i gösterir.
- Bir commit hash'ini, bir tag'i ya da bir remote-tracking branch'i checkout etmek HEAD'i ayırır.
- Eski sürümleri incelemek, test etmek veya derlemek için güvenlidir.
- 08Fast-Forward Mergeİleri Sarma Birleştirmesi
- Fast-forward merge, hedef branch'te diğer branch ayrıldığından beri yeni commit yoksa olur; Git merge commit'i oluşturmaz, işaretçiyi yalnızca ileri taşır.
- Fast-forward, merge commit'i oluşturmak yerine branch işaretçisini taşır.
- Yalnızca hedef branch ayrışmamışsa mümkündür.
- Bir branch'i en son main üzerine rebase etmek onu fast-forward yapılabilir kılar.
- 09Fork
- Fork, başkasının deposunun bir barındırma platformundaki kişisel kopyasıdır; özgürce denemeler yapmanızı ve değişiklikleri özgün projeye geri önermenizi sağlar.
- Fork, bir barındırma platformunda bir deponun kendi hesabınız altındaki kopyasıdır.
- Fork'lar, doğrudan push edemediğiniz projelere pull request'ler aracılığıyla katkı vermenizi sağlar.
- Özgün depoya upstream denir; güncel kalmak için onunla senkronize olun.
- 10Git
- Git, dosyalardaki değişiklikleri zamanla izleyen ücretsiz, açık kaynaklı dağıtık sürüm kontrol sistemidir; iş birliğini ve hataları geri almayı kolaylaştırır.
- Git dağıtık bir sürüm kontrol sistemidir: her klon, tüm geçmişi içerir.
- Değişiklikler, geri yüklenebilir anlık görüntüler olan commit'ler olarak kaydedilir.
- Branch'ler özellikleri ayrı bir hatta geliştirmenizi ve sonra birleştirmenizi sağlar.
- 11Git Bisect
- Git bisect, commit geçmişinde ikili arama (binary search) yaparak hatayı getiren commit'i, yalnızca birkaç commit'i test ederek bulan Git komutudur.
- Git bisect, bir hatayı ortaya çıkaran ilk commit'i bulur.
- İkili arama kullanır; bu yüzden adım sayısı geçmiş boyutuyla çok yavaş artar.
- Commit'leri git bisect good ve git bisect bad ile işaretlersiniz.
- 12Git Checkout
- git checkout başka bir branch'e ya da commit'e geçer veya dosyaları önceki sürüme döndürür; yeni Git sürümleri bu işleri git switch ve git restore'a ayırır.
- git checkout branch değiştirir ya da dosyaları geri yükler.
- git checkout -b bir branch oluşturup ona geçer.
- Git 2.23 onu git switch ve git restore olarak ikiye ayırdı.
- 13Git Clone
- Git clone, mevcut bir deponun tüm geçmişiyle birlikte eksiksiz bir kopyasını indiren ve çalışmanız için bilgisayarınızda hazırlayan bir Git komutudur.
- git clone <url> bir depoyu tüm geçmişiyle makinenize kopyalar.
- Otomatik olarak origin adlı bir remote ekler ve varsayılan branch'i checkout eder.
- Her klon, çevrimdışı kullanılabilen eksiksiz bir depodur.
- 14Git Diff
- Git diff, çalışma dosyaları, stage edilmiş değişiklikler veya commit'ler gibi kodunuzun iki sürümü arasındaki tam satır satır farkları gösteren Git komutudur.
- git diff satır satır değişiklikleri gösterir; kaldırılan satırlar için -, eklenen satırlar için + kullanılır.
- Düz git diff stage edilmemiş değişiklikleri gösterir; git diff --staged commit edilecekleri gösterir.
- Branch'leri, commit'leri ya da tek dosyaları karşılaştırabilirsiniz; --stat her dosyanın değişikliklerini özetler.
- 15Git Fetch
- git fetch, uzak depodan yeni commit, branch ve etiketleri indirip origin/main gibi uzak izleme branch'lerini günceller; sizin branch ve dosyalarınız değişmez.
- git fetch uzak bir depodan yeni commit'leri ve referansları indirir.
- origin/main gibi uzak izleme branch'lerini günceller.
- Branch'leriniz, staging alanınız ve dosyalarınız değişmez.
- 16Git Hooks
- Git hook'ları, commit ya da push öncesi gibi anlarda Git'in otomatik çalıştırdığı; kodu denetleyen, kural uygulayan ve işleri otomatikleştiren betiklerdir.
- Hook'lar, commit, merge veya push gibi olaylarda Git'in otomatik çalıştırdığı betiklerdir.
- pre-commit gibi bir hook'un sıfırdan farklı çıkış kodu, işlemi iptal eder.
- .git/hooks içindeki hook'lar klonlamayla paylaşılmaz; bu yüzden ekipler core.hooksPath ya da bir hook yöneticisi kullanır.
- 17Git Pull
- Git pull, uzak bir depodan yeni commit'leri indiren ve bunları hemen mevcut yerel branch'inize entegre eden bir Git komutudur.
- git pull önce git fetch çalıştırır, ardından sonucu mevcut branch'inize merge eder ya da rebase eder.
- Kendi yerel commit'leriniz yoksa fast-forward yapar.
- git pull --rebase, merge commit oluşturmak yerine yerel commit'lerinizi uzak olanların üzerine yeniden uygular.
- 18Git Push
- Git push, yerel commit'lerinizi uzak bir depoya yükleyip oradaki ilgili branch'i güncelleyen Git komutudur; böylece başkaları çalışmanızı görüp kullanabilir.
- git push yerel commit'leri uzak bir depodaki bir branch'e yükler.
- git push -u origin <branch> yeni bir branch'i yayımlar ve sonraki push ve pull'lar için upstream'ini ayarlar.
- Git, fast-forward olmayan push'ları reddeder; önce pull yapın, sonra yeniden push edin.
- 19Git Remote
- Git remote, deponuzun genellikle bir sunucudaki başka bir kopyasına verilen, origin gibi bir kısa addır; commit'leri oraya push eder, oradan pull edersiniz.
- Remote, origin gibi kısa bir ad ile deponun başka bir kopyasının URL'sinin eşleşmesidir.
- git clone, origin remote'unu otomatik olarak oluşturur.
- git remote -v remote'ları listeler, git remote add yenisini oluşturur.
- 20Git Reset
- Git reset, mevcut branch'i daha eski bir commit'e geri taşıyan ve moduna göre staging area'yı ile dosyalarınızı da sıfırlayabilen bir Git komutudur.
- git reset <commit> mevcut branch'i başka bir commit'e taşır ve sonraki commit'leri ondan kaldırır.
- --soft geri alınan değişiklikleri stage edilmiş tutar, --mixed (varsayılan) stage edilmemiş tutar, --hard ise atar.
- git reset <file> içeriğini değiştirmeden bir dosyayı staging'den çıkarır.
- 21Git Revert
- Git revert, önceki bir commit'i, tersi değişiklikleri içeren yeni bir commit oluşturarak geri alan, mevcut proje geçmişini olduğu gibi bırakan Git komutudur.
- git revert <hash>, önceki bir commit'in değişikliklerini tersine çeviren yeni bir commit oluşturur.
- Geçmiş yeniden yazılmaz; bu yüzden main gibi paylaşılan branch'lerde kullanmak güvenlidir.
- Bir merge commit'i geri almak için hangi ebeveynin korunacağını seçen -m 1 gerekir.
- 22Git Stash
- Git stash, commit edilmemiş değişiklikleri geçici olarak saklayıp çalışma dizinini temizleyen komuttur; başka işe geçip çalışmanıza sonra dönmenizi sağlar.
- git stash commit edilmemiş değişiklikleri kaydeder ve çalışma dizinini temizler.
- Stash'ler bir yığında tutulur ve stash@{0} her zaman en yenisidir.
- pop bir stash'i geri yükler ve kaldırır, apply ise geri yükler ve tutar.
- 23Git Tag
- Git tag, belirli bir commit'i gösteren adlandırılmış kalıcı bir işaretçidir; çoğunlukla deponun geçmişinde v1.0.0 gibi sürümleri işaretlemek için kullanılır.
- Tag, tek bir commit'i gösteren sabit ve adlandırılmış bir işaretçidir.
- Annotated tag'ler yazar, tarih ve mesaj saklar ve sürümler için önerilir.
- Lightweight tag'ler, ek veri içermeyen basit ad-commit işaretçileridir.
- 24Gitflow
- Gitflow, planlı sürümleri yönetmek için uzun ömürlü main ve develop branch'lerini feature, release ve hotfix branch'leriyle kullanan bir Git branch modelidir.
- Gitflow iki kalıcı branch kullanır: yayımlanmış kod için main ve yaklaşan işler için develop.
- Feature branch'leri develop'tan çıkar, release branch'leri bir sürümü hazırlar, hotfix branch'leri canlıyı yamalar.
- Release ve hotfix branch'leri hem main'e hem de develop'a birleştirilir ve her sürüm etiketlenir.
- 25GitHub
- GitHub, Git depolarını barındırıp birlikte kod yazmaya yarayan; pull request, kod incelemesi, issue ve en büyük açık kaynak topluluğunu sunan platformdur.
- GitHub, Git depolarını internette barındırır ve Microsoft'a aittir.
- Pull request'ler, ekiplerin değişiklikleri birleştirmeden önce inceleyip tartışmasını sağlar.
- Issue'lar, projeler ve GitHub Actions planlamayı ve otomasyonu kapsar.
- 26GitLab
- GitLab, kod inceleme, iş takibi, CI/CD ve güvenlik taramasını tek uygulamada toplayan, bulutta ya da kendi sunucunuzda çalışan Git barındırma platformudur.
- GitLab, Git depolarını inceleme, iş takibi ve CI/CD ile tek bir yerde barındırır.
- 2011'de başladı ve 2021'de halka açık bir şirket oldu.
- Merge request'ler onun pull request'leridir; hatlar .gitlab-ci.yml'de yaşar.
- 27HEAD
- HEAD, Git'te checkout edilmiş olanı, normalde bulunduğunuz branch'i gösteren işaretçidir; o branch da son commit'ini gösterir, yeni commit'ler oraya eklenir.
- HEAD, checkout edilmiş olanı, normalde mevcut branch'i gösterir.
- Yeni commit'ler HEAD'in gösterdiği yere eklenir ve branch'i ilerletir.
- HEAD~1, HEAD~3 ve HEAD^2 ona göre commit'leri gösterir.
- 28HotfixAcil Düzeltme
- Hotfix, çökme ya da güvenlik açığı gibi production'daki ciddi bir sorun için hızla ve olağan sürüm takviminin dışında yayımlanan acil bir düzeltmedir.
- Hotfix, ciddi bir production sorununu acilen düzeltir.
- Production'da çalışan koddan başlar ve olabildiğince küçük kalır.
- Gitflow'da hotfix branch'leri hem main'e hem develop'a birleştirilir.
- 29Merge
- Git'te merge, bir branch'teki değişiklikleri başka bir branch'e katarak ayrı geliştirme hatlarını tek ve ortak bir geçmişte yeniden birleştirir.
- Merge, bir branch'teki değişiklikleri başka bir branch'e entegre eder.
- Fast-forward merge yalnızca işaretçiyi ilerletir; three-way merge ise bir merge commit oluşturur.
- İki branch aynı satırları değiştirdiğinde çakışma oluşur ve elle çözülmesi gerekir.
- 30Merge Conflict
- Merge çakışması, iki branch bir dosyanın aynı satırlarını değiştirdiği için Git'in otomatik birleştiremediği, sonuca birinin karar vermesi gereken durumdur.
- Merge çakışması, iki branch aynı satırları değiştirdiğinde ya da biri diğerinin sildiği bir dosyayı düzenlediğinde oluşur.
- Git, çakışmaları dosyada <<<<<<<, ======= ve >>>>>>> işaretleriyle belirtir.
- Dosyayı düzenleyip işaretleri kaldırarak, git add çalıştırıp ardından commit ederek çözün.
- 31Monorepo
- Monorepo, uygulamalar, servisler ve paylaşılan kütüphaneler gibi birçok projenin kodunu birlikte yönetilen tek bir sürüm kontrol deposunda tutma yaklaşımıdır.
- Monorepo, birçok projeyi ve paylaşılan kütüphaneyi tek bir depoda tutar.
- Projeler arası değişiklikler tek bir atomik commit'te yapılabilir.
- Workspace'ler ve Nx, Turborepo, Bazel gibi derleme araçları yalnızca etkilenen görevleri çalıştırarak derlemeleri hızlı tutar.
- 32Pull Request
- Pull request, bir branch'teki değişiklikleri başka bir branch'e birleştirme önerisidir; kod birleşmeden önce ekibe inceleme, tartışma ve test alanı sunar.
- Pull request, bir branch'in başka bir branch'e birleştirilmesini önerir.
- Kod incelemesi, tartışma ve onay için ana yerdir.
- Otomatik testler genellikle birleştirmeden önce her pull request'te çalışır.
- 33Rebase
- Git'te rebase, bir branch'in commit'lerini başka bir commit'in üzerine yeniden uygular; geçmişi yeniden yazıp merge commit'siz, temiz ve doğrusal kılar.
- Rebase, commit'lerinizi başka bir branch ya da commit'in üzerine yeniden uygular.
- Merge commit içermeyen doğrusal bir geçmiş oluşturur.
- Rebase edilen commit'ler, yeni hash'lere sahip yeni commit'lerdir.
- 34Repository
- Repository, bir projenin tüm dosyalarını ve sürüm kontrol sisteminin kaydettiği her değişikliğin eksiksiz geçmişini barındıran depolama alanıdır.
- Repository, bir projenin dosyalarını tüm değişiklik geçmişiyle birlikte saklar.
- Git bu geçmişi gizli bir .git dizininde tutar.
- Yerel depolar makinenizde bulunur; uzak depolar paylaşım için barındırılır.
- 35Semantic Versioning
- Semantic versioning, her bölümün bir sürümün uyumluluğu bozduğunu, özellik eklediğini ya da hata düzelttiğini belirttiği MAJOR.MINOR.PATCH şemasıdır.
- Sürümler 2.4.1 gibi MAJOR.MINOR.PATCH biçimini izler.
- Uyumsuz değişiklikler için MAJOR, uyumlu yeni özellikler için MINOR, hata düzeltmeleri için PATCH artırılır.
- Üst numara arttığında alt numaralar sıfırlanır.
- 36Squash Merge
- Squash merge, bir branch'teki tüm commit'leri hedef branch üzerinde tek bir yeni commit'te birleştirir; böylece ana geçmiş kısa ve okunması kolay kalır.
- Squash merge, bir branch'teki tüm commit'leri hedef branch üzerinde tek bir commit'e dönüştürür.
- Ana branch geçmişini, özellik ya da pull request başına tek commit ile temiz tutar.
- Ortaya çıkan commit'in tek ebeveyni olduğundan Git, branch'i merge edilmiş olarak kaydetmez.
- 37Staging Area
- Git'teki staging area, dosyalarınız ile bir sonraki commit arasındaki bekleme alanıdır; o commit'e girecek değişiklikleri tam olarak buraya koyarsınız.
- Staging area, bir sonraki commit'e girecek değişiklikleri tutar.
- git add değişiklikleri stage eder, git commit ise yalnızca stage edilenleri kaydeder.
- Git staging area'yı .git/index dosyasında saklar; bu yüzden ona index de denir.
- 38Sürüm Kontrolü
- Sürüm kontrolü, dosyalardaki her değişikliği kaydeden; kimin neyi değiştirdiğini görmeyi, eski sürümlere dönmeyi ve paralel çalışmayı sağlayan sistemdir.
- Sürüm kontrolü, bir projenin dosyalarındaki her değişikliği yazarı, tarihi ve nedeniyle kaydeder.
- Klasörleri kopyalamak yerine sürümleri karşılaştırabilir, geri getirebilir ve birleştirebilirsiniz.
- Git gibi dağıtık sistemlerde her geliştiricide bütün geçmiş bulunur.
- 39Trunk-Based Development
- Trunk-based development, geliştiricilerin küçük değişiklikleri en az günde bir kez ortak ana branch'e birleştirip onu hep yayımlanabilir tuttuğu stratejidir.
- Herkes, genellikle main olan tek bir ortak branch'e entegre eder.
- Branch'ler kullanılıyorsa en fazla bir iki gün yaşar.
- Her değişiklikteki otomatik testler trunk'ı yayımlanabilir tutar.