Panduan Git Bagian nomor 1: semua yang perlu Anda ketahui tentang direktori .git



Mulai menggunakan Git seperti mengunjungi negara baru yang bahasanya tidak Anda kenal. Meskipun jelas di mana Anda berada dan ke mana harus pergi, semuanya baik-baik saja, tetapi jika Anda tersesat, masalah besar dimulai.

Ada banyak tutorial tentang perintah Git di Internet, tetapi dalam artikel ini, pekerjaan Git lebih dalam dari sekadar mempelajari perintah.

Ini adalah bagian pertama dari Git panduan dari Pierre de Wulf blog yang diterjemahkan oleh Solusi Mail.ru Cloud tim

Pengguna baru merasa sulit untuk merasa nyaman dengan Git. Ini adalah alat yang ampuh, tetapi, sayangnya, tidak terlalu mudah dipelajari. Banyak konsep baru, perintah yang melakukan tindakan berbeda, jika file dilewatkan sebagai parameter atau tidak, umpan balik tidak jelas ...

Mungkin satu-satunya cara untuk mengatasi semua kesulitan ini adalah belajar sedikit lebih dari sekadar git commit / push, untuk memahami cara kerja Git.

Folder .Git


Ketika Anda membuat repositori baru dengan perintah git init, Git membuat folder ajaib, .git. Ini berisi semua yang Anda butuhkan agar Git bekerja. Jika Anda ingin menghapus Git dari proyek Anda, tetapi meninggalkan file proyek pada disk, cukup hapus folder .git. Meskipun siapa yang mungkin membutuhkan ini?

    ├── HEAD
    ├── branches
    ├── config
    ├── description
    ├── hooks
    │ ├── pre-commit.sample
    │ ├── pre-push.sample
    │ └── ...
    ├── info
    │ └── exclude
    ├── objects
    │ ├── info
    │ └── pack
    └── refs
     ├── heads
     └── tags


Berikut adalah isi dari folder .git yang khas sebelum komit pertama Anda:

  1. KEPALA - kami akan mempertimbangkan ini nanti.
  2. config — , , , url , , email . git config, .
  3. description — gitweb .
  4. hooks — , Git. , , / commit/rebase/pull… . push .
  5. info - kecualikan - file yang tidak ingin Anda sertakan dalam repositori dijelaskan di sini. Fungsionalitas dari file ini sama dengan file .gitignore, kecuali tidak ditransfer ke repositori. Dalam praktiknya, biasanya .gitignore sudah cukup untuk semua tugas.

Apa yang ada di dalam komit?


Setiap kali Anda membuat file dan melakukan perubahan, Git mengarsipkan file dan menyimpannya dalam struktur datanya. Objek yang diarsipkan dibuat dengan nama unik dan disimpan di folder objek.

Sebelum memeriksa folder objek, mari kita perjelas apa komit itu. Komit adalah nugget status file saat ini di folder yang berfungsi, tetapi tidak hanya itu.

Bahkan, ketika Anda melakukan perubahan, Git melakukan hanya dua hal:

  1. Jika file di folder kerja tidak berubah, itu hanya menambahkan nama file yang dikompresi (hash) ke snapshot.
  2. Jika file dalam folder yang berfungsi telah berubah, itu memampatkannya, menempatkannya di folder objek dan menambahkan nama file terkompresi (hash) ke snapshot.

Tentu saja, di sini semuanya dijelaskan dengan cara yang agak disederhanakan, namun, ini cukup untuk memahami proses yang sedang berlangsung.

Segera setelah snapshot diambil, itu juga diarsipkan dan dinamai dengan hash, kemudian ditempatkan di folder objek.

├── 4c
│ └── f44f1e3fe4fb7f8aa42138c324f63f5ac85828 // hash
├── 86
│ └── 550c31847e518e1927f95991c949fc14efc711 // hash
├── e6
│ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 // hash
├── info // let's ignore that
└── pack // let's ignore that too


Ini adalah apa yang tampak seperti folder objek setelah saya membuat file_1.txt dan melakukan itu. Harap dicatat bahwa jika hash file Anda dimulai dengan "4cf44f1e ...", maka Git akan menyimpannya dengan nama "f44f1e ..." di subfolder bernama "4c". Dengan demikian, file akan ditata dalam 256 subfolder dan masing-masing tidak akan memiliki terlalu banyak file.

Seperti yang Anda lihat, kami memiliki tiga hash. Satu untuk file_1.txt, yang kedua untuk snapshot diambil di komit. Untuk apa yang ketiga? Hash ketiga dibuat karena komit juga merupakan objek, juga diarsipkan dan ditempatkan di folder objek.

Anda harus ingat bahwa commit terdiri dari empat hal:

  1. Nama (hash) dari snapshot dari direktori yang berfungsi.
  2. Komentar.
  3. Informasi tentang siapa yang mengeksekusi komit.
  4. Hash dari orang tua komit.

Lihat sendiri apa yang terjadi jika Anda mengekstrak file komit:

git cat-file -p 4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828

Dan inilah yang akan Anda lihat:

tree 86550c31847e518e1927f95991c949fc14efc711
author Pierre De Wulf 
<test[@gmail.com](mailto:pierredewulf31@gmail.com)> 1455775173 -0500
committer Pierre De Wulf 
<[test@gmail.com](mailto:pierredewulf31@gmail.com)> 1455775173 -0500
commit A

Anda melihat, seperti yang diharapkan, hash dari snapshot, penulis, dan komentar dari commit. Dua hal penting di sini:

  1. Hash snapshot "86550 ..." juga merupakan objek dan dapat dilihat di folder objek.
  2. Karena ini adalah komit pertama, komit tidak memiliki induk.

Apa yang sebenarnya ada dalam gambar?

git cat-file -p 86550c31847e518e1927f95991c949fc14efc711
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file_1.txt

Di sini kita melihat objek yang ada di penyimpanan objek kita, satu-satunya objek dalam gambar kita.

Cabang, tag, KEPALA adalah satu dan sama


Sekarang Anda mengerti bahwa semua yang ada di Git dapat diperoleh melalui hash yang benar. Mari kita lihat KEPALA sekarang. Jadi, apa yang ada di sana?

cat HEAD
ref: refs/heads/master

Tidak ada hash, dan itu masuk akal, karena HEAD adalah penunjuk ke atas cabang yang Anda kerjakan. Jika Anda melihat file referensi / kepala / master, Anda akan melihat:

cat refs/heads/master
4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828
 

Terlihat tidak asing? Tentu saja, ini adalah hash dari commit pertama! Ini menunjukkan bahwa tag dan cabang hanyalah petunjuk untuk komit. Memahami ini, Anda dapat menghapus semua tag yang Anda inginkan, semua cabang yang Anda inginkan, dan komit yang mereka tunjuk akan tetap di tempatnya. Satu-satunya hal, akan lebih sulit untuk mengaksesnya. Jika Anda ingin tahu lebih banyak tentang ini, lihat buku git .

Komentar terakhir


Setelah membacanya, seharusnya menjadi jelas bagi Anda bahwa semua yang dilakukan Git adalah mengarsipkan folder kerja Anda dan meletakkannya di folder objek dengan beberapa informasi tambahan. Jika Anda cukup terbiasa dengan Git, maka Anda memiliki kendali penuh atas file mana yang akan dimasukkan dalam komit dan mana yang tidak.

Saya percaya bahwa melakukan bukan snapshot dari folder yang berfungsi, tetapi snapshot dari file yang ingin Anda komit. Dan di mana Git menyimpan daftar file yang ingin Anda komit? Ini menyimpan daftar ini dalam file indeks. Kami tidak akan mempelajari secara mendalam masalah ini, jika Anda tertarik, lebih detail dapat ditemukan di sini .

Diterjemahkan dengan dukungan dari Mail.ru Cloud Solutions .

Apa lagi yang harus dibaca :

  1. Metode Caching Sederhana di GitLab CI: Panduan Gambar .
  2. -Agile .
  3. .


All Articles