Reset atau Revert di Git Kapan Kamu Pakai Yang Mana

Reset atau Revert di Git Kapan Kamu Pakai Yang Mana
Photo by Alexander Dobry/Unsplash

Belajar ngoding itu seru banget ya, tapi kadang bikin pusing juga. Apalagi pas udah mainan sama Git, sistem buat ngatur versi kode kita. Pasti pernah dong ngerasain salah commit, salah push, atau tiba-tiba pengen balik ke kondisi kode yang sebelumnya? Nah, di Git itu ada dua jurus sakti buat "undo" alias membatalkan perubahan: git reset dan git revert. Sekilas mirip, tapi beda banget fungsinya dan kapan kita harus pakai. Jangan sampai salah pilih, karena akibatnya bisa fatal, apalagi kalau udah main di repository yang dipakai bareng sama temen-temen tim.

Daripada bingung, yuk kita kupas tuntas apa bedanya reset sama revert ini, biar kamu tahu kapan harus pakai yang mana. Intinya, dua-duanya buat "mengembalikan" atau "membatalkan", tapi cara kerjanya beda 180 derajat.

Kenalan Sama git reset: Si Penghapus Jejak

Bayangin gini, kamu lagi nulis buku catatan (kode kamu), terus udah nulis beberapa halaman (commit). Ternyata di beberapa halaman terakhir, kamu bikin kesalahan fatal. Kamu pengen halaman-halaman yang salah itu nggak pernah ada di buku catatanmu. Nah, diibaratkan gitu, git reset ini kayak penghapus ajaib yang bisa bikin beberapa halaman terakhir di buku catatanmu hilang, seolah-olah nggak pernah ditulis.

Secara teknis, git reset itu tugas utamanya adalah mengubah posisi HEAD (pointer yang nunjukin commit kita lagi di mana) dan opsional mengubah posisi pointer branch kita. Dia juga bisa mengubah staging area (indeks) dan working directory (folder kode kamu) sesuai dengan commit yang kamu tuju.

Yang penting diingat dari git reset adalah: dia mengubah sejarah commit. Commit-commit setelah commit yang kamu reset ke sana, bisa jadi "hilang" dari sejarah branch kamu (walaupun sebenarnya masih ada di reflog, tapi kita bahas nanti). Makanya, reset ini sering dibilang "destruktif" atau bisa menghapus jejak.

Ada beberapa mode git reset yang perlu kamu tahu:

  1. git reset --soft [commit-hash]: Ini mode yang paling 'lembut'.

* Dia cuma mindahin pointer HEAD dan branch kamu ke commit yang kamu tentukan. Staging area (index) tidak berubah*. Isi staging area tetap sama kayak sebelum di-reset. Working directory (folder kode kamu) tidak berubah*. File-file di folder kamu tetap sama. Efeknya: Semua perubahan yang ada di commit-commit setelah commit yang kamu reset ke sana, sekarang jadi changes to be committed* (ada di staging area). Cocok banget kalau kamu mau menggabungkan beberapa commit terakhir jadi satu commit aja.

  1. git reset --mixed [commit-hash] (Ini mode default kalau kamu cuma nulis git reset [commit-hash] tanpa --soft atau --hard): Ini mode 'sedang'.

* Dia mindahin pointer HEAD dan branch kamu ke commit yang kamu tentukan. Staging area (index) berubah*, di-reset biar sama isinya dengan commit yang kamu tuju. Working directory (folder kode kamu) tidak berubah*. File-file di folder kamu tetap sama. Efeknya: Semua perubahan yang ada di commit-commit setelah commit yang kamu reset ke sana, sekarang jadi unstaged changes* (muncul di git status di bagian "Changes not staged for commit"). Ini mode yang paling sering dipakai buat "membatalkan" commit-commit terakhir dan bikin perubahan tersebut jadi file yang belum di-add atau di-commit lagi.

  1. git reset --hard [commit-hash]: Nah, ini mode yang paling 'keras' dan berbahaya kalau nggak hati-hati.

* Dia mindahin pointer HEAD dan branch kamu ke commit yang kamu tentukan. Staging area (index) berubah*, di-reset biar sama isinya dengan commit yang kamu tuju. Working directory (folder kode kamu) berubah*, di-reset biar sama persis dengan kondisi file di commit yang kamu tuju. * Efeknya: Semua perubahan yang ada di commit-commit setelah commit yang kamu reset ke sana, akan hilang permanen dari staging area dan working directory kamu. File-file yang baru dibuat di commit setelahnya juga akan dihapus. POKOKNYA HATI-HATI BANGET PAKE INI! Cuma pakai kalau kamu yakin 1000% mau membuang semua perubahan terakhir dan kembali ke titik bersih di commit tertentu.

Kapan Sih Paling Pas Pakai git reset?

git reset itu paling cocok dipakai buat membatalkan perubahan yang masih di lokal repository kamu alias belum kamu push ke repository remote yang dipakai bareng-bareng. Kenapa? Karena dia mengubah sejarah commit. Kalau kamu udah push commit ke remote, terus kamu reset branch lokal kamu dan push lagi, sejarah commit di remote sama di lokal jadi beda. Ini bisa bikin pusing tim kamu karena mereka harus nge-merge perubahan yang 'hilang' itu atau bahkan bisa merusak sejarah di remote.

Beberapa skenario ideal buat pakai git reset:

  • Membatalkan Staging File: Kalau kamu nggak sengaja git add file yang belum siap di-commit. Gampang, tinggal git reset HEAD. Ini defaultnya --mixed, jadi file kamu balik ke kondisi 'unstaged'.
  • Membatalkan Semua Staging: Kalau kamu udah git add . tapi ternyata banyak file yang nggak siap di-commit. Cukup git reset. Ini juga defaultnya --mixed, semua file yang ter-staging balik jadi unstaged.
  • Menggabungkan Beberapa Commit Terakhir: Misal kamu bikin 3 commit kecil-kecil (fix typo, add button, fix bug), tapi pengennya itu jadi satu commit yang rapi (feat: add user profile button). Kamu bisa pakai git reset --soft HEAD~3 (reset ke 3 commit sebelum HEAD). Setelah itu, semua perubahan dari 3 commit itu jadi 'changes to be committed'. Tinggal git commit --amend atau git commit -m "Pesan commit baru" buat bikin satu commit baru yang isinya gabungan 3 commit tadi.
  • Membuang Commit Terakhir (Lokal): Kalau commit terakhir kamu (atau beberapa commit terakhir) itu salah total dan kamu pengen ngulang dari commit sebelumnya. Pakai git reset --hard HEAD~1 buat membuang commit terakhir, atau git reset --hard [commit-hash] buat balik ke commit tertentu. INGAT, ini menghapus perubahan di local working directory juga!

Kelebihan git reset:

  • Cepat dan efisien buat membersihkan sejarah lokal.
  • Berguna banget buat merapikan commit sebelum di-push.
  • Mode --soft dan --mixed ngasih fleksibilitas buat mempertahankan perubahan di working directory atau staging area.

Kekurangan git reset:

  • Mengubah sejarah commit.
  • BERBAHAYA kalau dipakai di branch yang dipakai bareng dan sudah di-push, karena bisa bikin konflik dan membingungkan tim.
  • Mode --hard bisa bikin data/perubahan hilang permanen kalau nggak hati-hati.

Kenalan Sama git revert: Si Pengkompensasi

Kalau git reset itu kayak menghapus jejak, git revert ini beda. Bayangin lagi buku catatan tadi. Kamu udah nulis beberapa halaman dan ada kesalahan di halaman tertentu (commit tertentu). Kamu nggak bisa nyobek halaman itu karena udah telanjur dibaca orang lain (udah di-push ke remote). Solusinya gimana? Kamu bikin halaman baru (commit baru) yang isinya menjelaskan cara memperbaiki kesalahan yang ada di halaman sebelumnya.

Secara teknis, git revert itu tugas utamanya adalah membuat commit baru yang isinya membatalkan atau mengkompensasi perubahan yang ada di commit target. Commit targetnya sendiri tetap ada di sejarah. Sejarah commit kamu jadi bertambah, bukan berkurang atau berubah.

Yang penting diingat dari git revert adalah: dia tidak mengubah sejarah commit yang sudah ada. Dia cuma menambahkan commit baru. Makanya, revert ini sering dibilang "non-destruktif" atau aman.

Cara pakainya lumayan simpel:

git revert [commit-hash]: Ini akan membuat commit baru yang isinya membatalkan perubahan dari commit dengan hash tersebut. Git akan membuka editor teks buat kamu menulis pesan commit untuk commit revert* yang baru ini.

  • git revert [commit-hash-awal]..[commit-hash-akhir]: Ini akan membuat serangkaian commit baru, satu per satu, untuk membatalkan perubahan dari commit-commit di rentang yang kamu tentukan. Urutannya dari commit yang paling baru di rentang itu sampai yang paling lama.
  • git revert --no-commit [commit-hash]: Ini akan membatalkan perubahan dari commit target, tapi perubahannya cuma diletakkan di staging area. Kamu harus commit manual setelahnya. Berguna kalau kamu mau membatalkan beberapa commit sekaligus tapi digabung jadi satu commit revert aja.

Kapan Sih Paling Pas Pakai git revert?

git revert adalah jurus paling aman buat membatalkan perubahan yang sudah terlanjur kamu push ke repository remote yang dipakai bareng-bareng. Karena dia nggak mengubah sejarah commit yang sudah ada di remote, anggota tim lain yang sudah sync (pull) perubahan kamu nggak akan bingung. Mereka cuma akan melihat ada commit baru (commit revert) yang muncul di sejarah branch, dan ketika mereka pull, Git akan menggabungkan (merge) commit revert itu dengan aman.

Beberapa skenario ideal buat pakai git revert:

  • Membatalkan Commit Yang Sudah di-Push: Ini skenario paling umum. Kamu baru sadar commit terakhir atau commit beberapa hari lalu itu bikin error di staging/production, dan commit itu udah terlanjur di-push. Jangan pakai reset! Pakai git revert [hash-commit-error]. Ini akan bikin commit baru yang mengembalikan kode ke kondisi sebelum commit error itu.
  • Membatalkan Rentang Commit Yang Sudah di-Push: Kalau ada serangkaian commit yang bikin masalah dan udah ter-push. Kamu bisa revert satu per satu atau pakai rentang hash commit.
  • Mempertahankan Sejarah: Kalau tim kamu punya kebijakan untuk tidak pernah mengubah sejarah commit publik, git revert adalah satu-satunya pilihan buat membatalkan sesuatu.

Kelebihan git revert:

  • Aman buat dipakai di branch yang dipakai bareng-bareng (setelah di-push), karena tidak mengubah sejarah commit.
  • Menambah commit baru yang mendokumentasikan bahwa ada pembatalan dilakukan. Sejarah commit tetap utuh.
  • Tidak ada risiko kehilangan data di working directory atau staging area secara tidak sengaja.

Kekurangan git revert:

  • Menambah "sampah" di sejarah commit kalau terlalu sering dipakai (history jadi banyak commit revert).
  • Kadang proses revert bisa menimbulkan konflik merge, sama kayak kalau kamu merge branch lain. Ini terjadi kalau ada perubahan di commit-commit setelah commit target yang beririsan dengan perubahan yang mau dibatalkan oleh revert. Kamu harus menyelesaikan konflik ini secara manual.
  • Tidak cocok buat merapikan commit lokal sebelum di-push (untuk itu lebih baik pakai reset atau rebase interactive).

git reset VS git revert: Head to Head

Sekarang biar makin jelas, mari kita bandingkan langsung:

| Fitur Penting | git reset | git revert | | :---------------------- | :------------------------------------------- | :---------------------------------------------- | | Cara Kerja | Memindahkan pointer HEAD/branch, mengubah sejarah | Membuat commit baru yang membatalkan perubahan | | Mengubah Sejarah? | Ya (menghapus atau mengganti commit) | Tidak (hanya menambah commit baru) | | Cocok Untuk? | Membatalkan perubahan di lokal repository | Membatalkan perubahan di remote repository | | Commit Target | Commit target menjadi ujung branch baru | Commit target tetap ada di sejarah | | Kehilangan Data? | Bisa (terutama mode --hard) | Tidak (perubahan jadi unstaged/di commit baru) | | Aman di Branch Shared? | Tidak (setelah di-push) | Ya (setelah di-push) | | Hasil Akhir | Kode kembali ke kondisi commit target | Kode kembali ke kondisi sebelum commit target |

Jadi, Kapan Pakai Yang Mana? Kuncinya Dimana?

Kunci utamanya ada di pertanyaan ini: APAKAH PERUBAHAN YANG MAU KAMU BATALKAN ITU SUDAH TERLANJUR KAMU PUSH KE REPOSITORY YANG DIPAKAI BARENG TIM KAMU?

  • Kalau BELUM DI-PUSH (masih di lokal): Gunakan git reset. Ini cara paling bersih buat merapikan sejarah commit lokal kamu. Pilih mode (--soft, --mixed, --hard) sesuai dengan apa yang mau kamu lakukan dengan perubahannya (mau dijadikan staged, unstaged, atau dibuang total).
  • Kalau SUDAH DI-PUSH (di repository remote yang dipakai bareng): Gunakan git revert. Ini cara yang aman karena tidak mengubah sejarah yang sudah dilihat atau di-pull oleh anggota tim lain. Kamu akan menambah commit baru yang isinya membatalkan commit sebelumnya.

Tips Tambahan Biar Aman Main Undo:

  • Selalu git status dulu: Sebelum eksekusi reset atau revert, cek dulu kondisi repository kamu pakai git status. Pastikan kamu paham perubahan apa aja yang ada di working directory dan staging area.
  • Pahami mode reset: Jangan asal pakai --hard kalau kamu nggak yakin. Mode --mixed atau --soft jauh lebih aman karena perubahanmu nggak hilang dari working directory.
  • Hati-hati dengan reset --hard: Sekali lagi, mode ini menghapus segalanya di working directory kamu. Kalau ragu, backup dulu folder proyekmu atau pakai cara lain.
  • Pelajari git reflog: Ini adalah "jaring pengaman" kamu. git reflog mencatat setiap kali HEAD kamu bergerak. Kalau kamu nggak sengaja reset --hard terlalu jauh dan kehilangan commit, kamu masih bisa melihat riwayat pergerakan HEAD di reflog dan balik lagi ke commit yang kamu mau pakai git reset --hard [hash-dari-reflog]. Ini penyelamat hidup banget!
  • Komunikasi di Tim: Kalau kamu nggak yakin mau pakai reset atau revert di branch shared, diskusikan dengan tim kamu. Pastikan semua orang paham kebijakan tim terkait mengubah sejarah commit.

Penutup

Menguasai git reset dan git revert itu penting banget buat workflow Git kamu. Ini kayak punya tombol "undo" yang canggih. reset itu buat membersihkan sejarah lokal kamu, sementara revert itu buat membatalkan perubahan dengan aman di branch yang dipakai bareng. Ingat aja kuncinya: Lokal pakai reset (hati-hati --hard), Remote (udah di-push) pakai revert.

Jangan takut nyoba-nyoba (tapi di branch atau repository percobaan ya!) biar kamu makin terbiasa sama kedua perintah ini. Semakin sering dipakai, semakin paham bedanya, dan semakin jago kamu ngatur kodemu pakai Git. Selamat ngoding dan semoga nggak ada lagi drama gara-gara salah undo ya!