Riwayat kerja yang jujur jarang sekaligus rapi: sebuah fitur tumbuh lewat commit-commit “wip” yang hanya berarti bagi penulisnya pada malam itu, baru mendapat pesan final yang layak tampil ketika pekerjaan selesai. Membiarkannya membuat git log sesak label sementara; menghapus riwayatnya berarti membuang kerja. Interactive rebase menawari jalan tengah lewat dua aksi penggabung: squash melipat commit ke tetangga atasnya sambil menyatukan kedua pesannya, dan fixup melipat dengan membuang pesan commit yang dilipat. Chapter ini melipat empat commit menjadi satu secara nyata, lalu menunjukkan workflow pasangannya — git commit --fixup dan --autosquash — yang membuat penggabungan sehari-hari nyaris tanpa pikir panjang.

Dua Aksi Penggabung dan Bedanya #

Keduanya bekerja ke arah yang sama: perubahan commit bawah melebur ke commit atasnya, menjadi satu snapshot tunggal. Bedanya ada pada pesan:

AksiPerubahanPesan hasilEditor pesan
squashMelebur ke commit di atasnyaGabungan kedua pesanTerbuka — kita rapikan isinya
fixupMelebur ke commit di atasnyaPesan commit atasnya sajaTidak terbuka

Pola praktisnya: squash dipakai ketika pesan kedua commit sama-sama berharga dan perlu dirangkai; fixup dipakai ketika commit bawah hanyalah koreksi kecil yang pesannya memang layak dibuang — “perbaiki typo”, “wip lagi”.

Melipat Empat Commit Menjadi Satu #

Repository latihan memuat satu commit kerangka dan empat commit draf di atasnya — tiga di antaranya berpesan wip, dan hanya yang terakhir yang berpesan final:

bash
mkdir latihan-gabung && cd latihan-gabung
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Draf artikel\n' > draf.md
git add draf.md
git commit -m "Mulai proyek artikel"
printf 'pendahuluan\n' > draf.md
git add draf.md
git commit -m "wip: tulis pendahuluan"
printf 'pendahuluan\npembahasan\n' > draf.md
git add draf.md
git commit -m "wip: tulis pembahasan"
printf 'pendahuluan\npembahasan\npenutup\n' > draf.md
git add draf.md
git commit -m "wip: tulis penutup"
printf 'pendahuluan\npembahasan\npenutup\nrujukan\n' > draf.md
git add draf.md
git commit -m "Finalisasi draf artikel"
git log --oneline

Output yang Dihasilkan:

text
91f61c7 Finalisasi draf artikel
5ea9d89 wip: tulis penutup
3b192af wip: tulis pembahasan
bf36bd6 wip: tulis pendahuluan
fb9e897 Mulai proyek artikel

Tujuannya: empat commit paling atas menjadi satu commit bernama “Finalisasi draf artikel”. Daftar todo dibuka dengan rentang empat commit:

bash
git rebase -i HEAD~4

Buffer yang terbuka di editor (komentar bantuannya dipotong):

text
pick bf36bd6 wip: tulis pendahuluan
pick 3b192af wip: tulis pembahasan
pick 5ea9d89 wip: tulis penutup
pick 91f61c7 Finalisasi draf artikel
(dipotong — sisanya komentar bantuan bawaan Git)

Strategi lipatnya: baris pertama tetap pick sebagai badan commit; kedua baris wip berikutnya menjadi fixup — isinya melebur, pesannya dibuang; baris terakhir menjadi squash — isinya melebur dan pesan “Finalisasi draf artikel” ikut disatukan sehingga bisa dipilih menjadi pesan hasil. Sunting buffer hingga menjadi:

text
pick bf36bd6 wip: tulis pendahuluan
fixup 3b192af wip: tulis pembahasan
fixup 5ea9d89 wip: tulis penutup
squash 91f61c7 Finalisasi draf artikel
(dipotong — sisanya komentar bantuan bawaan Git)

Setelah buffer disimpan, aksi squash membuka satu editor pesan gabungan yang berisi keempat subjek sekaligus — di sinilah kita membuang tiga baris wip dan menyisakan “Finalisasi draf artikel”. Siapkan pesan final di sebuah berkas dan pakai cp sebagai editor pesan (pola GIT_EDITOR dari chapter Interactive Rebase ), lalu jalankan rebase:

bash
printf 'Finalisasi draf artikel\n' > pesan-gabung.txt
GIT_SEQUENCE_EDITOR="sed -i -e 2s/^pick/fixup/ -e 3s/^pick/fixup/ -e 4s/^pick/squash/" \
  GIT_EDITOR="cp pesan-gabung.txt" git rebase -i HEAD~4

Output yang Dihasilkan:

text
[detached HEAD 06e48db] Finalisasi draf artikel
 Date: Mon Oct 19 10:30:00 2026 +0700
 1 file changed, 4 insertions(+), 1 deletion(-)
Successfully rebased and updated refs/heads/main.

Keluaran [detached HEAD 06e48db] Finalisasi draf artikel memperlihatkan commit hasil lipatan lahir dengan pesan final; 1 file changed, 4 insertions(+), 1 deletion(-) adalah diffstat gabungan keempat suntingan. Riwayat akhirnya:

bash
git log --oneline

Output yang Dihasilkan:

text
06e48db Finalisasi draf artikel
fb9e897 Mulai proyek artikel
bash
cat draf.md

Output yang Dihasilkan:

text
pendahuluan
pembahasan
penutup
rujukan

Empat commit menjadi satu, isi berkas utuh sampai baris terakhir — tidak satu baris pekerjaan pun hilang dalam pelipatan. Variasi murni fixup (tanpa squash) akan memakai pesan baris pertama — wip: tulis pendahuluan — sebagai pesan hasil; kombinasi di atas memilih squash justru untuk mengganti pesan itu dengan pesan final.

Workflow –fixup dan –autosquash #

Membuka todo secara manual untuk setiap koreksi kecil tetap terasa mahal. Workflow yang lebih ringkas berjalan begini: ketika sebuah suntingan kecil ternyata melengkapi commit yang sudah lampau, commit-lah suntingan itu dengan --fixup menyebut hash commit tujuannya. Repository kedua menyiapkan keadaannya:

bash
mkdir latihan-fixup && cd latihan-fixup
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Situs\n' > situs.md
git add situs.md
git commit -m "Buat kerangka situs"
printf 'pencarian: belum siap\n' > pencarian.md
git add pencarian.md
git commit -m "Tambah halaman pencarian"
printf '[email protected]\n' > kontak.md
git add kontak.md
git commit -m "Tambah halaman kontak"

Kemudian sebuah koreksi kecil untuk halaman pencarian datang, dan kita tahu ia milik commit c63cd5a (hash di mesin uji — cari padanan riwayat dengan git log --oneline):

bash
printf 'pencarian: siap dipakai\n' > pencarian.md
git add pencarian.md
git commit --fixup c63cd5a

Output yang Dihasilkan:

text
[main ed4a0eb] fixup! Tambah halaman pencarian
 1 file changed, 1 insertion(+), 1 deletion(-)

Perhatikan pesannya: Git menulis otomatis fixup! Tambah halaman pencarian — subjek commit tujuan disalin dengan awalan fixup!. Riwayatnya:

bash
git log --oneline

Output yang Dihasilkan:

text
ed4a0eb fixup! Tambah halaman pencarian
b92a644 Tambah halaman kontak
c63cd5a Tambah halaman pencarian
5108248 Buat kerangka situs

Sejauh ini belum ada yang terlipat — commit koreksi hanya ditandai. Pelipatannya dijalankan --autosquash, yang membaca awalan fixup! lalu menata todo secara otomatis: commit koreksi dipindahkan tepat di belakang sasarannya dan ditandai fixup (sama untuk awalan squash! yang menandai aksi squash). Tangkap daftar yang sudah teratur itu dengan trik cat dari chapter sebelumnya:

bash
GIT_SEQUENCE_EDITOR=cat git rebase -i --autosquash HEAD~3

Output yang Dihasilkan (dipotong):

text
pick c63cd5a Tambah halaman pencarian
fixup ed4a0eb fixup! Tambah halaman pencarian
pick b92a644 Tambah halaman kontak

(dipotong — sisanya komentar bantuan bawaan Git)

Bandingkan dengan urutan aslinya pada log: baris fixup ed4a0eb kini berpindah ke posisi kedua, tepat di belakang pick c63cd5a — sasarannya — dan di depan pick b92a644 yang tidak tersentuh. Karena cat keluar dengan sukses, rebase langsung mengeksekusi daftar itu; riwayat hasilnya:

bash
git log --oneline

Output yang Dihasilkan:

text
87967a3 Tambah halaman kontak
6bd34f4 Tambah halaman pencarian
5108248 Buat kerangka situs

Tiga commit yang tadinya bercampur koreksi kini bersih: “Tambah halaman pencarian” sudah memuat suntingan pencarian: siap dipakai di dalam snapshotnya, dan pesan koreksinya lenyap sesuai janji fixup. Perintah git commit --amend hanya mampu menambal commit terakhir; pasangan --fixup + --autosquash adalah bentangannya untuk commit mana pun di bawah — keduanya terdokumentasi di halaman manual git-commit dan git-rebase .

Pesan bisa diganti (reword), urutan bisa ditukar, isi bisa dilebur. Satu kebutuhan masih tersisa: mengubah isi berkas pada commit lama — membetulkan typo yang ikut ter-commit dua langkah di bawah. Aksi edit dan jeda git rebase --continue yang menyertainya adalah materi chapter berikutnya: Mengedit Commit Lama .