Dua penyesalan paling umum terhadap commit lama: pesannya salah — terlalu kabur, salah ketik, atau tidak menggambarkan isinya — dan isinya salah — sebuah typo yang ikut ter-commit dan baru terlihat dua commit kemudian. Perbaikan pesan terakhir bisa dilakukan git commit --amend, tetapi amend hanya menjangkau HEAD; untuk commit yang lebih dalam, interactive rebase membuka dua aksi yang tepat: reword mengubah pesan commit lama, dan edit menghentikan rebase tepat di depan commit itu supaya isinya bisa disunting lalu dilanjutkan. Chapter ini menjalankan keduanya pada satu commit yang menanggung dua kesalahan sekaligus, dengan bukti hash yang berubah di sepanjang riwayat turunannya.
Repository dengan Commit Bermasalah #
Latihan berisi laporan tiga bagian plus kerangkanya. Commit kedua dari tiga bagian itu — “Tulis bagian data” — memuat dua masalah: pesannya kabur, dan isinya salah ketik (penjulalan):
mkdir latihan-edit && cd latihan-edit
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Laporan\n' > laporan.md
git add laporan.md
git commit -m "Buat kerangka laporan"
printf 'pendahuluan singkat\n' > pendahuluan.md
git add pendahuluan.md
git commit -m "Tulis bagian pendahuluan"
printf 'data penjulalan 2026\n' > data.md
git add data.md
git commit -m "Tulis bagian data"
printf 'penutup singkat\n' > penutup.md
git add penutup.md
git commit -m "Tambah penutup"
git log --onelineOutput yang Dihasilkan:
36173fb Tambah penutup
3f121dd Tulis bagian data
40451f6 Tulis bagian pendahuluan
eef6ccf Buat kerangka laporanReword: Mengubah Pesan Commit Lama #
Pesan “Tulis bagian data” mau diganti menjadi “Tulis ringkasan data penjualan”. Aksi reword pada baris kedua todo membuka editor pesan untuk commit itu; seperti biasa, GIT_SEQUENCE_EDITOR menandai barisnya dan GIT_EDITOR mengganti editor pesan dengan penimpaan berkas:
printf 'Tulis ringkasan data penjualan\n' > pesan-reword.txt
GIT_SEQUENCE_EDITOR="sed -i 2s/^pick/reword/" GIT_EDITOR="cp pesan-reword.txt" git rebase -i HEAD~3Output yang Dihasilkan:
[detached HEAD d3dfca2] Tulis ringkasan data penjualan
Date: Tue Oct 20 09:20:00 2026 +0700
1 file changed, 1 insertion(+)
create mode 100644 data.md
Successfully rebased and updated refs/heads/main.git log --onelineOutput yang Dihasilkan:
68fa8a0 Tambah penutup
d3dfca2 Tulis ringkasan data penjualan
40451f6 Tulis bagian pendahuluan
eef6ccf Buat kerangka laporanBandingkan dengan log sebelumnya baris demi baris. Pesan berubah seperti pesanan: “Tulis bagian data” menjadi “Tulis ringkasan data penjualan”. Lalu perhatikan hashnya: commit itu berubah dari 3f121dd menjadi d3dfca2 — dan bukan cuma dia; “Tambah penutup” di atasnya ikut berganti dari 36173fb menjadi 68fa8a0, padahal pesan maupun isinya tidak disentuh. Commit “Tulis bagian pendahuluan” (40451f6) dan kerangka di bawahnya tetap, karena keduanya berada di bawah titik sunting. Ini konsekuensi rantai: mengubah satu commit memaksa semua turunannya ditulis ulang, karena parent setiap turunan berganti.
Edit: Menyunting Isi Commit Lama #
Sekarang typo-nya. Aksi edit pada baris kedua todo membuat rebase berhenti tepat setelah commit itu diterapkan — keadaan HEAD sengaja dibekukan supaya kita bisa menyunting lalu meng-amend commit-nya sendiri:
GIT_SEQUENCE_EDITOR="sed -i 2s/^pick/edit/" git rebase -i HEAD~3Output yang Dihasilkan:
Stopped at d3dfca2... Tulis ringkasan data penjualan
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continueGit menghentikan langkahnya di d3dfca2 dan menawarkan dua perintah persis seperti yang tercetak: git commit --amend untuk merevisi commit yang sedang dibekukan, dan git rebase --continue untuk melanjutkan. Status saat jeda memperlihatkan posisi kita di tengah pengerjaan:
git statusOutput yang Dihasilkan:
interactive rebase in progress; onto eef6ccf
Last commands done (2 commands done):
pick 40451f6 Tulis bagian pendahuluan
edit d3dfca2 Tulis ringkasan data penjualan
Next command to do (1 remaining command):
pick 68fa8a0 Tambah penutup
(use "git rebase --edit-todo" to view and edit)
You are currently editing a commit while rebasing branch 'main' on 'eef6ccf'.
(use "git commit --amend" to amend the current commit)
(use "git rebase --continue" once you are satisfied with your changes)
nothing to commit, working tree cleanPerbaiki typo pada data.md, stage-kan, lalu amend tanpa membuka editor pesan — --no-edit mempertahankan pesan “Tulis ringkasan data penjualan” yang barusan kita pasang:
sed -i 's/penjulalan/penjualan/' data.md
git add data.md
git commit --amend --no-editOutput yang Dihasilkan:
[detached HEAD 4f73b6c] Tulis ringkasan data penjualan
Date: Tue Oct 20 09:20:00 2026 +0700
1 file changed, 1 insertion(+)
create mode 100644 data.mdCommit revisi lahir sebagai 4f73b6c — masih berstatus detached HEAD, sesuai keadaan di tengah rebase. Lanjutkan rebase untuk memutar ulang sisa daftar todo:
git rebase --continueOutput yang Dihasilkan:
Successfully rebased and updated refs/heads/main.Verifikasi hasil akhirnya dua arah — isi berkas dan riwayat:
cat data.mdOutput yang Dihasilkan:
data penjualan 2026git log --onelineOutput yang Dihasilkan:
391db0d Tambah penutup
4f73b6c Tulis ringkasan data penjualan
40451f6 Tulis bagian pendahuluan
eef6ccf Buat kerangka laporanpenjulalan telah menjadi penjualan di dalam commit yang menuliskannya, bukan sebagai tambalan di commit baru — riwayat hanya memuat tiga bagian sebagaimana mestinya. Dua commit di bawah titik sunting tetap dengan hash aslinya; dua commit yang disunting dan ditulis ulang berganti hash.
Semua penyuntingan riwayat sejauh ini sengaja berjalan mulus. Namun begitu commit yang ditulis ulang menyentuh baris yang sama dengan basis barunya — main yang telah maju — rebase berhenti di tengah dengan penanda CONFLICT (content). Momen itu, cara membacanya, dan cara menuntaskannya hingga baris Successfully rebased kembali muncul, adalah materi penutup latihan bagian ini: Rebase Conflicts
.