Staging area yang “hilang” jarang menjadi bencana sungguhan. Index bukan tempat penyimpanan permanen — ia hanyalah daftar isi calon commit berikutnya yang selalu bisa disusun ulang dari working tree, dan perubahan yang sesungguhnya kita cintai hidup di working tree, bukan di staging. Bab-bab pembatalan staging sudah memperlihatkan separuh kebenaran itu; chapter ini menyempurnakan peta lengkapnya: staging yang lepas karena reset --mixed, staging yang ingin dibentuk dari snapshot lama dengan reset --soft, dan staging yang perlu disimpan sementara dengan git stash --staged — semua dibuktikan dengan keluaran nyata di satu repository.

Staging yang Lepas karena reset –mixed #

Skenario pertama adalah kecelakaan paling umum: perubahan sudah telanjur di-stage, lalu tangan menjalankan git reset polos — yang berarti --mixed — dan seluruh staging lepas. Repository latihan-staging menyiapkan keadaan tepat sebelum kecelakaan:

bash
mkdir latihan-staging && cd latihan-staging
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'laporan v1\n' > laporan.md
git add laporan.md
git commit -m "Tulis laporan v1"
printf 'laporan v2\n' > laporan.md
git add laporan.md
git status

Output yang Dihasilkan:

text
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   laporan.md

Sekarang kecelakaannya:

bash
git reset

Output yang Dihasilkan:

text
Unstaged changes after reset:
M	laporan.md
bash
git status --short
git diff

Output yang Dihasilkan:

text
 M laporan.md

Output yang Dihasilkan:

text
diff --git a/laporan.md b/laporan.md
index fb2bfb4..ffce48c 100644
--- a/laporan.md
+++ b/laporan.md
@@ -1 +1 @@
-laporan v1
+laporan v2

Dua bukti bertumpuk: status turun dari staged (M di kolom pertama) menjadi unstaged ( M di kolom kedua), sementara git diff masih menampilkan seluruh suntingan — dari -laporan v1 ke +laporan v2. reset --mixed hanya melepas index; working tree tidak tersentuh sama sekali. Karena itulah pemulihannya membosankan:

bash
git add laporan.md
git status --short

Output yang Dihasilkan:

text
M  laporan.md

Staging kembali terisi — M naik lagi ke kolom pertama. Commit penutupnya sederhana: git commit -m "Perbarui laporan". Setelah itu keadaan beres total.

Menyusun Staging dari Snapshot Lama dengan reset –soft #

Arah sebaliknya juga berguna: menjadikan isi beberapa commit sebagai staging. Alur klasiknya merapikan commit-commit kecil menjadi satu. Repository lanjut dengan dua commit tambahan:

bash
printf 'bagian pembuka\n' > pembuka.md
git add pembuka.md
git commit -m "Tambah bagian pembuka"
printf 'bagian penutup\n' > penutup.md
git add penutup.md
git commit -m "Tambah bagian penutup"
git log --oneline

Output yang Dihasilkan:

text
6f8832e Tambah bagian penutup
bd8c040 Tambah bagian pembuka
0fe5f64 Perbarui laporan
476ff25 Tulis laporan v1

git reset --soft HEAD~2 memindahkan branch dua langkah ke belakang tanpa menyentuh index maupun working tree — seluruh isi dua commit yang ditinggalkan otomatis menjadi perubahan staged:

bash
git reset --soft HEAD~2
git status

Output yang Dihasilkan:

text
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   pembuka.md
	new file:   penutup.md

Kedua berkas tampil sebagai new file yang sudah ter-stage. Satu commit pengganti menutup rangkaian ini:

bash
git commit -m "Gabungkan pembuka dan penutup"
git log --oneline

Output yang Dihasilkan:

text
[main 092f1c1] Gabungkan pembuka dan penutup
 2 files changed, 2 insertions(+)
 create mode 100644 pembuka.md
 create mode 100644 penutup.md

Output yang Dihasilkan:

text
092f1c1 Gabungkan pembuka dan penutup
0fe5f64 Perbarui laporan
476ff25 Tulis laporan v1

Riwayat rapinya tiga commit — trik yang sama dengan jalur pertama chapter Membatalkan Commit Terakhir , dilihat dari sisi staging.

Menyimpan Staging Sementara dengan stash –staged #

Bagaimana bila staging yang sudah rapi harus “dievakuasi” sementara — misalnya ada tugas mendesak masuk? Sejak Git 2.35, git stash --staged menyimpan isi staging tanpa menyentuh suntingan unstaged lainnya:

bash
printf 'laporan v3\n' > laporan.md
git add laporan.md
git stash --staged
git status

Output yang Dihasilkan:

text
Saved working directory and index state WIP on main: 092f1c1 Gabungkan pembuka dan penutup

Output yang Dihasilkan:

text
On branch main
nothing to commit, working tree clean

Working tree bersih dan laporan.md kembali ke versi ter-commit — suntingan v3 aman tersimpan di tumpukan stash:

bash
git stash list

Output yang Dihasilkan:

text
stash@{0}: WIP on main: 092f1c1 Gabungkan pembuka dan penutup

Mengembalikannya sekaligus keadaan staged-nya memakai --index:

bash
git stash pop --index
git status --short

Output yang Dihasilkan:

text
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   laporan.md

Dropped refs/stash@{0} (1cfc25e8792a88b3bdc5737071e37354adf58069)

Output yang Dihasilkan:

text
M  laporan.md

git stash pop --index mengembalikan isi stash lengkap dengan keadaan staged-nya — suntingan v3 hadir kembali dan langsung ter-stage. Tanpa --index, isi stash kembali sebagai suntingan unstaged. Kita buktikan dua-duanya sekaligus: stash dibuat ulang dalam bentuk panjang push --staged yang menerima pesan, lalu dipop polos:

bash
git stash push --staged -m "draf laporan"
git stash list

Output yang Dihasilkan:

text
Saved working directory and index state On main: draf laporan

Output yang Dihasilkan:

text
stash@{0}: On main: draf laporan

Keluaran stash berpesan mencatat On main: draf laporan alih-alih label WIP on main — pesan itu pula yang tampil di git stash list. Sekarang pop polos:

bash
git stash pop
git status --short

Output yang Dihasilkan:

text
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   laporan.md

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (8ecffcf33af9a3525e675e152e3fb6f790f1cb68)

Output yang Dihasilkan:

text
 M laporan.md

Suntingan kembali hadir, tetapi hanya sebagai perubahan unstaged — kolom M berdiri di posisi kedua. Ekosistem stash lengkapnya (list, branch, drop) menempati chapter git stash dan Stash Apply, Pop, dan Drop .

Semua Jalan Pulang ke Working Tree #

Benang merah seluruh kasus di atas: index selalu bisa disusun ulang dari working tree, sedangkan working tree hanya terancam oleh reset --hard dan git restore tanpa sumber. Tabel ringkasnya:

KejadianKeadaan working treePemulihan
git reset (mixed) tak sengajaSuntingan utuh, staging kosonggit add <berkas> ulang
Ingin staging berisi isi commit lamaTak tersentuhgit reset --soft <hash>
Staging perlu dievakuasi sementaraBersih setelah penyimpanangit stash push --staged, kembali dengan pop --index
Staging “hilang” setelah reset --hardIkut terhapusTak tersisa di working tree — pulihkan lewat reflog bila pernah di-commit

Perintah rujukan untuk opsi --staged tersedia di git-stash . Satu kondisi “hilang” yang belum kita tangani sama sekali adalah pesan HEAD detached at ... — keadaan ketika penunjuk HEAD lepas dari branch — yang justru sering muncul persis di tengah prosedur pemulihan. Pembahasan lengkapnya menanti di Menangani Detached HEAD .