Git tidak membuang informasi sendiri *. Semua versi sebelumnya dari setiap file selalu tersedia untuk pengembalian, perbedaan, inspeksi, dan sebagainya.
Pohon utuh versus file individu
Apa yang Anda coba rekonsiliasi adalah gagasan untuk mengakses versi lama dari file individual versus fakta bahwa model sejarah Git terfokus pada keseluruhan pohon. Versi Whole-tree memang membutuhkan sedikit lebih banyak pekerjaan untuk melihat (misalnya) versi foo.c
seperti yang ada sepuluh- foo.c
perubahan lalu versus sepuluh seluruh-pohon-perubahan yang lalu:
# 10 foo.c-changes ago
git show $(git rev-list -n 10 --reverse HEAD -- foo.c | head -1):foo.c
# 10 whole-tree-changes ago
git show HEAD~10:foo.c
Manfaat orientasi pohon, terutama kemampuan untuk melihat commit sebagai unit perubahan yang saling tergantung yang dibuat untuk berbagai bagian dari keseluruhan pohon, secara umum lebih besar daripada mengetik tambahan (yang dapat dikurangi dengan alias, skrip, dan lain-lain) dan waktu CPU dihabiskan menggali melalui komitmen masa lalu.
Efisiensi Penyimpanan
Ketika objek baru (misalnya file dengan konten yang sebelumnya tidak terlihat) memasuki sistem, ia disimpan dengan kompresi polos (zlib) sebagai "objek longgar". Ketika cukup banyak benda longgar terakumulasi (berdasarkan gc.auto
opsi konfigurasi; atau ketika pengguna menjalankan git gc atau salah satu dari perintah pengemasan tingkat rendah), Git akan mengumpulkan banyak benda lepas ke dalam satu "file paket".
Objek dalam file paket dapat disimpan baik sebagai data terkompresi biasa (sama seperti objek longgar, hanya dibundel dengan objek lain), atau sebagai delta terkompresi terhadap beberapa objek lain. Delta dapat dirantai bersama ke kedalaman yang dapat dikonfigurasi ( pack.depth
) dan dapat dibuat terhadap objek yang cocok ( pack.window
mengontrol seberapa luas Git mencari basis delta terbaik; versi file yang tidak terkait secara historis dapat digunakan sebagai basis jika melakukan hal itu akan menghasilkan suatu kompresi delta yang baik). Garis lintang yang diberikan oleh konfigurasi kedalaman dan ukuran jendela mesin kompresi delta sering menghasilkan kompresi delta yang lebih baik daripada kompresi "diff" satu-versi-gaya-lawan-versi-berikutnya / versi sebelumnya yang sebelumnya.
Ini adalah kompresi delta agresif (dikombinasikan dengan kompresi zlib normal) yang sering dapat membiarkan repositori Git (dengan sejarah penuh dan pohon kerja yang tidak terkompresi) mengambil lebih sedikit ruang daripada checkout SVN tunggal (dengan pohon kerja yang tidak terkompresi dan salinan asli).
Lihat bagian Bagaimana Git Menyimpan Objek dan Paket Packfile dari Buku Komunitas Git . Juga manpage paket-objek git .
* Anda dapat memberi tahu Git membuang komit dengan "menulis ulang sejarah" dan dengan perintah seperti git reset , tetapi bahkan dalam kasus ini Git "menggantung" komit yang baru dibuang untuk sementara waktu, kalau-kalau Anda memutuskan Anda membutuhkannya. Lihat git reflog dan git pangkas .