Revert dan Reset sama-sama membatalkan perubahan yang sudah ter-commit, dan hasil akhirnya di working tree bisa persis sama: berkas yang tidak diinginkan lenyap. Nasib riwayatnya justru berlawanan total — revert menambah satu commit pembalik sehingga riwayat jujur mencatat pembatalan itu, sedangkan reset menggeser pointer sehingga riwayat ditulis ulang seolah perubahan tak pernah terjadi. Satu pertanyaan sederhana memutuskan pilihan: apakah commit itu sudah dibagikan ke orang lain. Chapter ini membangun alur keputusannya, membandingkan keduanya lintas dimensi, lalu membuktikan dua jalur pada kasus yang sama persis.
Satu Pertanyaan Penentu: Sudah Di-push? #
Riwayat yang masih lokal adalah milik kita sendiri — bebas ditulis ulang kapan pun tanpa ada yang dirugikan. Riwayat yang sudah di-push ke branch yang dipakai bersama berubah status menjadi milik bersama: setiap penulisan ulang membuat hash commit berubah, dan rekan yang memegang hash lama mendadak membaca sejarah yang berbeda dari milik kita. Alur keputusannya ringkas:
Kedua cabang “tidak” di diagram bermuara ke reset karena riwayatnya belum menjadi acuan orang lain. Cabang “ya” bermuara ke revert karena satu-satunya cara membatalkan tanpa merusak acuan itu adalah menambah commit baru di atasnya.
Perbandingan Lintas Dimensi #
| Dimensi | git revert | git reset |
|---|---|---|
| Nasib riwayat | dipertahankan; bertambah satu commit pembalik | ditulis ulang; commit tertinggal di belakang pointer |
| Hash commit lama | tetap sama, tetap dirujuk | commit di atas target hilang dari branch |
| Aman untuk branch shared | ya — hanya menambah commit | tidak — rekan kehilangan acuan riwayat |
| Perlu force push | tidak | ya, bila riwayat lama sudah di-push |
| Momen tepat | pembatalan pasca-push, kebutuhan jejak audit | kerapian riwayat lokal, branch pribadi |
Baris “aman untuk branch shared” adalah kunci seluruh perbandingan. Revert hanya menambah, sehingga rekan tinggal menarik satu commit baru lewat pull biasa. Reset menghilangkan, sehingga sinkronisasi berikutnya menuntut push yang memaksa menimpa riwayat remote — dan itulah pintu menuju kerusakan yang dibahas di Aturan Aman Mengubah Riwayat . Rincian opsi kedua perintah terdokumentasi di git-revert dan git-reset .
Kasus yang Sama, Dua Jalur #
Pengukuran paling jujur dilakukan pada kasus identik di dua repositori kembar. Keduanya menampung tiga commit, dan debug.md yang tak sengaja ter-commit menjadi sasaran pembatalan:
mkdir latihan-vs-reset && cd latihan-vs-reset
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 'faq\n' > faq.md
git add faq.md
git commit -m "Tambah halaman faq"
printf 'debug: true\n' > debug.md
git add debug.md
git commit -m "Tambah config debug"
git log --onelineOutput yang Dihasilkan:
e59c4f0 Tambah config debug
52b4574 Tambah halaman faq
b5aed5b Buat halaman berandaJalur Reset #
Riwayat ini belum pernah di-push, jadi reset boleh dipakai tanpa korban:
git reset --hard HEAD~1Output yang Dihasilkan:
HEAD is now at 52b4574 Tambah halaman faqgit log --onelineOutput yang Dihasilkan:
52b4574 Tambah halaman faq
b5aed5b Buat halaman berandagit ls-filesOutput yang Dihasilkan:
faq.md
situs.mdTambah config debug lenyap dari riwayat, debug.md lenyap dari index — dua commit tersisa, seolah berkas debug tidak pernah dibuat.
Jalur Revert #
Buat repositori kembar kedua dengan blok yang sama — cukup ganti namanya menjadi latihan-vs-revert — lalu dari keadaan tiga commit yang identik, tempuh jalur kedua (editor pesan terbuka berisi pesan default; simpan lalu tutup untuk menerimanya):
git revert HEADOutput yang Dihasilkan:
[main 894ecc0] Revert "Tambah config debug"
Date: Fri Oct 23 11:30:00 2026 +0700
1 file changed, 1 deletion(-)
delete mode 100644 debug.mdgit log --onelineOutput yang Dihasilkan:
894ecc0 Revert "Tambah config debug"
e59c4f0 Tambah config debug
52b4574 Tambah halaman faq
b5aed5b Buat halaman berandagit ls-filesOutput yang Dihasilkan:
faq.md
situs.mdBandingkan kedua hasilnya. git ls-files mencetak baris yang sama persis — faq.md dan situs.md — jadi hasil kerjanya identik: debug.md hilang di keduanya. Riwayatnya yang terbelah: jalur reset menyisakan dua commit tanpa jejak debug, jalur revert menyisakan empat commit yang jujur mencatat Tambah config debug dan pembatalannya. Tidak ada yang lebih benar — keduanya menyelesaikan masalah; yang menentukan pilihan adalah apakah jejak itu perlu dipertahankan untuk dibaca orang lain.
Membagi Peran di Kolaborasi #
Pekerjaan nyata jarang murni satu jalur. Skenario campurannya: main yang sudah di-push ke remote dipakai bersama, sementara branch fitur pribadi masih berisi eksperimen yang belum dibagikan. Kedua alat dipakai di kolamnya masing-masing:
mkdir latihan-campuran && cd latihan-campuran
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 kerangka situs"
printf 'debug: true\n' > debug.md
git add debug.md
git commit -m "Tambah config debug"
git init --bare ../toko-d.git
git remote add origin ../toko-d.git
git push -u origin main
git switch -c fitur
printf 'tombol simpan\n' > tombol.md
git add tombol.md
git commit -m "Eksperimen tombol"
printf 'catatan coba\n' > catatan.md
git add catatan.md
git commit -m "Catatan coba"
git log --oneline --graph --allOutput yang Dihasilkan:
* ed8d346 Catatan coba
* 3300b18 Eksperimen tombol
* 309a253 Tambah config debug
* 1596c04 Buat kerangka situsmain — lengkap dengan debug.md yang ingin dicabut — sudah berada di remote, jadi pembatalannya harus lewat revert. Branch fitur masih lokal, jadi percobaan gagalnya cukup dibuang dengan reset. Tuntaskan yang pribadi dulu, buang Catatan coba dari fitur:
git reset --hard HEAD~1Output yang Dihasilkan:
HEAD is now at 3300b18 Eksperimen tombolgit log --onelineOutput yang Dihasilkan:
3300b18 Eksperimen tombol
309a253 Tambah config debug
1596c04 Buat kerangka situsfitur kembali bersih dengan dua commit. Kembali ke main dan balikkan config debug lewat revert:
git switch main
git revert HEADOutput yang Dihasilkan:
[main ecc956c] Revert "Tambah config debug"
Date: Fri Oct 23 12:05:00 2026 +0700
1 file changed, 1 deletion(-)
delete mode 100644 debug.mdgit log --oneline --graph --allOutput yang Dihasilkan:
* ecc956c Revert "Tambah config debug"
| * 3300b18 Eksperimen tombol
|/
* 309a253 Tambah config debug
* 1596c04 Buat kerangka situsHasil akhirnya: main membawa commit pembalik yang bisa ditarik seluruh rekan lewat pull biasa, sementara fitur bersih dari eksperimen yang gagal — setiap alat bekerja di wilayah yang memang diperbolehkan baginya.
Reset di branch yang ternyata shared menuntut langkah yang selama ini sengaja kita hindari: menimpa riwayat remote dengan force push. Apa yang sebenarnya hancur saat tombol itu ditekan, dan aturan emas yang mencegahnya, adalah pokok bahasan chapter penutup section ini — Aturan Aman Mengubah Riwayat .