Git Squash Kullanımı

Öyle güzel git komutları var ki, daha önceden mevcut mu diye araştırmadığınız için kendinize kızıyorsunuz. Squash da benim için bunlardan birisiydi. Şu senaryoyu düşünün, projenizin README dosyasını değiştirdiniz ve yaptığınız değişiklikleri README'yi güncelledim commit mesajı ile push'ladınız. Ancak sonradan fark ettiniz ki birkaç yeri daha düzenlemeniz lazım. Yine aynı şekilde gerekli değişiklikleri yaptınız ve yine README'yi güncelledim mesajı ile 2 ekstra commit ile yeni değişiklikleri de push'ladınız. Aslında 1 commit ile yapmanız gereken işlemi 3 commit'e yaydınız. Bu 3 commit'i tek bir commit'te squash komutu ile birleştirmeniz mümkün.

Gerçek hayattan kendi yaşadığım bir başka örneği de anlatayım. Pull request yolladığım bir projede, pull requesti yolladıktan sonra fark ettim ki, proje dosyalarındaki indent ile benim editörümde kullandığım indent farklıymış. Sonradan bunu da bir başka commit ile düzelttim ve yolladım. Ne olacak diye düşünebilirsiniz, ancak bu git history için felaket anlamına geliyor, yaptığım ikinci commit ile projenin tüm satırlarında imzam oluyor ve gereksiz yere indent'i düzelttim diye commit mesajım yer alıyor(bir başka harika komut olan git blame DOSYA ile herhangi bir dosyada bunu kontrol edebilirsiniz, nasıl bir şey olduğunu merak ediyorsanız bu linkten Github arayüzüne bakabilirsiniz).

Alttaki komut ile projenizin son üç komutunu, ilk örnekteki son 3 README'yi güncelledim commit'ini düşünebilirsiniz, düzenleyebilirsiniz.
$ git rebase -i origin/master~3 master
Karşınıza çıkan ekranda, üst satırda son 3 commit'inizin yer aldığını göreceksiniz.
pick bef2a97 README güncellendi
pick 280167f README yine güncellendi
pick 5c48d88 README yine tekrar güncellendi
Üzerinde birleştirmek istediğiniz commit'i pick ile seçmeniz gerekirken, squash ile de birleştirmek istediğiniz commit'leri belirtiyorsunuz. İlk satırdaki commit için p ile pick belirtip, alttaki diğer iki commit için s ile squash belirtebilirsiniz. Böylece 3 commit ilk satırdaki commit'te birleşmiş oluyor.
p bef2a97 README güncellendi
s 280167f README yine güncellendi
s 5c48d88 README yine tekrar güncellendi
Bu dosyayı kaydedip çıkın. Sonrasında da force bayrağı ile yaptığınız değişiklikleri pushlayabilirsiniz.
$ git push --force origin master
Commit sayınızın 2 adet eksildiğini göreceksiniz.