Menu
CoddyTech

Git: Squash Commit

Terakhir diperbarui

Squash menggabungkan beberapa commit menjadi satu, sehingga rangkaian commit berantakan seperti "wip", "fix typo", "actually fix it" menjadi satu commit yang rapi. Alat yang biasa dipakai adalah rebase interaktif, git rebase -i, tempat kamu menandai commit mana yang akan dilebur. Karena squash menulis ulang riwayat, lakukan sebelum push, atau di branch yang hanya kamu kerjakan sendiri.

Coba perintah-perintah ini di playground terminal: shell sungguhan di browsermu, tanpa perlu instalasi.

Squash melipat serangkaian commit kecil menjadi satu commit yang rapi lewat rebase interaktif.

Sintaks

PerintahFungsinya
git rebase -i HEAD~3Rebase interaktif 3 commit terakhir
git rebase -i mainRebase setiap commit sejak main
git merge --squash featureSquash semua commit branch menjadi satu saat merge
git reset --soft HEAD~3 && git commitSquash 3 commit terakhir tanpa rebase

Perintah rebase interaktif

Di editor yang terbuka, ganti pick dengan salah satu kata kunci ini.

Kata kunciFungsinya
pickMempertahankan commit apa adanya
squash (s)Melebur ke commit sebelumnya, menggabungkan pesannya
fixup (f)Melebur, tapi membuang pesan commit ini
reword (r)Mempertahankan commit tapi mengedit pesannya

Contoh langkah demi langkah

Squash tiga commit terakhir menjadi satu sebelum push.

LangkahTindakanHasil
1git rebase -i HEAD~3Membuka 3 commit terakhir di editor
2Ubah commit 2 dan 3 menjadi squashMenandainya untuk dilebur ke commit pertama
3Simpan lalu edit pesan gabungannyaTiga commit menjadi satu commit yang rapi

Pertanyaan seputar squash commit

Apa arti squash commit?

Squash mengubah beberapa commit menjadi satu commit yang berisi semua perubahannya. File-nya tetap sama persis; yang berubah hanya riwayatnya, sehingga reviewer melihat satu commit dengan satu pesan, bukan deretan perbaikan kecil.

Bagaimana cara squash N commit terakhir di Git?
Jalankan git rebase -i HEAD~N (misalnya HEAD~3 untuk tiga terakhir). Di editor, biarkan commit pertama sebagai pick dan ubah sisanya menjadi squash (atau fixup untuk membuang pesannya). Simpan, edit pesan commit gabungannya, dan commit-commit itu melebur menjadi satu.
Apa bedanya squash dan fixup?
Keduanya melebur sebuah commit ke commit sebelumnya. squash mempertahankan pesan commit dan memungkinkanmu menggabungkannya dengan pesan lain di editor. fixup membuang pesan commit itu sepenuhnya dan hanya mempertahankan pesan commit sebelumnya, praktis untuk commit "oops, small fix" yang tidak ingin kamu masukkan ke pesan akhir.
Bagaimana cara squash seluruh branch saat merge?
Pakai git merge --squash feature, lalu git commit. Perintah ini menerapkan semua perubahan branch sebagai perubahan yang sudah di-stage dan memungkinkanmu merekamnya sebagai satu commit di branch tujuan, tanpa membawa commit-commit individual branch itu. Tombol "Squash and merge" di GitHub melakukan hal yang sama.
Bisakah squash tanpa rebase interaktif?
Bisa. git reset --soft HEAD~N memindahkan branch mundur N commit sambil membiarkan semua perubahannya tetap di-stage, lalu satu git commit merekamnya sebagai satu commit. Ini cara cepat untuk squash commit terbaru tanpa membuka editor rebase.
Apakah sebaiknya squash commit sebelum merge?
Banyak tim melakukannya, supaya setiap fitur masuk sebagai satu commit yang mudah dibaca dan mudah di-revert. Konsekuensinya, riwayat langkah demi langkahnya hilang. Bebas squash di branch yang hanya kamu pakai; di branch bersama, sepakati dulu, karena commit yang ditulis ulang memaksa semua orang lain melakukan reset pada salinan mereka.
Bisakah saya berlatih ini secara online?

Bisa. Buka playground terminal untuk menjalankan rebase interaktif di shell sungguhan di browsermu, tanpa perlu instalasi. Kursus Git interaktif gratis dari Coddy juga membahas rebase dan cara merapikan riwayat langkah demi langkah.

Ilustrasi bahasa pemrograman di Coddy

Belajar Git bersama Coddy

Mulai