Git
Chapters ▾ 2nd Edition

1.3 Untuk Bermula - Asas Git

Asas Git

Jadi, apakah sebenarnya Git secara ringkas? Ini adalah suatu bahagian yang penting untuk diserap, kerana jika anda memahami apakah Git dan asas bagaimana ia berfungsi, maka menggunakan Git secara efektif mungkin akan menjadi lebih mudah bagi anda. Semasa anda belajar Git, sila mencuba untuk mengosongkan fikiran anda tentang perkara yang telah mungkin anda tahu mengenai VCS yang lain, seperti CVS, Subversion atau Perforce — berbuat demikian akan membantu anda untuk mengelakkan kekeliruan halus apabila anda menggunakan alat ini. Walaupun antara muka pengguna Git cukup serupa dengan VCS yang lain ini, Git mampu menyimpan dan memikirkan maklumat dengan cara yang sangat berbeza, dan memahami perbezaan ini akan membantu anda untuk mengelakkan diri daripada menjadi keliru semasa menggunakannya. (Subversion

Tangkapan Gambar, Bukan Perbezaannya

Perbezaan utama antara Git dan mana-mana VCS yang lain (termasuklah Subversion dan rakannya) adalah cara Git berfikir tentang datanya. Dalam konsepnya, kebanyakan sistem yang lain menyimpan maklumat sebagai suatu senarai mengenai perubahan berasaskan fail. Sistem lain ini (CVS, Subversion, Perforce, Bazaar, dan sebagainya) memikirkan maklumat yang disimpan oleh mereka sebagai satu set fail dan perubahan yang dibuat kepada setiap fail dari semasa ke semasa (ini lazimnya digambarkan sebagai kawalan versi berasaskan-delta ataupun delta-based).

Git menyimpankan data sebagai perubahan kepada suatu versi asas setiap fail.
Figure 4. Menyimpankan data sebagai perubahan kepada suatu versi asas setiap fail.

Git tidak memikirkan atau menyimpankan datanya dengan cara ini. Sebaliknya, Git memikirkan datanya seperti suatu siri tangkapan gambar bagi sistem fail yang kecil. Dengan menggunakan Git, setiap kali anda melakukan sesuatu komit ataupun commit, atau menyimpankan keadaan projek anda, Git sebenarnya mengambil suatu gambar tentang segala fail anda seperti kelihatan pada masa tersebut dan menyimpankan suatu rujukan kepada tangkapan gambar itu. Untuk menjadi cekap, jika fail tidak berubah langsung, Git tidak akan menyimpan fail tersebut lagi, tetapi hanya memberikan satu pautan ke fail serupa yang telah disimpan sebelumnya. Git memikirkan datanya lebih seperti suatu aliran tangkapan gambar.

Menyimpankan data dalam bentuk tangkapan gambar bagi projek sepanjang masa.
Figure 5. Menyimpankan data dalam bentuk tangkapan gambar bagi projek sepanjang masa.

Ini adalah sesuatu perbezaan penting antara Git dan hampir semua VCS yang lain. Ia menjadikan Git membuat pertimbangan semula mengenai hampir setiap aspek kawalan versi yang kebanyakan sistem lain menyalin daripada generasi terdahulu. Ini menjadikan Git lebih seperti suatu sistem fail mini dengan beberapa alat yang sangat hebat yang dibina di atasnya, dan bukannya hanya sekadar VCS. Kami akan menerokai beberapa manfaat yang boleh anda peroleh dengan memikirkan data anda dengan cara ini apabila kami membincangkan percabangan Git ataupun Git branching dalam Git Branching.

Hampir Setiap Operasi Adalah Bersifat Tempatan

Kebanyakan operasi di Git hanya memerlukan fail dan sumber tempatan untuk beroperasi — dan secara amnya maklumat daripada komputer lain di rangkaian anda adalah tidak diperlukan. Sekiranya anda sudah biasa dengan CVCS di mana kebanyakan operasi mempunyai overhed kependaman rangkaian, aspek Git ini akan membuatkan anda berfikir bahawa dewa-dewa kelajuan telah memberkati Git dengan kuasa-kuasa yang bukan milik dunia ini. Hal ini kerana anda akan mempunyai sejarah keseluruhan projek di cakera tempatan anda, dan kebanyakan operasinya akan kelihatan hampir serta-merta.

Sebagai contohnya, untuk melayari sejarah sesuatu projek, Git tidak perlu untuk keluar ke pelayan untuk mendapatkan sejarah dan memaparkannya untuk anda — ia hanya membacakannya terus daripada pangkalan data tempatan anda. Ini bermakna bahawa anda boleh melihat sejarah projek hampir dengan serta-merta. Sekiranya anda ingin melihat perubahan yang diperkenalkan antara versi fail sekarang dan fail dari sebulan yang lalu, Git boleh mencari fail sebulan yang lalu dan melaksanakan suatu pengiraan perbezaan tempatan, dan tidak perlu untuk meminta pelayan bersifat jauh untuk melakukannya atau menarik suatu versi lama fail daripada pelayan bersifat jauh untuk melakukannya secara tempatan.

Ini juga bermakna bahawa hanya terdapat sedikit perkara yang tidak boleh anda lakukan jika anda berada di luar talian atau di luar VPN. Jika anda berada di atas sesuatu pesawat atau kereta api dan ingin melakukan kerja kecil, anda boleh melakukannya dengan gembira (kepada salinan tempatan ataupun local anda, masih ingat?) sehingga anda mendapat suatu sambungan rangkaian untuk dimuat naikkan kerja. Jika anda pulang ke rumah dan tidak dapat membuatkan klien VPN anda berfungsi dengan betul, anda masih boleh bekerja. Dalam banyak sistem yang lain, untuk membuat demikian adalah mustahil atau sangat menyusahkan. Dalam Perforce, sebagai contoh, anda tidak boleh membuatkan banyak apabila anda tidak dapat disambungkan ke pelayan; dan dalam Subversion dan CVS, anda masih boleh menyunting fail, tetapi anda tidak boleh melakukan perubahan kepada pangkalan data anda (kerana pangkalan data anda adalah di luar talian). Ini mungkin tidak kelihatan seperti suatu masalah besar, tetapi anda akan terkejut dengan betapa besarnya perbezaan yang boleh dibuatkannya.

Git Mempunyai Integriti

Segala-galanya dalam Git adalah telah diperiksa dan diringkaskan sebelum disimpan dan kemudian dirujuk kepada pemeriksaan itu. Ini bermakna bahawa adalah mustahil untuk mengubah kandungan dalam mana-mana fail atau direktori tanpa diketahui oleh Git mengenainya. Fungsi ini dibina ke dalam Git pada tahap yang paling rendah dan diintegrasikan ke dalam falsafahnya. Anda tidak akan kehilangan maklumat dalam transit atau mendapat korupsi fail tanpa dikesan oleh Git mengenainya.

Mekanisme yang digunakan oleh Git untuk pemeriksaan ini adalah dikenali sebagai cincangan SHA-1 ataupun SHA-1 hash. Ini merupakan rentetan yang berpanjang 40 aksara terdiri daripada aksara heksadesimal (0-9 dan a-f) dan dikirakan berdasarkan kandungan fail atau struktur direktori dalam Git. Sesuatu cincangan SHA-1 adalah kelihatan seperti ini:

24b9da6552252987aa493b52f8696cd6d3b00373

Anda akan dapat melihat nilai cincangan ini di seluruh tempat dalam Git kerana ia menggunakannya dengan banyak. Malah, Git menyimpankan segala-galanya dalam pangkalan datanya bukan dengan nama fail tetapi dengan nilai cincangan bagi kandungannya.

Git Hanya Menambahkan Data Secara Amnya

Apabila anda melakukan sesuatu tindakan di dalam Git, hampir kesemua mereka hanya menambahkan data ke dalam pangkalan data Git. Adalah sukar untuk membuatkan sistem untuk melakukan apa-apa sahaja yang tidak dapat dibatalkan atau membuatkannya untuk memadamkan data dengan apa jua cara sekalipun. Seperti dengan mana-mana VCS, anda boleh kehilangan atau merosakkan perubahan yang belum anda lakukan, tetapi selepas anda melakukan suatu tangkapan gambar kepada Git, ia adalah sangat sukar untuk dihilangkan, terutama sekali jika anda selalu menyimpan pangkalan data anda kepada repositori yang lain.

Ini menjadikan penggunaan Git sesuatu yang boleh membawa kegembiraan kerana kami tahu bahawa kami boleh mencuba tanpa memikirkan bahaya bahawa merosakkan sesuatu dengan teruk. Untuk mengetahui lebih lanjut mengenai bagaimana Git menyimpankan datanya dan bagaimana anda boleh memulihkan data yang kelihatannya hilang, sila lihat Undoing Things.

Tiga Keadaan Git

Sila ambil perhatian sekarang — terdapat di sini adalah perkara utama yang perlu diingat mengenai Git jika anda mahukan proses pembelajaran anda berjalan lancar. Git mempunyai tiga keadaan utama di mana fail anda boleh berada: committed, modified, dan staged:

  • Dilakukan komit ataupun committed bermaksud bahawa data telah disimpan dengan selamat dalam pangkalan data tempatan anda.

  • Dimodifikasikan ataupun modified bermakna anda telah menukarkan fail tetapi belum melakukan komit ke dalam pangkalan data anda lagi.

  • Dipentaskan ataupun staged bermakna anda telah menandakan sesuatu fail yang telah diubah suai dalam versi semasa untuk seterusnya masuk ke dalam komit anda seterusnya.

Ini membawa kami kepada tiga bahagian utama bagi sesuatu projek Git: direktori Git, pokok kerja, dan kawasan pementasan.

Pokok kerja, kawasan pementasan, dan direktori Git.
Figure 6. Pokok kerja, kawasan pementasan, dan direktori Git.

Direktori Git adalah tempat di mana Git menyimpankan metadata dan pangkalan data objek untuk projek anda. Ini adalah bahagian yang paling penting dalam Git, dan ia adalah apa yang disalin apabila anda mengeklonkan ataupun clone sebuah repositori daripada komputer lain.

Pokok kerja adalah satu semakan tunggal bagi satu versi projek. Fail-fail ini dikeluarkan daripada pangkalan data yang dimampatkan dalam direktori Git dan diletakkan pada cakera untuk anda menggunakan atau mengubahkannya.

Kawasan pementasan adalah suatu fail, yang lazimnya terkandung dalam direktori Git anda, menyimpankan maklumat tentang apa yang akan masuk ke dalam komit anda seterusnya. Nama teknikalnya dalam istilah Git adalah “indeks”, tetapi frasa “kawasan pementasan” berfungsi dengan baik juga.

Aliran kerja asas Git adalah sesuatu yang sebegini:

  1. Anda mengubah suai fail dalam pokok kerja anda.

  2. Anda hanya mementaskan secara selektif perubahan yang anda mahukan untuk menjadi sebahagian daripada komit anda berikutnya, yang hanya menambahkan perubahan tersebut kepada kawasan pementasan.

  3. Anda melakukan suatu komit, yang mengambil masuk fail seperti keadaan mereka semasa berada di kawasan pementasan dan menyimpankan tangkapan gambar itu secara kekal ke dalam direktori Git anda.

Jika sesuatu versi fail tertentu berada dalam direktori Git, ia dianggap committed. Jika ia telah diubah suai dan ditambahkan ke dalam kawasan pementasan, ia adalah staged. Dan jika ia telah diubah suai sejak ia disemak tetapi belum lagi dipentaskan ataupun staged, ia adalah modified. Dalam Git Basics, anda akan mempelajari lebih lanjut mengenai keadaan-keadaan ini dan bagaimana anda boleh mengambil kesempatan daripada mereka atau melangkaui bahagian dipentaskan sepenuhnya.

scroll-to-top