K

Command Palette

Search for a command to run...

Daftar

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 di git 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.
  • 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.

Contoh:

bash
# 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 di HEAD, tapi perubahan di Working Directory-mu gak ilang.
  • Perintah Baru (Lebih Eksplisit dan Direkomendasikan): git restore --staged <nama_file>

    • Opsi --staged di git restore khusus buat ngeluarin file dari Staging Area.

Contoh:

bash
# 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 terus git commit --amend --no-edit (--no-edit biar gak usah nulis ulang pesan commit).
  • PENTING: JANGAN PAKE --amend buat commit yang udah kamu push 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):

  1. git reset --soft <commit_hash_atau_HEAD~n>:

    • HEAD~n artinya n commit sebelum HEAD (commit terakhir). Misal HEAD~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.
  2. 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.
  3. 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 pake git 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!):

bash
# 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:

bash
# 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? Pake git restore <file> (atau git checkout -- <file>).
  • Mau ngeluarin file dari Staging Area (unstage)? Pake git restore --staged <file> (atau git 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?