Pattern trong Git
Mô hình dữ liệu của Git được xây dựng trên các object bất biến copy-on-write và diff hiệu quả.
| Pattern | Ở đâu | Tác dụng |
|---|---|---|
| Copy-on-Write | object-file.c | Object bất biến địa chỉ-theo-nội-dung; các branch chia sẻ dữ liệu, chỉ copy khi đổi |
| Diff / Patch | diff.c, xdiff/ | Thuật toán diff Myers cho khoảng cách chỉnh sửa tối thiểu giữa các phiên bản file |
| Bitmask | read-cache-ll.h | Flag entry cache CE_* — staged, valid, intent-to-add |
| Bloom Filter | bloom.c | Bloom filter cho đường dẫn đã đổi, giúp git log -- <path> nhanh hơn |
| Trie | read-cache.c | Bảng hash tên cho tra cứu path cấp thư mục nhanh |
| LRU Cache | pack-objects.c | Cache delta base để tái dùng delta đã tính khi pack |
| Merkle Tree | tree.c | DAG Merkle địa chỉ-theo-nội-dung — mỗi commit, tree, blob đều được hash; đổi một byte là đổi tất cả hash lên tới root |
Cách chúng kết hợp: git commit
Khi bạn chạy git commit, nhiều pattern phối hợp để tạo một snapshot bất biến và có thể xác minh:
git commit -m "fix bug"▼Git computes the diff between the index (staging area) and the working tree to determine what changed.
Changed files become new blob objects. Unchanged files are shared by reference (same SHA-1 → same object). No data is copied unless it actually changed.
Tree objects hash their children. A changed blob changes its parent tree hash, which changes the commit hash. Any tampering anywhere is detectable from the root.
The commit-graph file stores changed-path bloom filters. Future git log queries can skip commits that didn't touch a given path without reading the tree.
Insight cốt lõi là copy-on-write + hash Merkle cho Git vừa hiệu quả không gian (object dùng chung) vừa xác minh được toàn vẹn (hash bất khả giả mạo) mà không phải đánh đổi cái này lấy cái kia.