Bit yang membingungkan ada di sini:
Git tidak pernah melihat itu sebagai file individual. Git menganggap semuanya sebagai konten lengkap.
Git sering menggunakan hash 160 bit sebagai ganti objek dalam repo sendiri. Pohon file pada dasarnya adalah daftar nama dan hash yang terkait dengan konten masing-masing (ditambah beberapa metadata).
Tetapi hash 160 bit secara unik mengidentifikasi konten (dalam jagat basis data git). Jadi pohon dengan hash sebagai konten termasuk konten dalam kondisinya.
Jika Anda mengubah status konten file, hashnya berubah. Tetapi jika hashnya berubah, hash yang terkait dengan konten nama file juga berubah. Yang pada gilirannya mengubah hash dari "direktori tree".
Ketika database git menyimpan pohon direktori, pohon direktori itu menyiratkan dan mencakup semua konten dari semua subdirektori dan semua file di dalamnya .
Ini diatur dalam struktur pohon dengan (tidak dapat diubah, dapat digunakan kembali) pointer ke gumpalan atau pohon lain, tetapi secara logis itu adalah snapshot tunggal dari seluruh konten seluruh pohon. The representasi dalam database git tidak isi data yang datar, tapi secara logis itu adalah semua data dan tidak ada lagi.
Jika Anda membuat serial pohon ke sistem file, menghapus semua folder .git, dan menyuruh git untuk menambahkan pohon kembali ke dalam database-nya, Anda akan berakhir dengan menambahkan apa-apa ke database - elemen sudah ada di sana.
Mungkin membantu untuk memikirkan hash git sebagai referensi penghitung pointer ke data yang tidak dapat diubah.
Jika Anda membangun aplikasi di sekitar itu, sebuah dokumen adalah sekelompok halaman, yang memiliki lapisan, yang memiliki grup, yang memiliki objek.
Saat Anda ingin mengubah objek, Anda harus membuat grup yang benar-benar baru untuknya. Jika Anda ingin mengubah grup, Anda harus membuat layer baru, yang membutuhkan halaman baru, yang membutuhkan dokumen baru.
Setiap kali Anda mengubah satu objek, itu memunculkan dokumen baru. Dokumen lama terus ada. Dokumen baru dan lama membagikan sebagian besar konten mereka - mereka memiliki halaman yang sama (kecuali 1). Satu halaman itu memiliki layer yang sama (kecuali 1). Lapisan itu memiliki kelompok yang sama (kecuali 1). Grup itu memiliki objek yang sama (kecuali 1).
Dan dengan cara yang sama, maksud saya secara logis salinan, tetapi implementasi-bijaksana itu hanyalah referensi dihitung pointer ke objek abadi yang sama.
Repositori git sangat mirip.
Ini berarti bahwa git changeset yang diberikan berisi pesan komitnya (sebagai kode hash), berisi pohon kerjanya, dan berisi perubahan induknya.
Perubahan orangtua tersebut berisi perubahan orangtua mereka, sepanjang perjalanan kembali.
Bagian dari git repo yang berisi sejarah adalah rantai perubahan itu. Rantai perubahan itu pada tingkat di atas pohon "direktori" - dari pohon "direktori", Anda tidak dapat secara unik mencapai set perubahan dan rantai perubahan.
Untuk mengetahui apa yang terjadi pada suatu file, Anda mulai dengan file itu di changeset. Changeet itu memiliki sejarah. Seringkali dalam riwayat itu, file bernama yang sama ada, kadang-kadang dengan konten yang sama. Jika kontennya sama, tidak ada perubahan pada file. Jika berbeda, ada perubahan, dan pekerjaan harus dilakukan untuk mengetahui apa.
Terkadang file hilang; tetapi, pohon "direktori" mungkin memiliki file lain dengan konten yang sama (kode hash yang sama), jadi kami dapat melacaknya seperti itu (perhatikan; ini sebabnya Anda ingin sebuah komit untuk memindahkan file terpisah dari komit ke -edit). Atau nama file yang sama, dan setelah memeriksa file tersebut cukup mirip.
Jadi git dapat menambal bersama "file history".
Tetapi riwayat file ini berasal dari penguraian efisien "seluruh perubahan", bukan dari tautan dari satu versi file ke yang lain.