Git: Commit Yönetimi ve Rebase Rehberi
Bu rehber, staged değişiklikleri koruma, commit sırasını değiştirme ve squash işlemlerini kapsamaktadır.
1. Staged Değişiklikleri Kaybetmeden Yedekleme
Patch dosyasına export et (en güvenli)
git diff --staged > my-changes.patch
Staged hali bozulmadan kalır. Sonradan uygulamak için:
git apply --index my-changes.patch
--index flag'i değişiklikleri unstaged değil, yeniden staged olarak uygular.
Sadece staged değişiklikleri stash'le
git stash push --staged --message "backup"
# geri almak için:
git stash pop
2. Staged Değişiklikleri Hem Yeni Branch'e Taşı Hem Burada Bırak
# 1. Sigorta al
git diff --staged > backup.patch
# 2. Yeni branch'e geç (staged değişiklikler seninle gelir)
git checkout -b feat/yeni-branch
# 3. Commit'le
git commit -m "feat: ..."
# 4. Eski branch'e dön
git checkout -
# 5. Staged olarak geri yükle
git apply --index backup.patch
3. Değişiklikleri Atmak
# Sadece unstage et (dosyayı değiştirmez)
git restore --staged .
# Tüm değişiklikleri at (staged + unstaged) — GERİ ALINAMAZ
git restore .
# Tek dosya için
git restore --staged path/to/file
git restore path/to/file
⚠️
git restore .kalıcıdır. Önce patch al.
4. Rebase'de "Accept All Current" Ne Anlama Gelir?
Rebase sırasında Current/Incoming rolleri normal merge'in tersidir:
| Normal Merge | Rebase | |
|---|---|---|
| Current (ours) | Senin branch'in | Hedef branch (main) |
| Incoming (theirs) | Gelen branch | Senin commit'lerin |
Özet: Rebase'de kendi değişikliklerini korumak istiyorsan → Accept All Incoming seç.
5. Interactive Rebase: Commit Sırasını Değiştirme ve Squash
VS Code'u git editörü yap
git config --global core.editor "code --wait"
Bu ayar olmadan terminal editörü (vi/vim) açılır.
Rebase başlat
git rebase -i <düzenlemek-istediğin-en-eski-committen-önceki-hash>
Örnek — son 3 commit'i düzenlemek için 4. commit'in hash'ini kullan:
git log --oneline -5
# output:
# abc1234 fix: lint
# def5678 cypress tests
# ghi9012 fix: coderabbit
# jkl3456 ← bu parent, bunu kullan
git rebase -i jkl3456
Editörde yapılacaklar
VS Code'da açılan dosyada commitler eskiden yeniye sıralanır:
pick ghi9012 fix: coderabbit
pick def5678 cypress tests
pick abc1234 fix: lint
Commit öne almak
Satırı kes, üstteki satırın üstüne yapıştır:
pick ghi9012 fix: coderabbit ← öne alındı
pick def5678 cypress tests
pick abc1234 fix: lint
İki commit'i birleştirmek (squash)
pick → squash (veya kısaca s) yap. Squash, o commit'i bir öncekiyle birleştirir:
pick ghi9012 fix: coderabbit
pick def5678 cypress tests
squash abc1234 fix: lint ← def5678 ile birleşir
Kaydet ve sekmeyi kapat (Cmd+W). Squash mesajı için ikinci bir editör açılır — istediğin mesajı bırak, diğerlerini sil.
Conflict çıkarsa
# Conflict'leri çöz, sonra:
git add .
git rebase --continue
# Vazgeçmek istersen:
git rebase --abort
6. Rebase Sonrası Push
Rebase commit hash'leri değiştirdiği için normal push reddedilir:
# Güvenli force push (başkası push etmediyse çalışır)
git push --force-with-lease
# Asla kullanma — başkasının değişikliğini ezer:
# git push --force
--force-with-lease remote'da beklenmedik bir commit varsa push'u reddeder, böylece takım arkadaşının çalışmasını korur.
Özet Akışı
1. git log --oneline → commit hash'lerini gör
2. git rebase -i <parent> → editör açılır
3. Satırları yeniden sırala, squash ekle
4. Kaydet + sekmeyi kapat
5. Conflict varsa çöz → git rebase --continue
6. git push --force-with-lease
Hiç yorum yok:
Yorum Gönder