Git komutları: her gün kullanacağınız örneklerle kısa rehber
Temel Git komutları şunlardır: depo oluşturmak için git init ve git clone, değişiklikleri kaydetmek için git status, git add ve git commit, branch işlemleri için git branch, git switch ve git merge, sunucuyla eşitleme için git push, git fetch ve git pull, geri almak için git restore, git reset ve git revert.
Aşağıda görevlere göre gruplanmış çalışma rehberi var: her komutun bir örneği ve kısa bir açıklaması bulunuyor. Terminalin yanında açık tutmak kolaydır: bir geliştiricinin Git ile bir günde yaptığı işlerin neredeyse tamamı bu tablolardaki 20–30 komuta sığar.
Komutları anlamlı okumak için üç alanı akılda tutun: çalışma dizini (diskteki dosyalar), index ya da staging area (bir sonraki commit'e girecekler) ve repository (.git klasöründeki commit geçmişi). Git komutlarının çoğu değişiklikleri bu üç alan arasında ya da yerel ile uzak depo arasında taşır.
Git yapılandırması
Bu komutlar kurulumdan sonra bir kez çalıştırılır. --global bayrağı ayarları ~/.gitconfig dosyasına yazar ve kullanıcının tüm repository'lerinde geçerli olur; bayrak yoksa ayar yalnızca mevcut repository'de geçerlidir.
| Komut | Ne yapar |
|---|---|
git config --global user.name "Ali Yılmaz" | Commit yazarının adı |
git config --global user.email "ali@example.com" | Commit yazarının e-postası |
git config --global init.defaultBranch main | Yeni repository'lerde varsayılan branch adı |
git config --global core.editor "code --wait" | Commit mesajları için editör (burada VS Code) |
git config --global pull.rebase false | git pull'un varsayılan davranışı — birleştirme |
git config --global core.autocrlf input | Commit sırasında CRLF'yi LF'ye çevirir (macOS/Linux; Windows'ta genellikle true) |
git config --list --show-origin | Tüm ayarları ve her birinin hangi dosyadan geldiğini gösterir |
git config --global alias.st status | Takma ad: git status yerine git st |
git --version | Kurulu Git sürümü |
git help commit | Komutun tam yardımı (kısa olanı için git commit -h) |
Repository oluşturma ve klonlama
| Komut | Ne yapar |
|---|---|
git init | Bulunulan klasörde boş bir repository (.git klasörü) oluşturur |
git init my-project | my-project klasörünü ve içinde repository'yi oluşturur |
git clone https://github.com/user/repo.git | Uzak repository'yi tüm geçmişiyle kopyalar |
git clone git@github.com:user/repo.git app | SSH ile app klasörüne klonlar |
git clone --depth 1 URL | Sığ klon: yalnızca son commit, hızlı ve az yer |
git clone -b develop URL | Klonlar ve hemen develop branch'ine geçer |
Temel döngü: status, add, commit
Günlük işin çekirdeği budur: neyin değiştiğine bakmak, gerekenleri indekse seçmek ve bir commit ile kaydetmek.
| Komut | Ne yapar |
|---|---|
git status | Durum: değiştirilmiş, indekslenmiş ve izlenmeyen dosyalar |
git status -s | Kısa biçim: M — değiştirildi, A — eklendi, ?? — izlenmiyor |
git add dosya.txt | Dosyayı indekse ekler |
git add . | Mevcut klasördeki ve alt klasörlerdeki tüm değişiklikleri ekler, silmeler dahil |
git add -A | Tüm repository'deki değişiklikleri ekler |
git add -p | Değişikliklerin parçalarını (hunk) tek tek seçtirir |
git commit -m "Giriş formu ekle" | Indeksten bir commit oluşturur ve mesaj yazar |
git commit -am "Yazım hatasını düzelt" | İzlenen tüm değiştirilmiş dosyaları indeksleyip commit eder; yeni dosyalar dahil edilmez |
git commit --amend | Son commit'i yeniden yazar: unutulan dosyayı ekler ya da mesajı düzeltir |
git commit --amend --no-edit | Son commit'i mesajını değiştirmeden tamamlar |
git rm dosya.txt | Dosyayı hem diskten hem indeksten siler |
git rm --cached secret.env | Dosyayı diskte bırakarak izlemeyi durdurur |
git mv eski.js yeni.js | Dosyayı yeniden adlandırır ya da taşır |
Tipik bir senaryo:
git status
git add src/login.js src/login.css
git diff --staged # commit'e neyin gireceğini kontrol et
git commit -m "Giriş formu ekle"
Zaten sunucuya gönderilmiş bir commit'te --amend kullanmayın: yeni bir hash'li commit oluşturur ve meslektaşlarınızın geçmişleri ayrışır.
Geçmişe ve değişikliklere bakma
| Komut | Ne yapar |
|---|---|
git log | Mevcut branch'in commit geçmişi |
git log --oneline | Her commit tek satırda: kısa hash ve başlık |
git log --oneline --graph --all | Tüm branch'lerin grafiği terminalde |
git log -p dosya.txt | Dosyanın geçmişi, her commit'in farkıyla |
git log --author="Ali" --since="2 weeks ago" | Yazara ve tarihe göre filtre |
git log -S "getUser" | Bu metnin eklendiği ya da silindiği commit'ler |
git log main..feature | feature'da olup main'de olmayan commit'ler |
git diff | Çalışma dizinindeki, henüz indekse eklenmemiş değişiklikler |
git diff --staged | Son commit'e göre indekste bekleyen değişiklikler (eşanlamlısı --cached) |
git diff main feature | İki branch'in uçları arasındaki fark |
git diff HEAD~3 -- src/ | Son üç commit'te src klasöründeki değişiklikler |
git show a1b2c3d | Belirli bir commit'in bilgileri ve farkı |
git show HEAD:README.md | Son commit'teki dosya içeriği |
git blame app.js | Her satırı en son kimin, hangi commit'te değiştirdiği |
git shortlog -sn | Yazarlara göre commit sayısı |
Commit'lere referans vermenin yolları her yerde işe yarar: HEAD mevcut commit, HEAD~1 onun ebeveyni, HEAD~3 ilk ebeveynler üzerinden üç adım geri, HEAD^2 ise merge commit'inin ikinci ebeveyni.
Branch'ler: oluşturma, geçiş, silme
Git 2.23 ile branch işleri için git switch, dosya işleri için git restore geldi; bu ikisi aşırı yüklenmiş git checkout'u ayırdı. Eski biçimler hâlâ çalışır.
| Komut | Ne yapar |
|---|---|
git branch | Yerel branch'lerin listesi; mevcut olan * ile işaretlenir |
git branch -a | Yerel ve uzak (izlenen) branch'ler |
git branch -vv | Branch'ler, son commit'leri ve upstream'e göre geride/önde olma durumu |
git branch feature/login | Branch oluşturur, geçiş yapmaz |
git switch feature/login | Branch'e geçer |
git switch -c feature/login | Branch oluşturur ve geçer (git checkout -b karşılığı) |
git switch - | Bir önceki branch'e döner |
git branch -m yeni-ad | Mevcut branch'in adını değiştirir |
git branch -d feature/login | Branch zaten birleştirilmişse siler |
git branch -D feature/login | Birleştirilmemiş olsa bile zorla siler |
git branch --merged | Mevcut branch'e birleştirilmiş branch'ler — silinebilecekler |
Birleştirme ve yeniden temellendirme
| Komut | Ne yapar |
|---|---|
git merge feature | feature'ı mevcut branch'e birleştirir (mümkünse fast-forward) |
git merge --no-ff feature | Her zaman bir merge commit'i oluşturur |
git merge --squash feature | Branch'in tüm değişikliklerini tek seferde indekse koyar; ardından git commit |
git merge --abort | Çakışmalı birleştirmeyi iptal eder ve başlangıç durumuna döner |
git rebase main | Mevcut branch'in commit'lerini main'in üstüne taşır |
git rebase -i HEAD~4 | Son 4 commit'i etkileşimli olarak birleştirir (squash), yeniden adlandırır, sıralar veya siler |
git rebase --continue | Çakışma çözüldükten sonra devam eder |
git rebase --abort | Rebase'i tamamen iptal eder |
git cherry-pick a1b2c3d | Tek bir commit'i mevcut branch'e yeni bir commit olarak uygular |
Birleştirmede çakışmayı çözmek neredeyse her zaman aynı adımlardan oluşur:
git merge feature
# CONFLICT (content): Merge conflict in app.js
git status # dosyalar "both modified" bölümünde
# app.js'i düzenle, <<<<<<< ======= >>>>>>> işaretlerini kaldır
git add app.js
git commit # Git hazır bir birleştirme mesajı önerir
Rebase'in temel kuralı: ortak branch'te zaten bulunan ve başkalarının üzerine iş kurduğu commit'leri rebase etmeyin.
Uzak depolarla çalışma
| Komut | Ne yapar |
|---|---|
git remote -v | Remote'ları ve adreslerini listeler |
git remote add origin git@github.com:user/repo.git | Uzak repository'yi origin adıyla bağlar |
git remote set-url origin YENI_URL | Remote adresini değiştirir (örneğin HTTPS'ten SSH'ye) |
git remote remove upstream | Remote'u kaldırır |
git fetch | Yeni commit'leri ve branch'leri indirir, dosyalarınıza dokunmaz |
git fetch --prune | Aynısını yapar, ayrıca sunucuda silinmiş branch işaretlerini temizler |
git pull | git fetch + upstream branch'in mevcut branch'e birleştirilmesi |
git pull --rebase | git fetch + sizin commit'lerinizin yeni gelenlerin üstüne taşınması |
git push | Mevcut branch'in commit'lerini upstream'e gönderir |
git push -u origin feature/login | Branch'i ilk kez gönderir ve upstream'i ayarlar |
git push --force-with-lease | Uzak branch'i yalnızca üzerinde sizin görmediğiniz yeni commit yoksa yeniden yazar |
git push origin --delete feature/login | Branch'i sunucudan siler |
git push --tags | Yerel tüm etiketleri gönderir |
git push --force yerine alışkanlık haline getirin: --force-with-lease. Bir meslektaşınız aynı branch'e yeni bir şey gönderdiyse komut üzerine yazmayı reddeder.
Değişiklikleri geri alma
Git'in en gergin kısmı budur. Komut seçmeden önce temel soruyu sorun: değişiklik henüz yalnızca dosyalarda mı, indekste mi, yerel bir commit'te mi, yoksa zaten yayımlanmış bir commit'te mi?
| Durum | Komut |
|---|---|
| Dosyadaki değişiklikleri geri almak (son commit'teki hâline döndürmek) | git restore app.js |
| Dosyayı indeksten çıkarmak, değişikliklerini korumak | git restore --staged app.js |
| Dosyayı belirli bir commit'ten geri getirmek | git restore --source=a1b2c3d app.js |
| Son commit'i geri almak, değişiklikleri indekste tutmak | git reset --soft HEAD~1 |
| Son commit'i geri almak, değişiklikleri dosyalarda tutmak | git reset HEAD~1 (varsayılan --mixed modu) |
| Son commit'i ve tüm değişikliklerini silmek | git reset --hard HEAD~1 |
| Yayımlanmış bir commit'i yeni bir «ters» commit ile geri almak | git revert a1b2c3d |
| Merge commit'ini geri almak | git revert -m 1 <merge-hash> |
| Izlenmeyen dosyaların silineceklerini görmek | git clean -n |
| İzlenmeyen dosya ve klasörleri silmek | git clean -fd |
| Reset ya da rebase sonrası «kaybolmuş» commit'i bulmak | git reflog, sonra git reset --hard HEAD@{2} |
git reset --hard ve git clean -f, commit edilmemiş değişiklikleri geri dönüşsüz siler: reflog yalnızca commit'leri tutar, çalışma dizinindeki düzenlemeleri değil. Bunları çalıştırmadan önce git stash yapın ya da en azından git status'a bakın.
Stash: yarım kalan işi bir kenara koymak
| Komut | Ne yapar |
|---|---|
git stash | İzlenen dosyalardaki değişiklikleri saklar ve çalışma dizinini temizler |
git stash push -u -m "yarım: form" | İzlenmeyen dosyalarla birlikte, bir açıklamayla saklar |
git stash list | Saklanan kayıtların listesi: stash@{0}, stash@{1}… |
git stash show -p stash@{0} | Saklanan kaydın farkını gösterir |
git stash pop | Son kaydı geri getirir ve listeden siler |
git stash apply stash@{1} | Kaydı geri getirir, listede bırakır |
git stash drop stash@{1} | Tek bir kaydı siler |
git stash branch fix-form | Stash'in alındığı commit'ten yeni bir branch oluşturur ve kaydı uygular |
Etiketler ve sürümler
| Komut | Ne yapar |
|---|---|
git tag | Etiketlerin listesi |
git tag -a v1.2.0 -m "Sürüm 1.2.0" | Yazar, tarih ve mesajı olan açıklamalı etiket |
git tag v1.2.0 a1b2c3d | Belirli bir commit'e hafif etiket |
git push origin v1.2.0 | Tek bir etiketi gönderir |
git tag -d v1.2.0 | Etiketi yerelde siler |
git push origin --delete v1.2.0 | Etiketi sunucudan siler |
git describe --tags | En yakın etiket ve ondan sonraki commit sayısı, örneğin v1.2.0-3-ga1b2c3d |
İleri düzey komutlar
| Komut | Ne yapar |
|---|---|
git bisect start, git bisect bad, git bisect good v1.1.0 | Hatayı getiren commit'i ikili arama ile bulur; sonunda git bisect reset |
git worktree add ../hotfix main | Aynı repository'den, başka bir branch'li ikinci bir çalışma klasörü |
git submodule update --init --recursive | Klonlamadan sonra alt modülleri indirir |
git grep "TODO" | İzlenen dosyalarda hızlı arama |
git format-patch -1 HEAD / git apply fix.patch | Bir commit'i yama dosyasına kaydeder; yamayı çalışma dizinine uygular |
git gc | Nesneleri paketler ve repository'yi temizler (genellikle Git bunu kendisi yapar) |
Sık karşılaşılan hatalar ve çözümleri
Yeni branch yerine main'e commit yaptım
Commit henüz gönderilmediyse, mevcut commit'te bir branch oluşturun ve main'i geri alın:
git branch feature/login # branch, sizin commit'inizi gösterir
git reset --hard HEAD~1 # main bir adım geri gider
git switch feature/login
Son commit'e bir dosyayı eklemeyi unuttum
git add unutulan.js
git commit --amend --no-edit
Push reddedildi: rejected, non-fast-forward
Sunucuda sizde olmayan commit'ler var. Önce onları alın, sonra gönderin:
git pull --rebase
git push
Yanlışlıkla parolaları içeren bir dosyayı commit ettim
Dosyayı izlemeden çıkarın ve .gitignore'a ekleyin: git rm --cached .env, sonra commit. Commit zaten yayımlandıysa, gizli bilgiyi ele geçmiş sayın ve yenisini üretin — geçmişten silinmiş olmaz.
Kısaca
Günlük iş için kısa bir küme yeter: status, add, commit, switch, merge, pull, push ve log --oneline. Geri alma komutlarını — restore, reset, revert — commit'in yayımlanıp yayımlanmadığına göre seçin; reflog'u son çare olarak akılda tutun. Bu rehberdeki tüm komutlar Git kursunda kendi deponuzda denenerek çalışılmaktadır.
Sık sorulan sorular
Yeni başlayan biri kaç Git komutu bilmeli?
Başlamak için 10–12 komut yeter: init, clone, status, add, commit, log, diff, branch, switch, merge, pull ve push. Diğerleri ihtiyaç doğdukça öğrenilir.
git switch ile git checkout arasındaki fark nedir?
git switch yalnızca branch değiştirir ve oluşturur; git checkout ise dosyaları da geri yükleyebilir. Ayrım, bir branch ile dosyayı karıştırıp değişiklikleri yanlışlıkla silmeyi önlemek için yapıldı.
Herhangi bir Git komutunun yardımına nasıl bakarım?
Tam kılavuz için git help komut, kısa bayrak listesi için git komut -h. Aynı belgeler git-scm.com'da da bulunur.
Uzun Git komutlarını kısaltabilir miyim?
Evet, takma adlarla: git config --global alias.lg "log --oneline --graph --all" yazdıktan sonra git lg kullanabilirsiniz.
Bu komutlar Windows'ta da çalışır mı?
Evet, komutlar tüm sistemlerde aynıdır. Windows'ta Git Bash, PowerShell ya da kod editörünün terminalinde çalıştırabilirsiniz.
Bu konu “Sıfırdan Güvenilir Geliştiriciye Git” kursunda uygulamalı olarak ayrıntılı işleniyor.
- İlk Depo: init, add, commit ve İndeksin Sihri
- Geçmişi Okumak: log, diff, show ve Geçmişte Gezinti
- Dallar: Kodunuzun Paralel Gerçekliği
- Hataları Geri Alıyoruz: restore, reset, revert — Doğru ve Tehlikeli Kullanımları
- GitHub ve Uzaktaki Depolar: Kodunuz Bulutta
- Gelişmiş Araçlar: rebase, stash, cherry-pick ve etiketler