Begitu sebuah commit terbukti salah — banner promosi yang seharusnya belum tayang, config debug yang ikut ter-commit — refleks pertama banyak orang adalah menghapus commit itu dari riwayat. Padahal bila branch dipakai bersama, penghapusan berarti menulis ulang sejarah yang sudah dibagikan. git revert menawarkan jalan ketiga: membuat commit baru yang isinya kebalikan dari commit bermasalah. Riwayat bertambah dua baris — commit asli tetap utuh, plus pembaliknya — dan hasil akhirnya seolah perubahan itu tidak pernah terjadi. Chapter ini menjalankannya nyata pada commit biasa, commit merge, dan rentang commit.
Membalik Satu Commit #
Repositori latihannya sederhana: tiga commit, dan commit tengah (Tambah banner promosi) adalah yang ingin dibatalkan:
mkdir latihan-revert && cd latihan-revert
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'beranda\n' > situs.md
git add situs.md
git commit -m "Buat halaman beranda"
printf 'promo diskon\n' > banner.md
git add banner.md
git commit -m "Tambah banner promosi"
printf 'faq\n' > faq.md
git add faq.md
git commit -m "Tambah halaman faq"
git log --onelineOutput yang Dihasilkan:
62edaf3 Tambah halaman faq
ca0268f Tambah banner promosi
719b6be Buat halaman berandaCommit banner berada di tengah riwayat — hash-nya ca0268f di mesin kita (salin hash dari git log milik Anda). Balikkan dengan git revert; editor pesan terbuka berisi pesan default — simpan lalu tutup untuk menerimanya:
git revert ca0268fOutput yang Dihasilkan:
[main 921e017] Revert "Tambah banner promosi"
Date: Thu Oct 22 09:20:00 2026 +0700
1 file changed, 1 deletion(-)
delete mode 100644 banner.mdBaris [main 921e017] Revert "Tambah banner promosi" mengumumkan commit pembalik lahir; diffstat-nya persis kebalikan commit asli — 1 file changed, 1 deletion(-) plus delete mode 100644 banner.md. Pesan defaultnya bisa dilihat utuh dari commit hasilnya:
git log -1 --format=%BOutput yang Dihasilkan:
Revert "Tambah banner promosi"
This reverts commit ca0268f58b36e3d2bd977726844007706153e8fb.Git menyusun pesan Revert "<judul asli>" disusul satu kalimat This reverts commit <hash>. — jejak bolak-balik yang mudah ditelusuri. Riwayat hasilnya:
git log --onelineOutput yang Dihasilkan:
921e017 Revert "Tambah banner promosi"
62edaf3 Tambah halaman faq
ca0268f Tambah banner promosi
719b6be Buat halaman berandagit ls-filesOutput yang Dihasilkan:
faq.md
situs.mdEmpat commit kini terurut: revert di atas, commit asli tetap ada di baris ketiga, dan banner.md hilang dari daftar berkas terlacak. Inilah dua wajah revert sekaligus — isi working tree bersih dari perubahan itu, sementara riwayatnya justru jujur mencatat bahwa pernah ada dan dibatalkan. Karena hanya menambah commit, revert aman dijalankan pada branch shared: rekan yang sudah menarik riwayat lama tinggal menarik satu commit baru, tanpa konflik sejarah.
Membalik Merge Commit dengan -m 1 #
Merge commit menimbulkan pertanyaan khusus: commit pembalik harus tahu dibalik ke arah mana — ke keadaan sebelum merge di branch tujuan, atau ke keadaan branch sumber? Itulah guna opsi -m (mainline): memilih nomor parent yang dijadikan acuan. Repositori keduanya:
mkdir latihan-revert-merge && cd latihan-revert-merge
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'beranda\n' > situs.md
git add situs.md
git commit -m "Buat halaman beranda"
git switch -c fitur
printf 'promo\n' > promo.md
git add promo.md
git commit -m "Tambah halaman promo"
git switch main
git merge --no-ff fitur -m "Gabungkan fitur promo"
printf 'tentang\n' > tentang.md
git add tentang.md
git commit -m "Tambah halaman tentang"
git log --oneline --graph --allOutput yang Dihasilkan:
* 2bca0ab Tambah halaman tentang
* b614292 Gabungkan fitur promo
|\
| * e18a990 Tambah halaman promo
|/
* d9c627a Buat halaman berandaMerge commit b614292 berparent dua — mari kita buka anatominya:
git show b614292Output yang Dihasilkan:
commit b614292b954ff93f991a3d4a87c66ca36514f179
Merge: d9c627a e18a990
Author: Budi Santoso <[email protected]>
Date: Thu Oct 22 09:50:00 2026 +0700
Gabungkan fitur promoBaris Merge: d9c627a e18a990 mendaftar kedua parent berurutan: parent 1 (d9c627a, Buat halaman beranda) adalah commit tempat kita berdiri saat merge — branch tujuan; parent 2 (e18a990, Tambah halaman promo) adalah ujung branch sumber yang digabungkan. -m 1 memerintahkan revert membalik merge relatif terhadap parent 1 — hasilnya keadaan seolah branch sumber tidak pernah digabung, sementara main tetap membawa commit-commit-nya sendiri. Balikkan merge-nya:
git revert -m 1 b614292Output yang Dihasilkan:
[main f8bebc1] Revert "Gabungkan fitur promo"
Date: Thu Oct 22 10:05:00 2026 +0700
1 file changed, 1 deletion(-)
delete mode 100644 promo.mdPesan defaultnya sedikit beda dari revert biasa:
git log -1 --format=%BOutput yang Dihasilkan:
Revert "Gabungkan fitur promo"
This reverts commit b614292b954ff93f991a3d4a87c66ca36514f179, reversing
changes made to d9c627a0516b4eb82dc43484ad564c06faaee912.Kalimatnya kini menyebut dua hash: commit merge yang dibalik, dan parent acuannya. Graf hasilnya:
git log --oneline --graph --allOutput yang Dihasilkan:
* f8bebc1 Revert "Gabungkan fitur promo"
* 2bca0ab Tambah halaman tentang
* b614292 Gabungkan fitur promo
|\
| * e18a990 Tambah halaman promo
|/
* d9c627a Buat halaman berandagit ls-filesOutput yang Dihasilkan:
situs.md
tentang.mdpromo.md lenyap dari working tree — isi branch fitur dibongkar dari main — padahal commit merge dan seluruh riwayatnya tetap terbaca di graf. Satu catatan penting untuk jangka panjang: setelah merge dibalik, Git menganggap perubahan fitur “sudah pernah masuk”. Bila kelak fitur itu ingin digabung ulang setelah diperbaiki, jalannya adalah membalik commit revert-nya terlebih dahulu (revert-of-revert), bukan merge langsung.
Membalik Rentang Commit #
Kadang yang salah bukan satu commit melainkan satu rentang. Sintaks rentangnya sama dengan cherry-pick — repositori ketiga berisi dua commit catatan yang keduanya ingin dibatalkan:
mkdir latihan-revert-rentang && cd latihan-revert-rentang
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'beranda\n' > situs.md
git add situs.md
git commit -m "Buat halaman beranda"
printf 'catatan a\n' > catatan-a.md
git add catatan-a.md
git commit -m "Tambah catatan A"
printf 'catatan b\n' > catatan-b.md
git add catatan-b.md
git commit -m "Tambah catatan B"
git revert HEAD~2..HEADOutput yang Dihasilkan:
[main 9d9e5a9] Revert "Tambah catatan B"
Date: Thu Oct 22 10:35:00 2026 +0700
1 file changed, 1 deletion(-)
delete mode 100644 catatan-b.md
[main 66b7ade] Revert "Tambah catatan A"
Date: Thu Oct 22 10:35:00 2026 +0700
1 file changed, 1 deletion(-)
delete mode 100644 catatan-a.mdDua commit pembalik lahir sekaligus — satu untuk tiap commit di rentang, diterapkan dari yang termuda supaya hasil akhirnya persis keadaan sebelum rentang dimulai. Editor pesan terbuka dua kali berturut (diterima apa adanya di latihan ini). Riwayat finalnya:
git log --onelineOutput yang Dihasilkan:
66b7ade Revert "Tambah catatan A"
9d9e5a9 Revert "Tambah catatan B"
f4988ee Tambah catatan B
db2606c Tambah catatan A
b9aca77 Buat halaman berandaRentang juga bisa dibalik menjadi satu commit tunggal dengan git revert --no-commit HEAD~2..HEAD lalu satu git commit — pola stage-saja yang sama dengan --no-commit milik cherry-pick.
Revert atau Reset #
Revert punya saingan tua yang bekerja dengan cara sama sekali berbeda: git reset memindahkan penunjuk branch ke belakang, seolah commit bermasalah tidak pernah ada. Tabel ringkasnya:
| Aspek | git revert | git reset |
|---|---|---|
| Riwayat | Bertambah — commit asli tetap tercatat | Ditulis ulang — commit tertinggal di belakang pointer |
| Branch shared | Aman — hanya menambah commit | Berbahaya — rekan kehilangan acuan riwayat |
| Kasus khas | Pembatalan yang perlu diaudit | Kerapian riwayat lokal yang belum dibagikan |
Detail pembandingnya dibedah tuntas di Reset , sementara perbandingan mendalam dua jalur itu menanti di Revert vs Reset .
Sebelum itu, mari turun ke mekanik git reset itu sendiri — tiga modenya memindahkan HEAD, index, dan working tree secara berbeda, dan perbedaan itu menentukan apakah pekerjaan kita selamat atau lenyap. Lanjut ke Reset
.