Cara Git berpikir

Model data Git: commit sebagai snapshot, perbedaannya dengan diff, dan fakta bahwa hampir semuanya bersifat lokal.

Daftar isi

Git memodelkan sebuah proyek sebagai kumpulan objek yang saling menunjuk, bukan sebagai kumpulan berkas yang diubah satu per satu. Topik ini membahas model data tersebut: commit sebagai snapshot, perbedaannya dengan model selisih (delta), fakta bahwa hampir semua operasi Git bersifat lokal, dan tiga jenis objek inti yang menjadi fondasi seluruh perintah Git. Model ini menjadi dasar perilaku seluruh perintah Git pada jalur ini.

Snapshot, bukan selisih#

Banyak sistem kontrol versi yang lebih tua menyimpan versi sebagai selisih, yaitu baris-baris yang dihapus dan ditambahkan sejak versi sebelumnya. Untuk membaca keadaan versi kelima, sistem tersebut harus menerapkan empat lapis selisih secara berurutan. Model ini hemat penyimpanan, tetapi membuat setiap operasi bergantung pada seluruh rantai yang ada di depannya.

Git memilih model yang berlawanan. Setiap commit menyimpan snapshot, yaitu gambaran utuh dari seluruh berkas yang dilacak pada saat commit itu dibuat. Untuk berkas yang tidak berubah sejak commit sebelumnya, Git tidak menyalin ulang isinya, melainkan menyimpan penunjuk ke objek berkas yang sudah ada. Dengan demikian, snapshot tetap hemat ruang tanpa kehilangan sifatnya sebagai keadaan yang berdiri sendiri, dan membaca versi mana pun tidak memerlukan penerapan ulang selisih.

Hampir semuanya lokal#

Hampir semua operasi Git bekerja pada basis data yang tersimpan di dalam folder .git milik repository itu sendiri. Menelusuri riwayat, membandingkan dua versi, membaca siapa yang mengubah sebuah baris, dan membuat branch semuanya dibaca dari disk lokal, tanpa jaringan dan tanpa menunggu server. Konsekuensinya, pekerjaan tetap berjalan penuh ketika tidak ada koneksi internet, selama sinkronisasi dengan repository jarak jauh belum diperlukan.

Sifat lokal ini juga menjadi sumber kecepatan Git. Operasi yang pada sistem terpusat memerlukan perjalanan bolak-balik ke server dapat dijawab langsung dari disk. Sinkronisasi dengan repository lain memang memerlukan jaringan, tetapi itu hanya bagian kecil dari pekerjaan sehari-hari.

Tiga jenis objek inti#

Basis data Git tersusun atas tiga jenis objek yang muncul pada setiap repository. Objek blob menyimpan isi sebuah berkas. Objek tree menyimpan struktur sebuah direktori, yaitu daftar nama berkas dan folder beserta penunjuk ke objeknya. Objek commit menyimpan snapshot sebuah tree beserta metadata, yaitu penulis, waktu, commit induk (parent), dan pesan.

Setiap objek diberi nama berupa hash, yaitu deretan heksadesimal yang dihitung dari isinya. Sifat penamaan ini penting dalam dua arah. Isi yang sama persis selalu menghasilkan hash yang sama, sehingga Git dapat mendeteksi berkas yang tidak berubah dan tidak menduplikasinya. Sebaliknya, perubahan sekecil apa pun pada isi menghasilkan hash yang berbeda, sehingga kerusakan data dapat terdeteksi secara otomatis.

Kaitan antara objek commit, tree, dan blobcommit 8f3a1c2tree: 55b1880parent: (tidak ada)author: Budipesan: Commit awaltree 55b1880catatan.txt → blob a91b7d4blob a91b7d4"Baris pertama catatan."menunjukmenunjuk
Kaitan antara objek commit, tree, dan blob pada basis data Git

Diagram di atas memperlihatkan rantai tiga objek tersebut. Commit menunjuk tree miliknya, tree menunjuk blob untuk setiap berkas, dan commit selanjutnya menunjuk commit sebelumnya melalui parent. Seluruh mekanika percabangan, penggabungan, dan pembatalan hanyalah pengoperasian penunjuk-penunjuk ini.

Keutuhan data dijamin checksum#

Sebelum menyimpan apa pun, Git menghitung checksum atas isinya dan menyimpan objek dengan hash itu sebagai namanya. Mekanisme ini berlaku untuk blob, tree, commit, dan setiap transfer antar repository. Apabila sebuah berkas rusak pada disk atau sebuah transfer terpotong, hash yang diterima tidak akan cocok dengan isinya, dan Git melaporkan ketidakcocokan itu alih-alih membiarkan data rusak diperlakukan sebagai sah.

Keamanan model ini bergantung pada kejujuran hash, sehingga hash yang sama selalu berarti isi yang sama. Prinsip inilah yang membuat perintah git status dapat mengetahui perubahan tanpa membandingkan seluruh isi berkas berulang kali, dan yang membuat dua repository yang berbeda mesin dapat memverifikasi bahwa keduanya menyimpan sejarah yang identik.

Ringkasan#

  • Git menyimpan setiap commit sebagai snapshot utuh proyek, bukan rangkaian selisih antar versi.
  • Hampir semua operasi Git membaca basis data lokal di .git, sehingga riwayat dan perbandingan versi tersedia tanpa jaringan.
  • Basis data tersusun atas objek blob, tree, dan commit yang masing-masing dinamai dengan hash isinya, sehingga isi yang sama berbagi objek yang sama dan kerusakan data terdeteksi.

Referensi#