Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Git ve GitHub Nedir? Sürüm Kontrolüne Giriş
Sürüm kontrolü neden var, merkezi ve dağıtık araçlar arasındaki fark ne, Git ile GitHub neden aynı şey değil? Sunucusu silinen bir repo'da geçmişe bakıp commit atarak dağıtık çalışmayı deniyor, Git'in kısa tarihçesini, DevOps'taki yerini ve serinin kurgusunu görüyoruz.
Git Kurulumu ve İlk Ayarlar: git config ile Doğru Başlangıç
Git'i macOS, Windows ve Linux'a kurup sürümünü kontrol ediyor, system/global/local ayar katmanlarını, user.name ve user.email'i, init.defaultBranch main'in neden gerektiğini, core.editor'ü ve core.autocrlf'i görüyoruz. git config list/get/set/unset (2.46+) alt komutlarını eski --get biçimiyle karşılaştırıyoruz.
İlk Git Repo'su: git init, Staging Area ve İlk Commit
bookstore repo'sunu git init ile sıfırdan kuruyor, .git klasörüne ilk kez bakıyoruz. Working tree, staging area ve repository üçlüsünü git status, git add ve git commit ile adım adım görüyor, status -s'in iki sütununu ve MM durumunun neden commit'e ilk hâli taşıdığını öğreniyoruz.
Git Commit'in İçi: Snapshot, Object'ler ve Hash
Commit'in diff değil snapshot olduğunu git cat-file ile commit, tree ve blob object'lerini açarak görüyor, hash'i shasum ile elle hesaplıyor, değişmeyen dosyanın neden ikinci kez saklanmadığını buluyoruz. İyi bir commit mesajının kurallarını ve git commit --amend'in neden yeni bir commit ürettiğini öğreniyoruz.
Git ile Dosya Takibi: .gitignore, git rm --cached ve git mv
.gitignore pattern'lerini, ! ile istisnayı ve git check-ignore -v ile hangi kuralın devrede olduğunu görüyoruz. Zaten commit'lenmiş bir .env'in neden .gitignore'a rağmen takip edildiğini ve git rm --cached ile nasıl çıkarıldığını, global excludes'u, git mv'yi ve .gitattributes ile satır sonlarını ele alıyoruz.
Git Geçmişine Bakmak: git log, git show, git blame ve Alias'lar
git log'un --oneline, --graph, --stat, -p, --format, --author, --since, --grep ve --follow seçenekleriyle geçmişte geziniyor, -S ile -G arasındaki farkı fiyatı değişen bir satırla görüyoruz. git show ile tek commit'e ve eski bir dosya hâline bakıyor, git blame -L ile satırların kaynağını buluyor, alias'larla uzun komutları kısaltıyoruz.
Git diff ile Değişiklikleri Karşılaştırmak
git diff'in working tree, index ve HEAD arasında hangi karşılaştırmayı yaptığını, diff çıktısının nasıl okunduğunu, --stat, --name-only ve --word-diff gibi özet görünümleri, commit'ler arası diff'i ve iki nokta ile üç nokta (--merge-base) farkını gerçek çıktılarla görüyoruz.
Git Branch: Hareketli Bir Pointer, HEAD ve git switch
Branch'in içinde tek bir commit hash'i taşıyan 41 byte'lık bir dosya olduğunu, HEAD'in nasıl çalıştığını, git branch ile listeleme, yeniden adlandırma ve silmeyi, git switch ve switch -c ile gezinmeyi, detached HEAD'e girip çıkmayı ve git checkout'un eski kullanımını gerçek çıktılarla görüyoruz.
Git Merge: Fast-forward, Three-way Merge ve Merge Commit
Fast-forward ile three-way merge arasındaki farkı, ortak atanın (git merge-base) rolünü, iki parent'lı merge commit'in içini, --no-ff ve --ff-only seçeneklerini, Git 2.34'ten beri varsayılan olan ort stratejisini ve merge sonrası branch temizliğini gerçek çıktılarla görüyoruz.
Git Conflict Çözmek: Marker'lar, merge --abort ve zdiff3
Conflict'in neden çıktığını, marker'ların nasıl okunduğunu, git status, git log --merge ve git ls-files -u ile durumu görmeyi, adım adım çözümü, git merge --abort'u, merge.conflictStyle zdiff3'ü, --ours/--theirs, mergetool ve rerere'yi gerçek çıktılarla görüyoruz; Git 2.56'daki git add --resolved'a da kısaca değiniyoruz.
Git Remote ve Clone: origin, fetch, push ve Upstream
Remote'un ne olduğunu, GitHub yerine yerel bir bare repo ile git remote add, push -u ve upstream ayarını, origin/main gibi remote-tracking branch'leri, git clone'un yaptığı işleri, fetch ile merge'ün ayrımını, yeni bir branch'i paylaşmayı, git remote show/rename'i ve reddedilen push'u gerçek çıktılarla görüyoruz.
Git Pull'u Doğru Anlamak: fetch, merge, rebase ve Divergent Branches
git pull'un fetch ile merge ya da rebase'den oluştuğunu, Git 2.33.1'den beri ayrışmış branch'lerde çıkan "divergent branches" hatasını, --no-rebase, --rebase ve --ff-only seçeneklerini, pull.rebase ile pull.ff arasındaki tercihi, Git 2.51'deki pull.autostash'i ve fetch --prune'u gerçek çıktılarla görüyoruz.