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:

bash
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:

text
[main (root-commit) 7b03cbc] Tambah denftar pengumuman
 1 file changed, 2 insertions(+)
 create mode 100644 pengumuman.txt

denftar sudah tercetak dengan hash 7b03cbc. Riwayat sebelum dibereskan:

bash
git log --oneline

Output yang Dihasilkan:

text
7b03cbc Tambah denftar pengumuman

Sekarang kita perbaiki pesannya:

bash
git commit --amend -m "Tambah daftar pengumuman"

Output yang Dihasilkan:

text
[main 9462b67] Tambah daftar pengumuman
 Date: Tue Oct 13 09:00:00 2026 +0700
 1 file changed, 2 insertions(+)
 create mode 100644 pengumuman.txt

Hash berubah dari 7b03cbc menjadi 9462b67. Baris Date: yang ikut tampil adalah waktu author yang dipertahankan — pembahasan menyusul di bagian bawah. Riwayat sesudahnya:

bash
git log --oneline

Output yang Dihasilkan:

text
9462b67 Tambah daftar pengumuman

Satu 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:

bash
git cat-file -p HEAD

Output yang Dihasilkan:

text
tree 57eebab37a3f479ed3520807a859d0bdcbbb62d2
author Budi Santoso <[email protected]> 1791856800 +0700
committer Budi Santoso <[email protected]> 1791857400 +0700

Tambah daftar pengumuman

Penulis 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:

bash
git log --format=fuller -1

Output yang Dihasilkan:

text
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 pengumuman

Pola 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:

bash
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-edit

Output yang Dihasilkan:

text
[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.txt

Hash berubah lagi — kini 36da5f2 — dan ringkasannya memperlihatkan hasil penggabungannya: dua berkas dalam satu commit. Kita pastikan isinya:

bash
git log -1 --stat

Output yang Dihasilkan:

text
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:

bash
git log --oneline

Output yang Dihasilkan:

text
36da5f2 Tambah daftar pengumuman

Amend pada Commit Root #

Commit pertama juga bisa di-amend. Karena root commit tidak memiliki parent, hasilnya tetap root commit — repository latihan kecil membuktikannya:

bash
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:

text
[main (root-commit) 5be0604] Tambah README projct
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

Typo projct diperbaiki dengan cara yang sama:

bash
git commit --amend -m "Tambah README proyek"

Output yang Dihasilkan:

text
[main cc2bf11] Tambah README proyek
 Date: Tue Oct 13 09:00:00 2026 +0700
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

Objek hasilnya tetap tanpa parent:

bash
git cat-file -p HEAD

Output yang Dihasilkan:

text
tree 14e2dc3b22eff23f0e1a3b82b68f429b3706999c
author Budi Santoso <[email protected]> 1791856800 +0700
committer Budi Santoso <[email protected]> 1791857100 +0700

Tambah README proyek

Baris 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 .