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:
| Aksi | Perubahan | Pesan hasil | Editor pesan |
|---|---|---|---|
squash | Melebur ke commit di atasnya | Gabungan kedua pesan | Terbuka — kita rapikan isinya |
fixup | Melebur ke commit di atasnya | Pesan commit atasnya saja | Tidak 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:
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 --onelineOutput yang Dihasilkan:
91f61c7 Finalisasi draf artikel
5ea9d89 wip: tulis penutup
3b192af wip: tulis pembahasan
bf36bd6 wip: tulis pendahuluan
fb9e897 Mulai proyek artikelTujuannya: empat commit paling atas menjadi satu commit bernama “Finalisasi draf artikel”. Daftar todo dibuka dengan rentang empat commit:
git rebase -i HEAD~4Buffer yang terbuka di editor (komentar bantuannya dipotong):
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:
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:
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~4Output yang Dihasilkan:
[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:
git log --onelineOutput yang Dihasilkan:
06e48db Finalisasi draf artikel
fb9e897 Mulai proyek artikelcat draf.mdOutput yang Dihasilkan:
pendahuluan
pembahasan
penutup
rujukanEmpat 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:
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):
printf 'pencarian: siap dipakai\n' > pencarian.md
git add pencarian.md
git commit --fixup c63cd5aOutput yang Dihasilkan:
[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:
git log --onelineOutput yang Dihasilkan:
ed4a0eb fixup! Tambah halaman pencarian
b92a644 Tambah halaman kontak
c63cd5a Tambah halaman pencarian
5108248 Buat kerangka situsSejauh 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:
GIT_SEQUENCE_EDITOR=cat git rebase -i --autosquash HEAD~3Output yang Dihasilkan (dipotong):
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:
git log --onelineOutput yang Dihasilkan:
87967a3 Tambah halaman kontak
6bd34f4 Tambah halaman pencarian
5108248 Buat kerangka situsTiga 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
.