- Bab 3 dari 8
- 30 menit
- 4 soal kuis
Empat Area Kerja dan Cara Git Menyimpan Data
Di bab ini (8 bagian)
Tujuan bab ini
- Menjelaskan empat area kerja Git: working directory, staging area, local repository, dan remote repository.
- Mengenali status file (untracked, modified, staged, committed) dari output
git status. - Memahami objek blob, tree, dan commit serta peran hash SHA-1.
- Menjelaskan kenapa Git menyimpan snapshot, bukan diff, dan apa isi folder
.git.
Empat area kerja
Hampir semua kebingungan pemula soal Git hilang begitu kamu paham bahwa perubahan berpindah melewati empat "ruangan":
| Area | Isinya | Pindah ke area berikutnya dengan |
|---|---|---|
| Working directory | Folder proyek tempat kamu benar-benar mengedit file | git add |
| Staging area (index) | Perubahan yang sudah kamu pilih untuk commit berikutnya | git commit |
| Local repository | Database .git berisi seluruh riwayat commit di laptopmu | git push |
| Remote repository | Salinan repositori di server, misalnya GitHub | (diambil kembali dengan git pull / git fetch) |
Analogi gampangnya: kamu mau kirim paket. Working directory itu meja kerjamu, tempat barang berserakan. Staging area itu kardus, tempat kamu memilih barang mana yang ikut dikirim. Commit itu menyegel kardus dan memberi label. Push itu mengirim kardus ke gudang pusat (remote).
Kenapa perlu staging, tidak langsung commit saja? Karena kamu sering mengubah banyak file sekaligus, padahal idealnya satu commit berisi satu perubahan logis. Dengan staging, kamu bisa memilih: commit perbaikan bug dulu, lalu fitur baru di commit terpisah.
Ada juga arah sebaliknya:
git restore <file>: membuang perubahan di working directory, kembali ke versi terakhir.git restore --staged <file>: mengeluarkan file dari staging area (cara lama:git reset HEAD <file>).git fetch/git pull: mengambil commit terbaru dari remote.
Status file
Dari sudut pandang Git, setiap file di working directory punya status:
- Untracked: file baru yang belum pernah dikenal Git.
- Modified: file yang sudah dilacak, isinya berubah, tapi belum di-stage.
- Staged: perubahan sudah masuk staging area, siap ikut commit berikutnya.
- Committed (unmodified): isi file sama dengan versi di commit terakhir.
git status adalah kompasmu. Versi singkatnya, git status -s, memakai dua kolom kode: kolom kiri untuk staging, kolom kanan untuk working directory.
| Kode | Arti |
|---|---|
?? | Untracked |
A | File baru yang sudah di-stage |
M | Modified, belum di-stage |
M | Modified dan sudah di-stage |
MM | Sudah di-stage, lalu diubah lagi setelahnya |
Kode MM menarik: staging menyimpan isi file saat kamu menjalankan git add. Kalau setelah itu kamu mengedit lagi, edit terbaru belum ikut, jadi kamu perlu git add sekali lagi.
Cara Git menyimpan data
Di dalam folder .git/objects, Git menyimpan tiga jenis objek utama:
- Blob: isi sebuah file, hanya kontennya, tanpa nama file.
- Tree: struktur direktori, berisi daftar nama file beserta blob-nya (dan tree lain untuk subfolder).
- Commit: menunjuk ke satu tree (potret proyek), plus penulis, waktu, pesan, dan commit induk.
Ada juga tag, penanda permanen ke sebuah commit yang biasanya dipakai untuk rilis.
Setiap objek diberi nama berupa hash SHA-1 sepanjang 40 karakter heksadesimal yang dihitung dari isinya. Isi sama, hash pasti sama. Isi beda satu byte saja, hash berubah total. Inilah sumber integritas data Git. Biasanya kamu cukup melihat 7 karakter awalnya, seperti di git log --oneline.
Snapshot, bukan diff
VCS lama menyimpan daftar perubahan (diff) per file: versi 2 = versi 1 + perubahan. Git berpikir lain. Setiap commit adalah snapshot utuh seluruh proyek. File yang tidak berubah tidak disalin ulang, melainkan cukup ditautkan ke blob yang sama. Karena itu Git bisa langsung melompat ke commit mana pun tanpa harus "memutar ulang" semua perubahan dari awal.
Folder .git di akar proyek adalah repositorimu yang sebenarnya. Isinya antara lain HEAD (penunjuk branch aktif), config (konfigurasi local), index (staging area), objects/ (semua blob, tree, commit), dan refs/ (branch serta tag). Hapus .git, dan seluruh riwayat ikut hilang, sementara file proyekmu tetap ada sebagai folder biasa.
Coba sendiri
Buat repositori latihan dan amati statusnya berubah:
Hash commitmu pasti berbeda, karena bergantung pada nama, email, dan waktu. Sekarang intip objeknya:
Hash tree dan blob ini akan sama persis di laptopmu, karena hanya bergantung pada isi. Buktikan juga snapshot berbagi blob:
Dua nama file, satu blob. Terakhir, ubah file lalu cek kodenya:
Kesalahan umum
- Mengira
git addsudah menyimpan ke riwayat.addhanya memasukkan ke staging. Riwayat baru tercatat setelahgit commit. - Mengira commit langsung sampai ke GitHub. Commit tersimpan di local repository. Perlu
git pushuntuk mengirimnya ke remote. - Mengedit lagi setelah
git addlalu langsung commit. Edit terakhir tertinggal, terlihat sebagaiMMdigit status -s. - Menghapus atau mengedit isi
.gitsecara manual. Biarkan Git yang mengurus folder itu.
Rangkuman
- Perubahan bergerak dari working directory ke staging area (
git add), ke local repository (git commit), lalu ke remote (git push). - Status file ada empat: untracked, modified, staged, dan committed, yang terbaca jelas lewat
git status -s. - Git menyimpan objek blob (isi file), tree (struktur folder), dan commit (snapshot plus metadata), masing-masing bernama hash SHA-1 dari isinya.
- Setiap commit adalah snapshot utuh, dan file yang sama cukup memakai blob yang sama.
- Folder
.gitadalah repositori sebenarnya: menghapusnya berarti menghapus seluruh riwayat.
Slide 10 sampai 12 dari deck Git. Penjelasan lengkapnya ada di mode Baca.

Selesaikan bab ini
- 1. Baca materi
- 2. Kuis (4 soal)
Cek pemahaman
1Di repositori baru tanpa commit, apa output perintah terakhir?
$ echo "# Halo Git" > README.md $ git add README.md $ echo "baris dua" >> README.md $ git status -s2Objek Git yang menyimpan isi file tanpa nama file disebut apa?
3Git menyimpan setiap commit sebagai diff terhadap commit sebelumnya.
4Apa yang bisa disimpulkan dari output berikut?
$ git cat-file -p HEAD^{tree} 100644 blob c79f97b548aa7452add2b3d9938286850db8693e README.md 100644 blob c79f97b548aa7452add2b3d9938286850db8693e salinan.md
