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:
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 statusOutput yang Dihasilkan:
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: laporan.mdSekarang kecelakaannya:
git resetOutput yang Dihasilkan:
Unstaged changes after reset:
M laporan.mdgit status --short
git diffOutput yang Dihasilkan:
M laporan.mdOutput yang Dihasilkan:
diff --git a/laporan.md b/laporan.md
index fb2bfb4..ffce48c 100644
--- a/laporan.md
+++ b/laporan.md
@@ -1 +1 @@
-laporan v1
+laporan v2Dua 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:
git add laporan.md
git status --shortOutput yang Dihasilkan:
M laporan.mdStaging 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:
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 --onelineOutput yang Dihasilkan:
6f8832e Tambah bagian penutup
bd8c040 Tambah bagian pembuka
0fe5f64 Perbarui laporan
476ff25 Tulis laporan v1git 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:
git reset --soft HEAD~2
git statusOutput yang Dihasilkan:
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: pembuka.md
new file: penutup.mdKedua berkas tampil sebagai new file yang sudah ter-stage. Satu commit pengganti menutup rangkaian ini:
git commit -m "Gabungkan pembuka dan penutup"
git log --onelineOutput yang Dihasilkan:
[main 092f1c1] Gabungkan pembuka dan penutup
2 files changed, 2 insertions(+)
create mode 100644 pembuka.md
create mode 100644 penutup.mdOutput yang Dihasilkan:
092f1c1 Gabungkan pembuka dan penutup
0fe5f64 Perbarui laporan
476ff25 Tulis laporan v1Riwayat 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:
printf 'laporan v3\n' > laporan.md
git add laporan.md
git stash --staged
git statusOutput yang Dihasilkan:
Saved working directory and index state WIP on main: 092f1c1 Gabungkan pembuka dan penutupOutput yang Dihasilkan:
On branch main
nothing to commit, working tree cleanWorking tree bersih dan laporan.md kembali ke versi ter-commit — suntingan v3 aman tersimpan di tumpukan stash:
git stash listOutput yang Dihasilkan:
stash@{0}: WIP on main: 092f1c1 Gabungkan pembuka dan penutupMengembalikannya sekaligus keadaan staged-nya memakai --index:
git stash pop --index
git status --shortOutput yang Dihasilkan:
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:
M laporan.mdgit 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:
git stash push --staged -m "draf laporan"
git stash listOutput yang Dihasilkan:
Saved working directory and index state On main: draf laporanOutput yang Dihasilkan:
stash@{0}: On main: draf laporanKeluaran 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:
git stash pop
git status --shortOutput yang Dihasilkan:
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:
M laporan.mdSuntingan 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:
| Kejadian | Keadaan working tree | Pemulihan |
|---|---|---|
git reset (mixed) tak sengaja | Suntingan utuh, staging kosong | git add <berkas> ulang |
| Ingin staging berisi isi commit lama | Tak tersentuh | git reset --soft <hash> |
| Staging perlu dievakuasi sementara | Bersih setelah penyimpanan | git stash push --staged, kembali dengan pop --index |
Staging “hilang” setelah reset --hard | Ikut terhapus | Tak 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
.