Batalkan Perubahan di Git
Belajar cara 'mundur' atau memperbaiki kesalahan di Git. Pahami perbedaan dan penggunaan perintah `git checkout -- <file>`, `git restore`, `git reset`, dan `git revert` untuk membatalkan perubahan di working directory, staging area, atau commit.
Ups, Ada yang Salah? Jurus Mundur di Git: checkout
, restore
, reset
, revert
!
Sebagai developer, kita semua pasti pernah ngalamin: salah ngedit file, salah nge-add
file ke staging, atau bahkan salah nge-commit
sesuatu yang belum siap. Tenang, Git itu kayak "mesin waktu" yang ngasih kita banyak cara buat "mundur" atau ngebatalin perubahan.
Tapi, karena Git itu powerful, beberapa perintah buat ngebatalin ini juga bisa "berbahaya" kalau salah pake (bisa ngilangin kerjaan!). Jadi, penting banget buat ngerti bedanya dan kapan pake yang mana.
Kita bakal bahas beberapa skenario umum dan perintah yang relevan:
Skenario 1: Salah Edit File di Working Directory (Belum di-add
)
Kamu lagi ngedit file index.html
, terus tiba-tiba sadar, "Waduh, semua perubahan ini salah! Aku mau balikin index.html
ini ke kondisi terakhir pas aku commit
."
-
Perintah Lama (Masih Sering Dipake):
git checkout -- <nama_file>
- Tanda
--
(dua strip) itu penting! Dia misahin nama branch (yang juga bisa dipake digit checkout
) dari nama file. Tanpa itu, Git bisa bingung. - Perintah ini bakal ngganti isi file di Working Directory-mu dengan versi file itu dari commit terakhir (HEAD). Semua perubahan lokal yang belum di-
add
di file itu bakal HILANG PERMANEN! Jadi, hati-hati.
- Tanda
-
Perintah Baru (Lebih Eksplisit dan Direkomendasikan):
git restore <nama_file>
- Sejak Git versi 2.23, ada perintah
git restore
yang tujuannya lebih jelas buat "ngembaliin" file. - Fungsinya sama kayak
git checkout -- <file>
di skenario ini.
- Sejak Git versi 2.23, ada perintah
Contoh:
# Misal kamu udah ngacak-ngacak index.html dan mau balikin
git status # Akan nunjukin index.html modified
# Cara lama
git checkout -- index.html
# Atau cara baru (lebih disukai)
git restore index.html
git status # index.html sekarang bakal bersih lagi (kembali ke versi commit terakhir)
Ingat: Perubahan yang belum di-add
di file itu bakal ilang ya!
Skenario 2: Salah add
File ke Staging Area (Belum di-commit
)
Kamu udah semangat nge-git add style.css
, eh ternyata ada perubahan di style.css
yang belum selesai dan gak seharusnya ikut di commit berikutnya. Kamu mau "ngeluarin" style.css
dari Staging Area, balikin lagi ke status "modified" di Working Directory.
-
Perintah Lama:
git reset HEAD <nama_file>
HEAD
nunjuk ke commit terakhir. Perintah ini bakal "ngeset ulang" Staging Area buat file itu jadi sama kayak kondisi diHEAD
, tapi perubahan di Working Directory-mu gak ilang.
-
Perintah Baru (Lebih Eksplisit dan Direkomendasikan):
git restore --staged <nama_file>
- Opsi
--staged
digit restore
khusus buat ngeluarin file dari Staging Area.
- Opsi
Contoh:
# Misal kamu udah ngedit index.html dan style.css
# Terus kamu add dua-duanya
git add index.html style.css
git status
# Outputnya bakal nunjukin index.html dan style.css ada di "Changes to be committed"
# Eh, style.css ternyata belum beres, mau dikeluarin dari staging
# Cara lama
git reset HEAD style.css
# Atau cara baru (lebih disukai)
git restore --staged style.css
git status
# Sekarang style.css bakal balik ke "Changes not staged for commit" (modified)
# Index.html tetep di staging area, siap di-commit.
Skenario 3: Membatalkan Commit (Ini Agak Rumit, Hati-Hati!)
Nah, ini skenario yang butuh kehati-hatian lebih, apalagi kalau commit-nya udah kamu push
ke remote repository (GitHub). Ada beberapa cara, masing-masing dengan implikasi beda:
a. git commit --amend
: "Eh, Pesan Commit-nya Salah" atau "Ada File Ketinggalan di Commit Terakhir"
Kalau kamu baru aja nge-commit, terus sadar pesan commit-nya typo, atau ada file kecil yang lupa di-add
buat commit itu, kamu bisa pake git commit --amend
.
- Cara Kerja:
- Dia gak bikin commit baru, tapi ngganti commit terakhir yang baru aja kamu buat.
- Kalau kamu cuma mau ganti pesan:
git commit --amend -m "Pesan commit baru yang bener"
- Kalau mau nambahin file yang ketinggalan:
git add file_ketinggalan.txt
terusgit commit --amend --no-edit
(--no-edit
biar gak usah nulis ulang pesan commit).
- PENTING: JANGAN PAKE
--amend
buat commit yang udah kamupush
ke remote dan mungkin udah ditarik (pull) sama orang lain! Karena ini "nulis ulang histori", bisa bikin masalah buat kolaborasi. Cuma aman dipake buat commit lokal yang belum di-push.
b. git reset <commit_hash>
: "Balik ke Masa Lalu" (Mengubah Histori Lokal)
Perintah git reset
ini powerful banget buat "mundur" ke kondisi commit tertentu di masa lalu. Tapi, karena dia ngubah histori commit, dia juga berbahaya kalau dipake buat commit yang udah di-push. (Hanya aman buat histori lokal).
Ada tiga mode utama git reset
(yang paling sering dipake):
-
git reset --soft <commit_hash_atau_HEAD~n>
:HEAD~n
artinyan
commit sebelumHEAD
(commit terakhir). MisalHEAD~1
itu satu commit sebelum terakhir.- Efek: Pindahin
HEAD
(dan branch saat ini) ke<commit_hash_atau_HEAD~n>
. Commit-commit setelah itu "dihapus" dari histori branch saat ini. TAPI, semua perubahan dari commit yang "dihapus" itu bakal ditaruh di Staging Area. Working Directory-mu gak berubah. - Kapan Dipake?: Kalau kamu mau ngegabungin beberapa commit terakhir jadi satu, atau mau ngulang commit terakhir dengan perubahan yang beda.
-
git reset --mixed <commit_hash_atau_HEAD~n>
(Ini mode default kalau gak disebutin):- Efek: Sama kayak
--soft
,HEAD
pindah. Tapi, perubahan dari commit yang "dihapus" itu ditaruh di Working Directory (jadi statusnya "modified", bukan staged). Staging Area jadi kosong. - Kapan Dipake?: Kalau kamu mau bener-bener "undo" beberapa commit terakhir dan mau ngolah ulang perubahannya dari Working Directory.
- Efek: Sama kayak
-
git reset --hard <commit_hash_atau_HEAD~n>
:- SANGAT BERBAHAYA! HATI-HATI BANGET!
- Efek:
HEAD
pindah. Perubahan dari commit yang "dihapus" itu HILANG SEMUA, BAIK DARI STAGING AREA MAUPUN WORKING DIRECTORY! Kamu bakal bener-bener balik ke kondisi persis kayak di<commit_hash_atau_HEAD~n>
. Gak ada cara gampang buat balikin data yang ilang karena--hard
(kecuali kamu tau commit hash yang ilang itu dan pakegit reflog
, tapi itu advance). - Kapan Dipake?: Kalau kamu bener-bener yakin mau ngebuang semua perubahan dari beberapa commit terakhir dan gak butuh lagi sama sekali. Selalu pikir dua kali sebelum pake
--hard
!
Contoh git reset
(hati-hati ya!):
# Misal kamu punya histori: C1 <- C2 <- C3 (HEAD)
# Kamu mau balik ke kondisi C1, ngebuang C2 dan C3
# Pake --soft (perubahan C2 & C3 masuk staging)
# git reset --soft HEAD~2
# atau git reset --soft <hash_C1>
# Pake --mixed (perubahan C2 & C3 masuk working directory)
# git reset --mixed HEAD~2
# atau git reset <hash_C1> (defaultnya mixed)
# Pake --hard (PERUBAHAN C2 & C3 HILANG TOTAL!) - JANGAN LANGSUNG DICOBA!
# git reset --hard HEAD~2
# atau git reset --hard <hash_C1>
Sekali lagi: git reset
itu ngubah histori. JANGAN PAKE buat commit yang udah di-push
dan dipake orang lain, kecuali kamu tau persis konsekuensinya buat timmu.
c. git revert <commit_hash_atau_HEAD>
: "Batalin" Commit dengan Bikin Commit Baru (Cara Aman buat Histori Bersama)
Kalau kamu mau "ngebatalin" efek dari sebuah commit tertentu, tapi commit itu udah di-push ke remote atau udah dipake orang lain, cara yang paling aman adalah pake git revert
.
- Cara Kerja:
git revert
gak ngapus commit lama dari histori.- Sebaliknya, dia bakal bikin COMMIT BARU yang isinya adalah "kebalikan" dari perubahan yang ada di commit yang mau kamu revert.
- Jadi, histori tetep maju, tapi efek dari commit yang salah itu jadi "dinetralisir" sama commit revert baru ini.
- Ini aman buat kolaborasi karena gak ngubah histori yang udah ada.
Contoh git revert
:
# Misal commit terakhir (HEAD) itu salah dan mau dibatalin efeknya
git log --oneline # Liat hash commit terakhir
# Revert commit terakhir (HEAD)
git revert HEAD
# Git bakal ngebuka editor buat kamu nulis pesan commit buat revert ini (defaultnya udah ada).
# Simpen dan tutup editor, commit revert baru bakal dibuat.
# Kalau mau revert commit tertentu di masa lalu (misal, hash-nya abc123)
# git revert abc123
Setelah di-revert, kamu bisa nge-push
commit revert baru ini ke remote.
Mana yang Dipilih? checkout
, restore
, reset
, atau revert
?
- Mau balikin perubahan file di Working Directory yang belum di-
add
? Pakegit restore <file>
(ataugit checkout -- <file>
). - Mau ngeluarin file dari Staging Area (unstage)? Pake
git restore --staged <file>
(ataugit reset HEAD <file>
). - Mau "mundur" ke commit sebelumnya dan ngubah histori lokal (commit belum di-push)? Pake
git reset
(pilih--soft
,--mixed
, atau--hard
dengan super hati-hati). - Mau "ngebatalin" efek commit yang udah di-push atau dipake orang lain tanpa ngubah histori? Pake
git revert
. - Mau ganti pesan commit terakhir atau nambah file ke commit terakhir (sebelum di-push)? Pake
git commit --amend
.
Membatalkan perubahan itu skill penting di Git. Tapi, karena beberapa perintah ini bisa ngilangin kerjaan kalau salah pake (terutama git reset --hard
), selalu pahami dulu apa efek dari tiap perintah sebelum kamu jalanin. Jangan takut buat baca dokumentasi atau nyari contoh lebih banyak.
Dan inget, git status
itu teman baikmu buat ngecek kondisi sebelum dan sesudah ngelakuin operasi pembatalan!
Kuis Membatalkan Perubahan di Git
Pertanyaan 1 dari 5
Anda telah melakukan beberapa perubahan pada file `index.html` di working directory Anda, tetapi perubahan tersebut BELUM di-`add` ke staging area. Anda ingin mengembalikan `index.html` ke kondisi terakhir yang di-commit. Perintah Git apa yang paling tepat dan modern untuk ini?