Reset atau Revert di Git Kapan Kamu Pakai Yang Mana
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:
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.
git reset --mixed [commit-hash]
(Ini mode default kalau kamu cuma nulisgit 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.
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, tinggalgit 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. Cukupgit 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 pakaigit reset --soft HEAD~3
(reset ke 3 commit sebelum HEAD). Setelah itu, semua perubahan dari 3 commit itu jadi 'changes to be committed'. Tinggalgit commit --amend
ataugit 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, ataugit 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
! Pakaigit 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
ataurebase 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 eksekusireset
ataurevert
, cek dulu kondisi repository kamu pakaigit 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 sengajareset --hard
terlalu jauh dan kehilangan commit, kamu masih bisa melihat riwayat pergerakan HEAD direflog
dan balik lagi ke commit yang kamu mau pakaigit reset --hard [hash-dari-reflog]
. Ini penyelamat hidup banget! - Komunikasi di Tim: Kalau kamu nggak yakin mau pakai
reset
ataurevert
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!