Membatalkan staging dan membuang perubahan

Membatalkan staging dengan git restore --staged dan membuang perubahan berkas dengan git restore.

Daftar isi

Kesalahan staging dan perubahan yang salah arah adalah dua kejadian paling rutin pada pekerjaan Git, dan keduanya dijawab oleh satu perintah modern, yaitu git restore. Topik ini membahas dua bentuknya: git restore --staged yang mengembalikan berkas dari staging area, dan git restore yang membuang perubahan working directory. Pemahaman batas antara keduanya penting, karena satu bentuk hanya mengubah keadaan staging, sedangkan yang lain menghapus pekerjaan secara permanen.

Membatalkan staging#

git restore --staged berkas mengembalikan berkas dari staging area ke working directory tanpa menyentuh isi berkasnya. Siapkan repository dengan satu commit dasar, lalu jalankan siklusnya.

bash
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"
bash
rm -rf /tmp/lab-restore
mkdir /tmp/lab-restore
cd /tmp/lab-restore
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Satu.\nDua.\n" > daftar.txt
git add daftar.txt
git commit -m "Daftar awal"
printf "Satu.\nDua diganti.\nTiga.\n" > daftar.txt
git add daftar.txt
git status -s
git restore --staged daftar.txt
git status -s
text Keluaran
Initialized empty Git repository in /tmp/lab-restore/.git/
[main (root-commit) cbf25bd] Daftar awal
 1 file changed, 2 insertions(+)
 create mode 100644 daftar.txt
M  daftar.txt
 M daftar.txt

Status M sebelum pembatalan menyatakan perubahan menunggu di staging area, dan M setelahnya menyatakan perubahan tetap utuh tetapi kini hanya ada di working directory. Isi berkas tidak berubah sedikit pun, hanya lokasi keadaannya yang mundur satu area. Bentuk ini menggantikan kebiasaan lama git reset HEAD berkas yang masih muncul pada dokumentasi lama dengan perilaku yang sama.

Membuang perubahan working directory#

Bentuk tanpa --staged bekerja pada arah yang berbeda dan berisiko: git restore berkas mengembalikan isi berkas di working directory mengikuti staging area, sehingga seluruh penyuntingan yang belum di-add hilang tanpa dapat dipulihkan.

bash
printf "Satu.\nDua diganti.\nTiga.\nEmpat.\n" > daftar.txt
git status -s
git restore daftar.txt
git status -s
cat daftar.txt
text Keluaran
 M daftar.txt
Satu.
Dua.

Status kosong setelah restore menyatakan berkas kembali persis ke keadaan staging area, dan isi catatan kembali ke dua baris awal. Pekerjaan yang dibuang bentuk ini tidak masuk reflog, tidak masuk tempat sampah, dan tidak dapat dikembalikan oleh Git, karena perubahan itu memang tidak pernah dicatat ke mana pun.

Memilih bentuk sesuai niat#

Dua bentuk git restore dapat dibaca sebagai pertanyaan yang berbeda. Pertanyaan pertama adalah bagaimana membatalkan keputusan staging, dan jawabannya --staged karena keputusan itu hanya menyentuh daftar isi commit berikutnya. Pertanyaan kedua adalah bagaimana membuang percobaan yang gagal, dan jawabannya bentuk biasa yang mengembalikan berkas pada keadaan yang tercatat.

Perintah lama git checkout -- berkas melakukan hal yang sama dengan bentuk kedua dan masih didukung sepenuhnya, tetapi kini disarankan memakai git restore karena cakupannya jelas. Pemisahan tugas ini penting secara praktis: perintah checkout lama memikul banyak makna, sedangkan restore hanya memikul satu, sehingga kesalahan pengetikan tidak berubah menjadi pembuangan pekerjaan.

Memeriksa dulu sebelum membuang#

Karena bentuk tanpa --staged tidak dapat dipulihkan, pemeriksaan satu langkah sebelum menjalankannya menjadi kebiasaan yang murah namun menyelamatkan. Perintah git diff menampilkan persis isi yang akan dibuang, dan membacanya menentukan apakah pembuangan itu memang yang dimaksud.

bash
printf "Satu.\nDua diganti sekali lagi.\nTiga.\n" > daftar.txt
git diff
git restore daftar.txt
git status -s
text Keluaran
diff --git a/daftar.txt b/daftar.txt
index 2a51ec7..dc06bad 100644
--- a/daftar.txt
+++ b/daftar.txt
@@ -1,2 +1,3 @@
 Satu.
-Dua.
+Dua diganti sekali lagi.
+Tiga.

Keluaran diff memperlihatkan dua baris yang akan hilang dan satu baris yang akan berubah, sehingga keputusan pembuangan dibuat di atas isi yang nyata, bukan di atas ingatan. Status kosong setelah restore menyatakan pembuangan selesai, dan urutan diff-restore ini layak dijadikan satu kebiasaan sejak dini.

Membuang perubahan pada banyak berkas#

Pembuangan yang menyentuh banyak berkas memakai bentuk yang sama dengan argumen berupa pola atau titik. Perintah git restore . mengembalikan seluruh berkas pada direktori saat ini beserta subfoldernya ke keadaan staging area, dan argumen berupa nama direktori membatasinya pada folder itu saja. Bentuk lama yang setara adalah git checkout -- ., dan perbedaan risikonya tetap yang sama: luas cakupan menentukan besar pekerjaan yang dipertaruhkan.

Ringkasan#

  • git restore --staged berkas membatalkan staging tanpa mengubah isi berkas, sehingga perubahan tetap aman di working directory.
  • git restore berkas membuang seluruh perubahan working directory yang belum di-add, dan pembuangan itu tidak dapat dipulihkan.
  • Kedua bentuk menggantikan kebiasaan lama git reset HEAD dan git checkout -- dengan cakupan yang lebih jelas.
  • Pilihan bentuk mengikuti niat: menata ulang isi commit berikutnya, atau mengembalikan berkas pada keadaan tercatat.

Referensi#