Git: Commit'leri Birleştirme (Squash)
Son güncelleme
Squash birden fazla commit'i tek bir commit'te birleştirir, böylece "wip", "yazım hatasını düzelt", "asıl şimdi düzelt" gibi dağınık bir commit serisi tek ve temiz bir commit'e dönüşür. Alışılmış araç etkileşimli rebase'tir - git rebase -i - burada birleştireceğin commit'leri işaretlersin. Squash geçmişi yeniden yazdığı için, bunu push'tan önce ya da yalnızca senin üzerinde çalıştığın bir dalda yap.
Bunları terminal playground'da dene - tarayıcında gerçek bir kabuk, kurulacak hiçbir şey yok.
Sözdizimi
| Command | What it does |
|---|---|
git rebase -i HEAD~3 | Son 3 commit'i etkileşimli olarak rebase eder |
git rebase -i main | main'den bu yana her commit'i rebase eder |
git merge --squash feature | Merge sırasında bir dalın commit'lerini tek bir commit'te birleştirir |
git reset --soft HEAD~3 && git commit | Son 3 commit'i rebase olmadan birleştirir |
Etkileşimli rebase komutları
Açılan editörde pick yerine bunlardan birini yaz.
| Keyword | What it does |
|---|---|
pick | Commit'i olduğu gibi tutar |
squash (s) | Önceki commit'e katar, mesajları birleştirir |
fixup (f) | Katar ama bu commit'in mesajını atar |
reword (r) | Commit'i tutar ama mesajını düzenler |
Örnek uygulama
Push'tan önce son üç commit'i tek bir commit'te birleştir.
| Step | Action | Result |
|---|---|---|
| 1 | git rebase -i HEAD~3 | Son 3 commit'i editörde açar |
| 2 | 2. ve 3. commit'leri squash olarak ayarla | Onları ilkine katılacak şekilde işaretler |
| 3 | Kaydet ve birleştirilmiş mesajı düzenle | Üç commit tek ve temiz bir commit olur |
Git commit birleştirme (squash) SSS
Git'te son N commit'i nasıl birleştiririm?
git rebase -i HEAD~N komutunu çalıştır (örneğin son üç için HEAD~3). Editörde ilk commit'i pick olarak bırak ve geri kalanını squash yap (mesajlarını atmak için fixup). Kaydet, birleştirilmiş commit mesajını düzenle, commit'ler tek bir commit'te toplanır.squash ile fixup arasındaki fark nedir?
squash commit'in mesajını korur ve bir editörde diğerleriyle birleştirmene izin verir. fixup ise commit'in mesajını tamamen atar, yalnızca önceki commit'in mesajını tutar - son mesajda görmek istemediğin "hata, küçük düzeltme" commit'leri için kullanışlıdır.Merge yaparken bir dalın tamamını nasıl birleştiririm?
git merge --squash feature kullan, ardından git commit yap. Bu, dalın tüm değişikliklerini stage'lenmiş değişiklikler olarak uygular ve dalın ayrı ayrı commit'lerini getirmeden hedef dalda tek bir commit olarak kaydetmene izin verir. GitHub'ın "Squash and merge" düğmesi de aynı işi yapar.Etkileşimli rebase olmadan birleştirebilir miyim?
git reset --soft HEAD~N dalı N commit geri alır ve tüm değişikliklerini stage'lenmiş tutar, ardından tek bir git commit onları tek bir commit olarak kaydeder. Rebase editörünü açmadan en son commit'leri birleştirmenin hızlı bir yoludur.