Git Stash & Gitignore — Git

Git Stash menyimpan perubahan sementara tanpa commit — seperti "menaruh di rak" untuk dikerjakan nanti. Kapan pakai stash? Perlu pindah branch tapi pekerjaan…

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'

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

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"

⚠️ Jebakan yang sering ketemu

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.

Yang akan kamu pelajari