Chapter Opsi git commit
berakhir pada satu kejutan: --amend mengubah hash 6a43904 menjadi 1cc9e70 padahal isinya cuma dikoreksi satu kata. Kecelakaan sesaat setelah commit memang dua pola klasik — pesan salah ketik, dan berkas yang terlewat dari staging — dan git commit --amend adalah obat resminya. Namah opsi ini menjanjikan “perbaiki”, padahal yang terjadi di dalam database jauh lebih radikal: commit lama diganti objek baru, identitasnya berubah total, dan semua itu aman hanya selama commit lama belum dibagikan ke orang lain. Chapter ini membedah seluruh mekanisme itu dengan keluaran nyata.
Commit Tidak Bisa Disunting — Diganti #
Objek Git bersifat permanen: isi sebuah commit tidak pernah diubah di tempat, karena hash adalah sidik jari seluruh isinya — ingat pembahasan Anatomi Commit . Pesan yang berubah berarti hash yang berubah, jadi “memperbaiki pesan” hanya bisa dilakukan dengan membuat objek baru yang menggantikan posisi commit lama. Kita buat kecelakaannya di repository pengumuman:
mkdir latihan-amend && cd latihan-amend
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'Pengumuman pekan ini:\n- rapat evaluasi Senin\n' > pengumuman.txt
git add pengumuman.txt
git commit -m "Tambah denftar pengumuman"Output yang Dihasilkan:
[main (root-commit) 7b03cbc] Tambah denftar pengumuman
1 file changed, 2 insertions(+)
create mode 100644 pengumuman.txtdenftar sudah tercetak dengan hash 7b03cbc. Riwayat sebelum dibereskan:
git log --onelineOutput yang Dihasilkan:
7b03cbc Tambah denftar pengumumanSekarang kita perbaiki pesannya:
git commit --amend -m "Tambah daftar pengumuman"Output yang Dihasilkan:
[main 9462b67] Tambah daftar pengumuman
Date: Tue Oct 13 09:00:00 2026 +0700
1 file changed, 2 insertions(+)
create mode 100644 pengumuman.txtHash berubah dari 7b03cbc menjadi 9462b67. Baris Date: yang ikut tampil adalah waktu author yang dipertahankan — pembahasan menyusul di bagian bawah. Riwayat sesudahnya:
git log --onelineOutput yang Dihasilkan:
9462b67 Tambah daftar pengumumanSatu commit, bukan dua: riwayat tidak bertambah, melainkan ditulis ulang. Mekanismenya: Git membuat objek commit baru dengan tree yang sama, parent yang sama, dan pesan yang benar; branch main lalu dipindahkan agar menunjuk objek baru itu. Commit lama 7b03cbc terputus dari riwayat.
AuthorDate Dipertahankan, CommitDate Diperbarui #
Amend mengambil author dari commit lama apa adanya, tetapi committer diambil baru: identitas dari konfigurasi lokal, dan waktunya dari saat amend dijalankan. Kedua penanda itu terlihat langsung pada objek mentah:
git cat-file -p HEADOutput yang Dihasilkan:
tree 57eebab37a3f479ed3520807a859d0bdcbbb62d2
author Budi Santoso <[email protected]> 1791856800 +0700
committer Budi Santoso <[email protected]> 1791857400 +0700
Tambah daftar pengumumanPenulis tetap 09:00:00 — commit asli dibuat jam sembilan. Pencatat menjadi 09:10:00 — pukul sembilan sepuluh commit baru ditulis. Perbedaan kedua waktu itu juga tampil rapi dalam format fuller:
git log --format=fuller -1Output yang Dihasilkan:
commit 9462b6799c24eeb929a0f719e13f5a2a6da34d96
Author: Budi Santoso <[email protected]>
AuthorDate: Tue Oct 13 09:00:00 2026 +0700
Commit: Budi Santoso <[email protected]>
CommitDate: Tue Oct 13 09:10:00 2026 +0700
Tambah daftar pengumumanPola ini jujur secara historis: riwayat tetap menghormati kapan perubahan aslinya ditulis, sambil mencatat kapan versi commit ini dibuat. Perilaku yang sama berlaku pada --author dan --date dari chapter Opsi git commit
dan pada commit yang dipindahkan lewat cherry-pick maupun rebase.
Menambahkan Berkas yang Terlewat #
Pola kecelakaan kedua: commit sudah dibuat, lalu kita sadar satu suntingan dan satu berkas lampiran tidak ikut. Solusinya: sunting dan stage seperti biasa, lalu amend dengan --no-edit agar pesan tidak perlu ditulis ulang:
printf 'Pengumuman pekan ini:\n- rapat evaluasi Senin\n- demo produk Kamis\n' > pengumuman.txt
printf 'Lampiran: rapat evaluasi membahas hasil sprint.\n' > pengumuman-lampiran.txt
git add pengumuman.txt pengumuman-lampiran.txt
git commit --amend --no-editOutput yang Dihasilkan:
[main 36da5f2] Tambah daftar pengumuman
Date: Tue Oct 13 09:00:00 2026 +0700
2 files changed, 4 insertions(+)
create mode 100644 pengumuman-lampiran.txt
create mode 100644 pengumuman.txtHash berubah lagi — kini 36da5f2 — dan ringkasannya memperlihatkan hasil penggabungannya: dua berkas dalam satu commit. Kita pastikan isinya:
git log -1 --statOutput yang Dihasilkan:
commit 36da5f236c21bc8db99c5f63305815ee6543f72a
Author: Budi Santoso <[email protected]>
Date: Tue Oct 13 09:00:00 2026 +0700
Tambah daftar pengumuman
pengumuman-lampiran.txt | 1 +
pengumuman.txt | 3 +++
2 files changed, 4 insertions(+)Snapshot akhir memuat pengumuman.txt versi terbaru dan pengumuman-lampiran.txt yang tadinya terlewat, dengan pesan dan waktu author yang sama. Satu catatan penting: hanya suntingan yang di-staging yang masuk — git commit --amend --no-edit tidak menyedot perubahan yang masih di working tree, jadi git add selalu tetap menjadi gerbangnya. Riwayat akhir repo masih satu commit utuh:
git log --onelineOutput yang Dihasilkan:
36da5f2 Tambah daftar pengumumanAmend pada Commit Root #
Commit pertama juga bisa di-amend. Karena root commit tidak memiliki parent, hasilnya tetap root commit — repository latihan kecil membuktikannya:
mkdir latihan-amend-root && cd latihan-amend-root
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Proyek Latihan Amend\n' > README.md
git add README.md
git commit -m "Tambah README projct"Output yang Dihasilkan:
[main (root-commit) 5be0604] Tambah README projct
1 file changed, 1 insertion(+)
create mode 100644 README.mdTypo projct diperbaiki dengan cara yang sama:
git commit --amend -m "Tambah README proyek"Output yang Dihasilkan:
[main cc2bf11] Tambah README proyek
Date: Tue Oct 13 09:00:00 2026 +0700
1 file changed, 1 insertion(+)
create mode 100644 README.mdObjek hasilnya tetap tanpa parent:
git cat-file -p HEADOutput yang Dihasilkan:
tree 14e2dc3b22eff23f0e1a3b82b68f429b3706999c
author Budi Santoso <[email protected]> 1791856800 +0700
committer Budi Santoso <[email protected]> 1791857100 +0700
Tambah README proyekBaris parent tidak muncul — commit hasil amend tetap menjadi akar riwayat, hanya dengan pesan yang benar dan committer yang diperbarui.
Amend menuntaskan masalah “sesaat setelah commit”. Masalah berikutnya hidup lebih lama: riwayat yang terus bertambah dan beragam penulis — dan cara menyaringnya agar pertanyaan “commit apa saja dari Siti bulan ini?” terjawab dalam satu perintah. Jawabannya ada di chapter Opsi git log .