git stash menyimpan perubahan yang belum di-commit ke tempat sementara, supaya folder kerjamu bersih lagi. .gitignore adalah file berisi daftar file yang gak perlu dilacak Git sama sekali. Bayangin kamu lagi masak, terus tamu datang dan butuh meja dapur. Bahan yang setengah dipotong kamu masukkan ke wadah dan taruh di kulkas: itu stash. Setelah tamu pulang, wadahnya kamu keluarkan dan masak lanjut dari situ: itu git stash pop.
🧪 Tebakan cepat: kamu menambahkan
node_modules/ke.gitignore, padahal folder itu sudah ter-commit kemarin. Apa Git langsung berhenti melacaknya? Tebak dulu, jawabannya ada di bagian "File yang sudah terlanjur di-commit".
Stash: simpan dulu, kerjakan yang darurat
Repo toko-kue punya dua branch. Di main, index.html masih typo: "Toko Kuee". Di fitur-keranjang, commit terakhirnya 5e2b7a1 tambah keranjang. Kamu sedang mengubah app.js di fitur-keranjang, belum selesai dan belum di-commit. Tiba-tiba typo di main harus dibetulkan sekarang juga.
$ git switch main
error: Your local changes to the following files would be overwritten by checkout:
app.js
Please commit your changes or stash them before you switch branches.
Aborting
$ git stash
Saved working directory and index state WIP on fitur-keranjang: 5e2b7a1 tambah keranjang
$ git switch main
Switched to branch 'main'
- Git menolak pindah karena
app.jsdimainbeda dengan difitur-keranjang. Pindah branch berarti menimpa perubahanmu yang belum di-commit. (Kalau file yang kamu ubah isinya sama di kedua branch, Git justru membawa perubahanmu ikut pindah.) git stashmenyimpan perubahan di working directory dan staging area, lalu mengembalikan file ke isi commit terakhir. Folder kerjamu bersih, jadigit switchboleh jalan.WIP on fitur-keranjang: 5e2b7a1 tambah keranjangartinya pekerjaan setengah jadi (WIP, work in progress) dari branchfitur-keranjang, di atas commit5e2b7a1.
Di main kamu betulkan typo-nya dan commit perbaiki typo. Lalu balik dan ambil lagi pekerjaanmu:
$ git switch fitur-keranjang
Switched to branch 'fitur-keranjang'
$ git stash pop
On branch fitur-keranjang
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: app.js
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (8c41d2e0b6f9a3c7d5e1f2a4b8c9d0e6f7a3b1c5)
app.js kembali berisi perubahanmu, dan baris terakhir bilang stash itu sudah dibuang dari daftar. Hash panjang di ujungnya nanti beda di laptopmu.
Daftar stash: list, pop, apply, drop
Stash bisa lebih dari satu, ditumpuk. Yang paling baru selalu stash@{0}, yang sebelumnya turun jadi stash@{1}, dan seterusnya.
$ git stash list
stash@{0}: WIP on fitur-keranjang: 5e2b7a1 tambah keranjang
| Perintah | Yang terjadi |
|---|---|
git stash |
simpan perubahan, folder kerja kembali bersih |
git stash list |
tampilkan semua stash, yang terbaru stash@{0} |
git stash pop |
kembalikan stash@{0}, lalu hapus dari daftar |
git stash apply |
kembalikan stash@{0}, tapi tetap simpan di daftar |
git stash drop |
buang stash@{0} tanpa mengembalikannya |
git stash push -m "pesan" |
stash dengan nama sendiri, biar gampang dicari |
Biasanya pakai pop. apply berguna kalau kamu mau memasang perubahan yang sama di dua branch.
.gitignore: daftar file yang gak usah dilacak
Ada file yang gak boleh masuk repo: node_modules/ (ribuan file hasil npm install yang bisa dibuat ulang), .env (password dan API key), file log, dan hasil build. Tulis polanya di file .gitignore di folder paling atas repo:
# hasil npm install, bisa dibuat ulang
node_modules/
# rahasia: password, API key
.env
# semua file berakhiran .log
*.log
# kecuali yang ini
!penting.log
node_modules/: garis miring di akhir artinya folder, beserta seluruh isinya..env: satu nama file, persis.*.log:*cocok dengan nama apa pun, jadi semua file yang berakhiran.log.!penting.log: tanda!membatalkan aturan di atasnya, jadi file ini tetap muncul.- Baris yang diawali
#adalah komentar.
Commit juga file .gitignore-nya, supaya aturannya berlaku untuk seluruh tim. Ini efeknya di git status, di repo yang node_modules/-nya sudah terlanjur di-commit:
| File | Tanpa .gitignore |
Dengan .gitignore di atas |
|---|---|---|
.env |
muncul di Untracked files | disembunyikan |
debug.log |
muncul di Untracked files | disembunyikan |
penting.log |
muncul di Untracked files | tetap muncul, karena ! |
node_modules/ (sudah ter-commit) |
dilacak | tetap dilacak |
File yang sudah terlanjur di-commit
.gitignore cuma berlaku untuk file yang belum dilacak (untracked). Itu jawaban tebakannya: node_modules/ yang sudah ter-commit tetap dilacak, dan perubahannya tetap muncul di git status. Keluarkan dulu dari pelacakan:
git rm -r --cached node_modules/ # berhenti melacak, file di laptop tetap ada
git commit -m "berhenti melacak node_modules"
git rm --cachedmenghapus file dari pelacakan Git (dari staging area), tapi file di laptopmu gak disentuh.-r(recursive) dibutuhkan karenanode_modules/itu folder.- Setelah commit ini,
node_modules/jadi untracked. Karena cocok dengan.gitignore, dia gak muncul lagi digit status. - Tanpa
--cached,git rmikut menghapus file-nya dari laptopmu.
⚠️ Jebakan yang sering ketemu
- Stash gak membawa file baru. File yang belum pernah di-
git add(untracked) tertinggal di folder kerja. Pakaigit stash -usupaya ikut tersimpan. popyang bentrok. Kalau perubahan di stash bentrok dengan isi branch tempat kamu pop, muncul conflict, dan stash-nya gak dihapus. Bereskan conflict-nya, lalugit stash drop.- Stash yang terlupa. Daftar stash menumpuk diam-diam. Cek
git stash list, dan kasih nama dengangit stash push -m "keranjang setengah jadi". .envyang sudah ter-push..gitignoredangit rm --cachedgak menghapusnya dari commit lama. Isinya masih bisa dibaca di history, jadi ganti password atau API key-nya.
TL;DR: git stash menyimpan perubahan yang belum di-commit dan membersihkan folder kerja. git stash list menampilkan daftarnya (terbaru stash@{0}), git stash pop mengembalikan lalu menghapusnya, git stash apply mengembalikan tapi tetap menyimpannya, git stash drop membuangnya. .gitignore berisi pola file yang gak dilacak: node_modules/ untuk folder, *.log untuk semua .log, ! untuk pengecualian. .gitignore gak berlaku untuk file yang sudah ter-commit: keluarkan dulu dengan git rm -r --cached node_modules/, lalu commit.