git stash: cara menyimpan perubahan sementara dan mengembalikannya
git stash memindahkan perubahan yang belum di-commit ke penyimpanan terpisah dan mengembalikan folder kerja ke commit terakhir, sehingga Anda bisa berpindah ke tugas lain. Perubahan dikembalikan dengan git stash pop (diterapkan lalu dihapus dari penyimpanan) atau git stash apply (diterapkan dan tetap disimpan); tidak ada perintah git unstash.
Untuk apa git stash
Situasi yang sering terjadi: Anda sedang di tengah tugas, berkas sudah berubah, tetapi belum waktunya commit. Tiba-tiba diminta memperbaiki bug di branch lain. Berpindah branch tidak bisa dilakukan atau Anda takut kehilangan perubahan. git stash memasukkan semua perubahan yang belum di-commit ke «saku» dan mengembalikan folder kerja ke keadaan commit terakhir.
$ git stash
Saved working directory and index state WIP on feature/login: 3f2a1c4 Form login
$ git status
On branch feature/login
nothing to commit, working tree clean
Sekarang Anda bisa berpindah, memperbaiki bug, lalu kembali dan mengambil perubahan yang disimpan. Setiap penyimpanan menjadi entri di tumpukan stash. Di dalam, Git menyimpannya sebagai commit khusus, jadi datanya aman dan tidak bergantung pada branch.
Cara menyimpan perubahan: pilihan utama
Dengan deskripsi yang jelas
Deskripsi standar «WIP on branch» tidak akan berarti apa-apa seminggu kemudian. Beri keterangan:
git stash push -m "validasi form, e-mail belum selesai"
git stash tanpa argumen adalah singkatan dari git stash push. Bentuk lama git stash save "pesan" masih berfungsi, tetapi untuk skenario baru gunakan push -m.
Bersama berkas baru
Secara default stash hanya mengambil berkas yang dilacak, yaitu yang sudah berubah atau sudah ditambahkan ke index. Berkas baru yang belum pernah di-git add tetap berada di folder kerja. Ini sering mengejutkan.
git stash -u # --include-untracked: termasuk berkas yang tidak dilacak
git stash -a # --all: termasuk berkas dari .gitignore
Berhati-hatilah dengan -a: node_modules, hasil build, dan konfigurasi lokal ikut masuk ke saku. Biasanya -u sudah cukup.
Hanya sebagian perubahan
git stash push -m "konfigurasi" src/config.js # hanya berkas tertentu
git stash -p # pilih potongan secara interaktif
git stash --staged # hanya yang ada di index (Git 2.35+)
git stash --keep-index # simpan semuanya, tetapi index tetap di folder
--keep-index berguna sebelum commit: Anda hanya menyisakan di folder kerja apa yang akan di-commit, menjalankan tes, dan memastikan commit tersebut berdiri sendiri.
Cara mengembalikan perubahan
Perintah git unstash tidak ada di Git; orang yang mencari cara mengambil kembali sesuatu yang disimpan biasanya menemukan dua perintah berikut.
| Perintah | Fungsi | Entri di tumpukan |
|---|---|---|
git stash pop | Menerapkan perubahan stash terakhir | Dihapus jika berhasil tanpa konflik |
git stash apply | Menerapkan perubahan stash terakhir | Tetap disimpan |
git stash pop stash@{2} | Menerapkan entri tertentu | Dihapus |
git stash apply --index | Memulihkan juga pemisahan antara index dan folder kerja | Tetap disimpan |
$ git stash pop
On branch feature/login
Changes not staged for commit:
modified: src/auth.js
modified: src/form.js
Dropped refs/stash@{0} (8c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d)
Perhatikan: secara default, bahkan yang tadinya ada di index saat disimpan, dikembalikan sebagai perubahan biasa. Jika ingin mempertahankan index yang sudah di-stage, tambahkan --index.
pop atau apply
Untuk pekerjaan harian, pop lebih praktis: diambil lalu selesai. apply dipilih ketika ingin menerapkan perubahan yang sama ke beberapa branch, atau ketika tidak yakin prosesnya akan mulus; entri tetap ada sebagai cadangan, dan bisa dihapus nanti dengan git stash drop.
Mengelola daftar stash
$ git stash list
stash@{0}: On feature/login: validasi form, e-mail belum selesai
stash@{1}: WIP on main: 9b7e0d2 Perbarui dependensi
stash@{2}: On feature/api: eksperimen dengan cache
Tumpukan bekerja dengan prinsip «yang terakhir masuk, yang pertama keluar»: stash@{0} selalu entri paling baru, dan nomornya bergeser setiap kali ada push atau drop.
| Perintah | Fungsi |
|---|---|
git stash show | Statistik ringkas perubahan entri terakhir |
git stash show -p stash@{1} | Diff lengkap satu entri |
git stash drop stash@{1} | Menghapus satu entri |
git stash clear | Menghapus semua entri sekaligus |
git stash branch nama stash@{0} | Membuat branch dari commit tempat stash dibuat, menerapkan entri, lalu menghapusnya |
Agar git stash show secara default menampilkan diff lengkap dan juga berkas yang tidak dilacak, atur stash.showPatch dan stash.showIncludeUntracked.
Skenario langkah demi langkah: bug mendadak di tengah tugas
- Simpan pekerjaan Anda termasuk berkas baru:
git stash push -u -m "login: draf". - Pindah ke branch utama dan buat branch untuk perbaikan:
git switch main,git pull,git switch -c hotfix/null-email. - Perbaiki bug, commit, dan kirim untuk review.
- Kembali ke tugas:
git switch feature/login. - Ambil perubahan:
git stash pop. Periksagit statusuntuk memastikan semuanya ada.
Untuk skenario ini sebagian orang sekarang memakai git worktree: folder kerja kedua untuk repositori yang sama memungkinkan Anda tidak menyimpan apa pun sama sekali. Namun untuk berpindah sebentar selama lima menit, stash tetap lebih sederhana.
Konflik saat menerapkan stash
Jika setelah disimpan, baris yang sama berubah di branch, penerapan akan berakhir dengan konflik:
$ git stash pop
Auto-merging src/auth.js
CONFLICT (content): Merge conflict in src/auth.js
The stash entry is kept in case you need it again.
Dalam kasus ini entri tidak dihapus, bahkan dengan pop. Selesaikan konflik di berkas seperti biasa, lalu jalankan git add untuk menandai penyelesaiannya (atau git restore --staged jika tidak ingin perubahan tetap ada di index), dan hapus entri yang sudah tidak diperlukan dengan git stash drop.
Jika konfliknya rumit, ada jalan lain: git stash branch tmp-login. Git membuat branch dari commit tempat Anda membuat stash, menerapkan perubahan di sana tanpa konflik, dan setelah itu Anda menggabungkan branch tersebut dengan merge biasa.
Memulihkan stash yang terhapus tidak sengaja
Jika git stash drop atau clear dijalankan secara keliru, belum tentu semuanya hilang. Entri stash adalah commit, dan selama garbage collector belum membersihkannya, commit tersebut bisa dicari di antara objek yang menggantung:
git fsck --no-reflog | grep "dangling commit"
git show 8c1d2e3 # pastikan itu memang stash yang dimaksud
git stash apply 8c1d2e3
Jika Anda baru saja menghapus entri dengan drop atau pop, hash-nya tercetak langsung di keluaran perintah, pada baris Dropped refs/stash@{0} (...). Hash itu cukup diberikan ke git stash apply.
Cara kerja stash di dalam
Memahami mekanismenya membantu mengurangi rasa takut kehilangan data. Setiap entri stash adalah commit biasa yang ditunjuk oleh referensi refs/stash. Commit ini memiliki dua induk: commit HEAD tempat Anda berdiri, dan commit terpisah yang berisi keadaan index. Dengan -u, ditambahkan induk ketiga yang berisi berkas tidak terlacak. Daftar stash@{N} sebenarnya adalah log (reflog) dari referensi refs/stash.
Ada beberapa konsekuensi praktis. Stash bisa diberikan ke perintah apa pun yang menerima commit: git diff stash@{0}, git show stash@{0}:src/auth.js (isi satu berkas dari entri), atau git checkout stash@{0} -- src/auth.js untuk mengambil satu berkas tanpa menerapkan seluruh entri. Entri yang sudah dihapus tetap ada di basis data objek sampai dibersihkan garbage collector.
Stash dan perintah Git lainnya
Beberapa perintah bisa menyimpan perubahan sendiri. git rebase --autostash dan git pull --rebase --autostash menyimpan perubahan yang belum di-commit sebelum mulai dan mengembalikannya setelah selesai. Perilaku ini bisa diaktifkan secara permanen dengan rebase.autoStash true dan merge.autoStash true. Jika saat pengembalian muncul konflik, Git menyimpan entri di tumpukan stash biasa dan memberi tahu Anda.
Berpindah branch dengan git switch juga tidak selalu memerlukan stash: jika perubahan Anda tidak menyentuh berkas yang berbeda antar-branch, Git akan membawanya ikut serta. Stash diperlukan ketika Git menjawab «Your local changes would be overwritten by checkout», atau ketika Anda tidak ingin membawa perubahan ke branch lain.
Kesalahan yang sering terjadi
- Berkas baru tidak ikut tersimpan. Berkas itu tidak dilacak; diperlukan
-u. - Stash dipakai sebagai penyimpanan jangka panjang. Sebulan kemudian ada sepuluh entri «WIP on main» tanpa nama, dan tidak ada yang ingat isinya. Untuk pekerjaan panjang, buat commit di branch tersendiri; setidaknya commit bisa di-push.
- Lupa bahwa entri tetap ada setelah konflik, lalu menerapkannya lagi nanti. Setelah konflik selesai, selalu jalankan
drop. - Stash tidak tersinkronisasi dengan server. Stash hanya ada di repositori lokal;
git pushtidak mengirimnya. Jika folder proyek dihapus, stash ikut hilang. - Menerapkan entri yang salah. Sebelum
pop, periksa dengangit stash listdangit stash show -p.
Ringkasan
git stash adalah cara cepat mengosongkan folder kerja tanpa kehilangan perubahan yang belum di-commit: git stash push -u -m "deskripsi" untuk menyimpan, dan git stash pop untuk mengembalikan. Gunakan apply ketika butuh cadangan, git stash list dan show -p agar tidak keliru, dan jangan jadikan stash gudang penyimpanan; untuk pekerjaan yang panjang, sediakan commit dan branch. Berpindah antar tugas dengan stash dilatih dengan praktik dalam kursus Git.
Pertanyaan umum
Bisakah stash diterapkan di branch lain?
Bisa. Stash tidak terikat pada satu branch: pindah ke branch yang diinginkan lalu jalankan git stash pop atau apply. Jika perubahannya tidak cocok, akan muncul konflik biasa.
Apakah git stash menyimpan perubahan di index?
Ya, tetapi pada pop atau apply biasa semuanya kembali sebagai perubahan yang belum di-stage. Untuk memulihkan index juga, gunakan git stash apply --index.
Berapa banyak entri yang bisa disimpan di stash?
Tidak ada batas tegas, tetapi entri yang lebih tua dari masa simpan reflog bisa dihapus saat garbage collection. Dalam praktik, simpan hanya beberapa entri terbaru.
Bagaimana cara menyimpan satu berkas saja ke stash?
Tulis path setelah push, misalnya git stash push -m deskripsi -- src/config.js. Hanya berkas itu yang masuk ke stash; perubahan lain tetap di folder kerja.
Apa bedanya stash dengan commit sementara?
Commit berada di dalam branch, bisa di-push ke server, dan bisa diubah lagi dengan amend atau rebase. Stash hanya tersimpan secara lokal di tumpukan terpisah dan cocok untuk berpindah sebentar.
Topik ini dibahas mendalam dengan praktik di kursus “Git dari Nol hingga Pengembang Percaya Diri”.
Ke kursus