Git

Belum masuk. Progresmu tidak tersimpan.

Masuk
  • Bab 3 dari 8
  • 30 menit
  • 4 soal kuis

Empat Area Kerja dan Cara Git Menyimpan Data

Di bab ini (8 bagian)
  1. Tujuan
  2. Empat area kerja
  3. Status file
  4. Cara Git menyimpan data
  5. Snapshot, bukan diff
  6. Coba sendiri
  7. Kesalahan umum
  8. Rangkuman

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

Diagram empat area kerja Git dan perintah yang memindahkan perubahan

Hampir semua kebingungan pemula soal Git hilang begitu kamu paham bahwa perubahan berpindah melewati empat "ruangan":

AreaIsinyaPindah ke area berikutnya dengan
Working directoryFolder proyek tempat kamu benar-benar mengedit filegit add
Staging area (index)Perubahan yang sudah kamu pilih untuk commit berikutnyagit commit
Local repositoryDatabase .git berisi seluruh riwayat commit di laptopmugit push
Remote repositorySalinan 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.

KodeArti
??Untracked
A File baru yang sudah di-stage
MModified, belum di-stage
M Modified dan sudah di-stage
MMSudah 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:

mkdir latihan-git && cd latihan-git
git init
echo "# Halo Git" > README.md
git status -s
?? README.md
git add README.md
git status -s
git commit -m "Tambah README"
A  README.md
[main (root-commit) 348e2d6] Tambah README
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

Hash commitmu pasti berbeda, karena bergantung pada nama, email, dan waktu. Sekarang intip objeknya:

git cat-file -p HEAD
tree 7aed22714180b9b54db8ef7d3bfbdd5fb81baabb
author Rani Putri <rani@contoh.com> 1792586550 +0700
committer Rani Putri <rani@contoh.com> 1792586550 +0700

Tambah README
git cat-file -p 7aed227
100644 blob c79f97b548aa7452add2b3d9938286850db8693e	README.md

Hash tree dan blob ini akan sama persis di laptopmu, karena hanya bergantung pada isi. Buktikan juga snapshot berbagi blob:

cp README.md salinan.md
git add salinan.md
git commit -m "Tambah salinan"
git cat-file -p HEAD^{tree}
100644 blob c79f97b548aa7452add2b3d9938286850db8693e	README.md
100644 blob c79f97b548aa7452add2b3d9938286850db8693e	salinan.md

Dua nama file, satu blob. Terakhir, ubah file lalu cek kodenya:

echo "baris dua" >> README.md
git status -s
 M README.md

Kesalahan umum

  • Mengira git add sudah menyimpan ke riwayat. add hanya memasukkan ke staging. Riwayat baru tercatat setelah git commit.
  • Mengira commit langsung sampai ke GitHub. Commit tersimpan di local repository. Perlu git push untuk mengirimnya ke remote.
  • Mengedit lagi setelah git add lalu langsung commit. Edit terakhir tertinggal, terlihat sebagai MM di git status -s.
  • Menghapus atau mengedit isi .git secara 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 .git adalah repositori sebenarnya: menghapusnya berarti menghapus seluruh riwayat.

Selesaikan bab ini

  1. 1. Baca materi
  2. 2. Kuis (4 soal)

Cek pemahaman

  1. 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 -s
  2. 2Objek Git yang menyimpan isi file tanpa nama file disebut apa?

  3. 3Git menyimpan setiap commit sebagai diff terhadap commit sebelumnya.

  4. 4Apa yang bisa disimpulkan dari output berikut?

    $ git cat-file -p HEAD^{tree}
    100644 blob c79f97b548aa7452add2b3d9938286850db8693e	README.md
    100644 blob c79f97b548aa7452add2b3d9938286850db8693e	salinan.md