Mengubah commit

Mengubah commit terakhir dengan git commit --amend dan batasan keamanannya.

Daftar isi

Commit terakhir yang belum terkirim masih dapat diubah tanpa meninggalkan commit perbaikan, dan perintahnya adalah git commit --amend. Topik ini membahas dua pemakaian utamanya, yaitu memperbaiki pesan dan menyempurnakan isi, mekanika di balik pergantian hash-nya, dan batasan keamanannya yang menyatakan amend hanya untuk commit yang belum dibagikan.

Memperbaiki pesan commit terakhir#

Bentuk paling ringan dari amend hanya mengganti pesan commit terakhir. Isi snapshot tidak berubah sama sekali, tetapi pesan baru menghasilkan commit yang berbeda.

bash
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"
bash
rm -rf /tmp/lab-amend
mkdir /tmp/lab-amend
cd /tmp/lab-amend
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Pengaturan.\n" > app.txt
git add app.txt
git commit -m "Apa aja"
git commit --amend -m "Tambah kerangka pengaturan"
git log --oneline
text Keluaran
Initialized empty Git repository in /tmp/lab-amend/.git/
[main (root-commit) 326fd36] Apa aja
 1 file changed, 1 insertion(+)
 create mode 100644 app.txt
[main 6902c17] Tambah kerangka pengaturan
 Date: Sun Nov 1 09:00:00 2026 +0700
 1 file changed, 1 insertion(+)
 create mode 100644 app.txt
6902c17 Tambah kerangka pengaturan

Keluaran amend menampilkan commit baru dengan hash yang berbeda dari commit awalnya, dan git log hanya memuat satu commit, bukan dua. Tanpa opsi -m, amend membuka editor berisi pesan lama untuk disunting, dan cara ini nyaman untuk perbaikan pesan yang panjang.

Menyempurnakan isi commit terakhir#

Bentuk yang lebih sering dipakai adalah menyempurnakan isi: tambahkan perubahan pada staging area, lalu masukkan ke commit terakhir dengan --no-edit yang mempertahankan pesannya.

bash
printf "Pengaturan.\nTema gelap.\n" > app.txt
git add app.txt
git commit --amend --no-edit
git show --stat --oneline HEAD
text Keluaran
[main f178cf5] Tambah kerangka pengaturan
 Date: Sun Nov 1 09:00:00 2026 +0700
 1 file changed, 2 insertions(+)
 create mode 100644 app.txt
f178cf5 Tambah kerangka pengaturan
 app.txt | 2 ++
 1 file changed, 2 insertions(+)

Commit hasilnya kini memuat dua baris sejak awal, seolah-olah kelalaian pertama tidak pernah terjadi. Diffstat yang menunjukkan dua baris sekaligus memperlihatkan bahwa kedua penyuntingan menyatu dalam satu commit. Pola ini menjaga riwayat tetap bersih dari commit perbaikan seperti perbaiki commit sebelumnya, yang membuat riwayat berisik tanpa nilai tambah.

Mengapa hash berubah#

Amend tidak menyunting commit lama, melainkan membuat commit baru dengan isi gabungan dan memindahkan penunjuk branch ke commit baru itu. Objek commit lama tetap ada untuk sementara dan dapat ditemukan melalui reflog, tetapi ia sudah tidak ditunjuk branch mana pun. Perilaku ini adalah konsekuensi langsung dari model hash yang tidak dapat diubah, sebagaimana dijelaskan pada pembahasan anatomi commit, sehingga setiap amend pasti menghasilkan hash baru.

Konsekuensi inilah yang menetapkan batas keamanannya. Amend yang dijalankan sebelum commit dikirim hanya menggeser riwayat lokal, sedangkan amend setelah terkirim membuat riwayat yang bertentangan dengan yang dimiliki orang lain, dan pengguna yang sudah menariknya akan mengalami kebingungan pada saat sinkronisasi.

Kapan amend tepat#

Amend tepat pada dua keadaan, yaitu melengkapi commit terakhir yang belum terkirim dan memperbaiki pesannya sebelum dibagikan. Di luar kedua keadaan itu, kebiasaan yang sehat adalah membuat commit baru, karena commit tambahan yang menyatakan maksudnya lebih jujur daripada penyembunyian kesalahan. Perhatikan pula bahwa amend hanya menjangkau commit terakhir, sehingga perbaikan pada commit yang lebih tua memerlukan rebase interaktif yang dibahas pada modul penulisan ulang riwayat.

Memeriksa hasil amend#

Karena amend membuat commit baru, pemeriksaan sesudahnya memakai perintah pemeriksaan biasa. git show --stat menampilkan isi commit hasilnya, dan git status menyatakan staging area yang kembali kosong karena isinya sudah dibawa commit.

bash
git status -s
git show --oneline --stat HEAD
text Keluaran
f178cf5 Tambah kerangka pengaturan
 app.txt | 2 ++
 1 file changed, 2 insertions(+)

Status kosong dan diffstat yang memuat seluruh isi menyatakan amend tuntas dengan sempurna. Amend berulang pada commit yang sama juga sah, misalnya menyempurnakan pesan dua kali sebelum terkirim, dan setiap amend hanya menggeser penunjuk branch pada riwayat lokal.

Alternatif: commit perbaikan tersendiri#

Amend bukan satu-satunya jalan menyelesaikan kelalaian, dan commit perbaikan tersendiri kadang justru lebih tepat. Pada pekerjaan yang commitnya sudah terkirim ke branch bersama, commit baru yang menyatakan maksudnya memelihara riwayat yang dimiliki semua orang. Pada pekerjaan yang sedang ditinjau orang lain, commit perbaikan memudahkan pemeriksa melihat apa yang berubah sejak tinjauan sebelumnya, alih-alih membaca ulang seluruh commit.

Kriteria penentuannya sederhana dan bergantung pada satu pertanyaan, yaitu apakah riwayat commit tersebut sudah dipakai orang lain. Apabila belum, amend menyimpan riwayat tetap bersih, dan apabila sudah, commit perbaikan menyimpan kenyataan tetap jujur. Kedua pilihan ini bukan tandingan yang salah satu harus kalah, melainkan alat yang dipilih sesuai tahap kehidupan sebuah commit.

Ringkasan#

  • git commit --amend -m mengganti pesan commit terakhir, dan --no-edit memasukkan isi staging ke dalamnya tanpa mengubah pesan.
  • Amend membuat commit baru dan memindahkan penunjuk branch, sehingga hash selalu berubah.
  • Amend hanya tepat untuk commit yang belum terkirim, sedangkan setelah terkirim ia berarti menulis ulang riwayat bersama.
  • Untuk perbaikan pada commit yang lebih tua, alat yang tepat adalah rebase interaktif, bukan amend.

Referensi#