Là một lập trình viên chắc chắn chúng ta ai cũng đã làm việc với GIT và bạn cũng có lẽ đã nhận ra rằng luôn có một thư mục ẩn tên là .git nằm trong bất kỳ một git repository. Thư mục .git này bị ẩn để ngăn việc vô tình xóa hoặc sửa đổi thư mục. Lịch sử phiên bản của repository sẽ bị mất nếu thư mục này bị xóa.
Nhưng bạn có thể chưa bao giờ nghĩ về các chi tiết nội dung của nó. Vậy hãy cùng xem bên trong thư mục ấy mọi thứ được tổ chức như thế nào!
Git tối ưu hóa nội dung của thư mục .git về kích thước và tốc độ. Vì vậy, bạn không thể vào nó xem các tệp của mình một cách rõ ràng. Tất cả các tệp đối tượng đều được đặt tên theo một quy luật và dữ liệu được nén bằng zlib.
Để tóm tắt đơn giản các file, thư mục bên trong được nhóm thành các loại chính như sau:
- Đối tượng (Object) – (màu xanh lam) Những đối tượng này đại diện cho các tệp và thay đổi. Các đối tượng có thể được chia thành các commits, trees, and blobs. Chúng chứa giá trị băm của các sự kiện được git thực hiện. Git theo dõi và nhận ra mọi thứ bằng cách chuyển đổi nó thành giá trị băm.
- Tham chiếu (Refs) – (màu đỏ) Đây là những tệp bạn có thể đọc được, dùng để tổ chức các đối tượng
- Nhật ký (Logs) – (màu xanh lá cây) Những nhật ký này được sử dụng để nhanh chóng tạo nhật ký hiển thị cho người dùng. Đây chính là nơi chứa thông tin cho các câu lệnh git log, git reflog chuyên dùng để cứu rỗi các tình huống xóa nhầm code
- Cấu hình (Config) – (xám nhạt) được sử dụng để cấu hình hành vi của git
- hooks – Thư mục này chứa các script, được thực thi trước hoặc sau các sự kiện như commit, push.
- HEAD − Tệp này lưu trữ tham chiếu đến nhánh hiện tại. Nó trỏ đến nhánh chính theo mặc định.
- index – khu vực staging, bao gồm các meta-data such như là timestamps, file names và cả SHAs của các tiệp được add vào staging
- info – chứa tệp loại trừ (exclude) bên trong nó. Như tên cho thấy, tệp loại trừ được sử dụng để loại trừ một số mẫu cụ thể trong mã mà bạn không muốn Git đọc
Như vậy thư mục .git chứa thông tin chi tiết về từng thay đổi được thực hiện đối với repository. Ở bài sau, chúng ta sẽ tìm hiểu cơ chế vì sao tất cả các snapshot về các sửa đổi sẽ được ghi lại trong thư mục này giống như một cơ sở dữ liệu, giúp có thể hoàn tác các thay đổi và khôi phục về phiên bản mà ta mong muốn.