git revert: Membatalkan dengan Aman
Membatalkan commit yang sudah di-push tanpa menulis ulang riwayat.
Kenapa reset tidak cocok untuk yang sudah di-push
Kamu push commit ke branch tim, ternyata bikin bug. Refleks pertama: git reset --hard lalu force push, commit jahatnya hilang, beres kan?
Masalahnya, tiga temanmu SUDAH pull commit itu pagi tadi. Waktu kamu force push, riwayat remote berubah total dan laptop mereka pegang riwayat "palsu" yang tidak cocok lagi. Mereka harus beresin manual, dan salah langkah bisa merusak kerjaan mereka juga. Di repo bersama, menulis ulang riwayat yang sudah dishare itu dosa besar.
Makanya git revert diciptakan: untuk membatalkan commit yang sudah dilihat orang lain TANPA menghapus riwayat. Ia tidak menghapus commit lama, melainkan membuat commit BARU yang isinya kebalikan dari commit target. Semua orang tinggal pull seperti biasa, tidak ada yang kacau.
Contoh 1: revert satu commit
Lihat dulu riwayatnya:
git log --oneline -3d4e5f6a Tambah fitur X (ternyata bug)
c3d2e1f Commit bagus
b7a8c9d Commit bagus lainnya
Commit d4e5f6a ternyata bermasalah. Batalkan dengan revert:
git revert d4e5f6aGit membuka editor untuk pesan commit, lalu hasilnya:
git log --oneline -3e7a8b9c Revert "Tambah fitur X"
d4e5f6a Tambah fitur X (ternyata bug)
c3d2e1f Commit bagus
Commit jahatnya TIDAK hilang; riwayat tetap jujur. Tidak perlu force push, tidak ada yang beresin manual. Push seperti biasa, selesai.
Contoh 2: revert beberapa commit sekaligus
Kadang yang rusak bukan satu commit, tapi rangkaian. Kamu bisa revert rentang commit:
git revert c3d2e1f..d4e5f6a[main f1a2b3c] Revert "Tambah fitur X"
[main g4h5i6j] Revert "Commit bagus"
Git membuat satu commit revert per commit target, urut dari terbaru. Mau digabung jadi satu? Tambah --no-commit:
git revert --no-commit c3d2e1f..d4e5f6a
git status --shortM src/fitur.js
M src/util.js
Semua pembatalan masuk staging tanpa commit. Periksa dulu, lalu commit manual dengan pesanmu sendiri.
Kalau revert menimbulkan konflik (kode sudah banyak berubah sejak commit target), itu normal. Selesaikan seperti konflik merge biasa, lalu lanjutkan commit.
Reset vs revert: tabel keputusan
| Situasi | Pakai |
|---|---|
| Commit belum di-push, milikmu sendiri | reset |
| Commit sudah di-push ke branch bersama | revert |
| Ingin riwayat bersih tanpa jejak | reset (lokal saja) |
| Ingin jejak audit yang jujur | revert |
Catatan teknis: revert bisa gagal otomatis kalau commit target sudah "terkubur" di bawah perubahan lain (konteksnya tidak cocok lagi). Itu normal, resolve saja konfliknya. Satu lagi: jangan revert merge commit tanpa flag
-m(misalnya-m 1untuk memilih parent utama), karena Git butuh tahu "kembali ke sisi yang mana".
Kapan memakai revert?
Setiap kali kamu butuh membatalkan sesuatu yang sudah dilihat orang lain: bug yang terlanjur rilis, fitur yang ditarik kembali, atau commit yang salah push ke main. Revert adalah cara sopan berkata "maaf, kita batalkan" tanpa merusak kerjaan tim.
Kesalahan umum pemula
SALAH: revert merge commit tanpa flag -m.
git revert a1b2c3d # a1b2c3d adalah merge commiterror: commit a1b2c3d is a merge but no -m option was given.
fatal: revert failed
Merge commit punya dua parent, jadi Git bingung mau kembali ke sisi yang mana. Kamu harus kasih tahu: git revert -m 1 a1b2c3d (angka 1 berarti parent pertama, biasanya branch utama).
BENAR: pahami dulu commit apa yang mau dibatalkan.
git log --oneline --graph -3 # cek: commit biasa atau merge?
git revert -m 1 a1b2c3d # kalau merge commit, pakai -mKesalahan kedua: panik lalu revert commit yang salah karena tidak baca hash teliti. Selalu cek git log dan git show <hash> dulu, karena revert yang salah harus di-revert lagi.
Tantangan
Batalkan tanpa jejak hilang
Buat commit 'Tambah fitur rahasia', lalu revert dengan git revert HEAD. Jalankan git log --oneline -3 dan git show HEAD --stat. Tulis: commit apa saja yang terlihat, dan apa isi commit revert-nya?
Kuis Bab
Uji pemahamanmu: Remote & Penyelamatan
Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".
1.Apa arti flag '-u' pada 'git push -u origin main'?
2.Perbedaan git fetch dan git pull adalah...
3.Kapan git stash dipakai?
4.git reset --hard berbahaya karena...
5.Commit yang SUDAH di-push ke branch tim ternyata bug. Cara membatalkan yang benar?