Stash

Menyimpan pekerjaan sementara dengan git stash dan mengembalikannya dengan pop atau apply.

Daftar isi

Pekerjaan yang sedang berjalan sering harus disingkirkan sejenak ketika prioritas berpindah, dan git stash menyimpan perubahan yang belum selesai itu tanpa memaksanya masuk riwayat. Topik ini membahas cara menyimpan, mencatat, mengembalikan, dan menumpuk pekerjaan sementara, serta perbedaan pop dan apply yang menentukan apakah catatan sementara itu dibuang atau disimpan.

Menyimpan dan mengembalikan pekerjaan sementara#

git stash menyimpan perubahan pada working directory dan staging area ke dalam tumpukan penyimpanan khusus, lalu mengembalikan working directory ke keadaan commit terakhir. Siapkan repository dengan pekerjaan yang belum selesai, lalu singkirkan sejenak.

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-stash
mkdir /tmp/lab-stash
cd /tmp/lab-stash
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Laporan mingguan.\n" > laporan.md
git add laporan.md
git commit -m "Laporan mingguan"
printf "Laporan mingguan.\nBagian kesimpulan belum selesai.\n" > laporan.md
git stash
git status -s
text Keluaran
Initialized empty Git repository in /tmp/lab-stash/.git/
[main (root-commit) b808a55] Laporan mingguan
 1 file changed, 1 insertion(+)
 create mode 100644 laporan.md
Saved working directory and index state WIP on main: b808a55 Laporan mingguan

Pesan WIP on main menyatakan penyimpanan berhasil, dan status kosong setelahnya menyatakan working directory kembali bersih. Pekerjaan tidak hilang, melainkan tersimpan pada tumpukan yang dapat diperiksa.

bash
git stash list
git stash pop
git status -s
text Keluaran
stash@{0}: WIP on main: b808a55 Laporan mingguan
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} (ed4236a82bcb0b6ba04afe52703ce1b3cc11c26f)
 M laporan.md

Perintah git stash list menampilkan tumpukan dengan alamat stash@{0} untuk yang terbaru, dan git stash pop mengembalikan isi tumpukan paling atas sekaligus membuang catatannya. Status akhir memperlihatkan perubahan kembali persis seperti sebelum disimpan, dan pekerjaan terganggu itu dapat dilanjutkan seolah-olah tidak pernah dijeda.

Pop, apply, dan penamaan stash#

Perbedaan pop dan apply terletak pada catatan tumpukannya: pop mengembalikan sekaligus menghapus, sedangkan apply mengembalikan dengan menyimpan catatan. Pemilihan yang tepat mengikuti kepastian pekerjaan, dan apabila hasil pengembalian masih perlu diuji terlebih dahulu, apply lebih aman karena catatan tetap tersedia apabila pengembalian ternyata keliru, sedangkan catatan lama dibuang setelahnya dengan git stash drop.

Tumpukan yang berisi lebih dari satu pekerjaan cepat menjadi samar, dan opsi -m memberi nama pada setiap penyimpanan.

bash
printf "Laporan mingguan.\nBagian kesimpulan.\n" > laporan.md
git stash push -m "Kesimpulan laporan"
git stash list
text Keluaran
Saved working directory and index state On main: Kesimpulan laporan
stash@{0}: On main: Kesimpulan laporan

Nama yang diberikan tampil pada daftar tumpukan menggantikan label WIP, dan tumpukan yang terisi beberapa pekerjaan pun tetap terbaca. Opsi -u menyertakan pula berkas baru yang belum dilacak, karena tanpa opsi tersebut berkas untracked dibiarkan di tempatnya.

Membaca tumpukan yang bercampur#

Tumpukan yang berisi beberapa pekerjaan berbeda memerlukan pembacaan isi sebelum dikembalikan, karena pop pada tumpukan yang salah menumpuk perubahan pada pekerjaan yang sedang berjalan. Isi setiap entri dapat diperiksa dengan git stash show yang merangkum perubahan berkasnya, dan opsi -p membukanya menjadi diff penuh sebagaimana git diff.

bash
git stash show stash@{0}
text Keluaran
 laporan.md | 1 +
 1 file changed, 1 insertion(+)

Bentuk keluarannya sama dengan git diff --stat, sehingga keputusan mengembalikan atau membiarkan entri dibuat di atas isinya. Satu hal yang sering mengejutkan adalah pengembalian pada branch yang berbeda: stash tidak terikat pada branch tempat ia dibuat, sehingga pop dari branch lain tetap berjalan, dan itu bisa jadi yang diminta maupun kejutan yang tidak diinginkan. Kebiasaan yang aman adalah menamai setiap penyimpanan dan mengembalikannya dari branch yang sama dengan asalnya.

Konflik juga mungkin muncul saat pengembalian, apabila keadaan working directory sudah berubah sejak penyimpanan dibuat. Pesan konfliknya serupa merge, dan penyelesaiannya memakai langkah yang sama, sedangkan entri stash tidak dibuang sampai penyelesaiannya tuntas, sehingga pekerjaan aslinya tetap terselamatkan.

Stash di tengah perpindahan branch#

Kebutuhan yang paling sering memanggil stash adalah berpindah branch di tengah pekerjaan yang belum layak commit. Alurnya lurus: simpan dengan git stash, pindah dan selesaikan urusan lain, kembali ke branch semula, lalu git stash pop. Seluruh keadaan pekerjaan mengikuti, dan riwayat tidak tersentuh sama sekali.

Batas yang perlu diingat adalah sifat tumpukannya yang lokal dan sementara. Stash tidak dikirim ke remote, tidak terlihat oleh rekan kerja, dan penyimpanannya tidak dirancang untuk berumur panjang. Pekerjaan yang ternyata layak disimpan lama lebih tepat menjadi commit pada branch pekerjaan, karena commit memberikan nama, pesan, dan jaminan riwayat, sedangkan stash hanya memberikan jeda.

Ringkasan#

  • git stash menyimpan perubahan working directory dan staging area ke tumpukan sementara, lalu membersihkan working directory.
  • git stash list menampilkan tumpukan, pop mengembalikan sekaligus menghapus, dan apply mengembalikan dengan menyimpan catatan.
  • Opsi -m memberi nama pada penyimpanan, dan -u menyertakan berkas yang belum dilacak.
  • Stash bersifat lokal dan sementara, sedangkan pekerjaan berumur panjang lebih tepat menjadi commit.

Referensi#