Tìm hiểu bên trong Git: Đối tượng & Hashing

Git nhanh và đáng tin cậy nhờ vào cách nó lưu trữ dữ liệu. Để làm chủ Git, bạn phải hiểu thư mục .git. Thư mục ẩn này chứa mọi thứ Git cần để theo dõi dự án của bạn.

Git sử dụng bốn loại đối tượng chính để quản lý công việc của bạn:

  • Blobs: Lưu trữ nội dung tệp.
  • Trees: Lưu trữ cấu trúc thư mục và tên tệp.
  • Commits: Lưu trữ các bản chụp (snapshots) của dự án và siêu dữ liệu (metadata).
  • Tags: Lưu trữ các tham chiếu đến các phiên bản cụ thể.

Git định danh mọi thứ bằng cách sử dụng hashing. Nó sử dụng thuật toán SHA-1 để chuyển đổi dữ liệu thành một ID duy nhất. ID này đóng vai trò như một dấu vân tay. Nếu bạn thay đổi chỉ một ký tự trong tệp, mã hash sẽ thay đổi hoàn toàn.

Cách Git tạo ra một bản chụp (snapshot):

Khi bạn commit một tệp, Git sẽ tạo ra một chuỗi các đối tượng.

  1. Blob lưu trữ văn bản hoặc dữ liệu thực tế trong tệp của bạn.
  2. Tree ánh xạ blob đó với một tên tệp và đường dẫn thư mục cụ thể.
  3. Commit liên kết tree với tác giả, dấu thời gian và một thông điệp.

Git không lưu trữ các thay đổi hay "deltas". Nó lưu trữ các bản chụp (snapshots). Mỗi khi bạn commit, Git sẽ tạo ra các đối tượng mới. Điều này giúp lịch sử của bạn không thể bị thay đổi (immutable) và dễ dàng khôi phục.

Hiểu được cấu trúc này sẽ giúp bạn sửa lỗi, khôi phục dữ liệu đã mất và quản lý các nhánh (branches) phức tạp.

Hãy thử dự án nhỏ này để thấy nó hoạt động thực tế:

  1. Khởi tạo một repo: mkdir git-lab cd git-lab git init

  2. Tạo một tệp và tìm mã hash của nó: echo 'Hello Git' > hello.txt git hash-object hello.txt

  3. Lưu tệp dưới dạng một blob: git hash-object -w hello.txt

  4. Kiểm tra loại đối tượng và nội dung: git cat-file -t [YOUR_HASH] git cat-file -p [YOUR_HASH]

  5. Tạo một commit và xem tree: git add hello.txt git commit -m 'Initial commit' git ls-tree HEAD

Khi tìm hiểu sâu vào bên trong, bạn sẽ thấy Git không chỉ đơn thuần là một công cụ quản lý phiên bản. Nó là một cơ sở dữ liệu được tổ chức cực kỳ chặt chẽ của các đối tượng được định danh bằng nội dung (content-addressed objects).

Source: https://dev.to/lotanna_obianefo/inside-git-objects-hashing-44gc

Optional learning community: https://t.me/GyaanSetuAi