Giới thiệu
Chào các lập trình viên, 👋
Khi bạn thực hiện lệnh git init, bạn đang khởi tạo một kho Git, đúng không? Đúng vậy — nhưng hãy cùng tìm hiểu sâu hơn về những gì thực sự diễn ra và lý do tại sao nó lại quan trọng.
Nếu bạn đã đọc bài viết trước của tôi về các lớp của Git, bạn sẽ nhớ rằng lớp cốt lõi của Git được gọi là lớp lưu trữ. Lớp này chịu trách nhiệm lưu trữ và quản lý nội dung (mã nguồn) của chúng ta. Nếu không có lớp này, Git không có nơi nào để lưu giữ lịch sử dự án của bạn.
Thư Mục .git
Khi bạn gõ git init, Git tạo một thư mục có tên là .git trong thư mục dự án của bạn. Bên trong, Git thiết lập một cấu trúc thư mục hoàn chỉnh mà nó sẽ sử dụng để theo dõi các thay đổi, quản lý phiên bản và thực hiện các thao tác tuyệt vời mà chúng ta sử dụng hàng ngày.
Một số thành phần chính bên trong .git bao gồm:
- objects/ → nơi Git lưu trữ tất cả dữ liệu của bạn dưới dạng các đối tượng (commits, trees, và blobs).
- refs/ → chứa các tham chiếu đến nhánh và thẻ.
- HEAD → một tệp chỉ đến nhánh hiện tại của bạn.
- config → cài đặt riêng cho kho lưu trữ.
- index → tệp khu vực tạm thời theo dõi các thay đổi mà bạn đã thêm.
Thư Mục Objects
Hãy nói về thư mục objects/ vì đó là nơi phép thuật diễn ra.
Đây là vị trí lưu trữ tất cả nội dung của bạn, và Git không chỉ đơn giản là lưu trữ các tệp ở đây. Thay vào đó, Git sử dụng thuật toán băm SHA-1 để băm nội dung và sau đó lưu trữ nó.
Và đây là phần quan trọng: Git chỉ quan tâm đến nội dung, không phải tên tệp.
- Nội dung thực tế của một tệp được lưu trong một khối dữ liệu.
- Git sau đó tạo một băm cho nội dung đó và sử dụng nó như một tham chiếu.
- Tên tệp, cấu trúc thư mục và các commit được lưu trữ như siêu dữ liệu bổ sung, nhưng cốt lõi của tất cả là băm nội dung.
Ví Dụ Nhanh
Để thấy cách Git hoạt động, hãy thử lệnh sau:
echo "Hello Git" | git hash-object --stdin
Bạn sẽ nhận được một băm SHA-1 dưới dạng đầu ra. Điều đó cơ bản cho thấy cách Git lưu trữ dữ liệu bên trong — nó chuyển đổi nội dung thành một băm và sử dụng băm đó làm định danh.
👉 Lưu ý:
git hash-objectlà một lệnh plumbing.- Dấu
|(pipe) lấy đầu ra bên trái (echo "Hello Git") và chuyển nó làm đầu vào cho lệnh bên phải (git hash-object).- Tham số
--stdincho phép Git đọc nội dung trực tiếp từ đầu vào tiêu chuẩn.
Điều này sẽ trông như sau:
Điều thú vị là: nội dung chưa được lưu trữ. Những gì bạn vừa thấy là băm mà Git sẽ sử dụng nếu nó lưu dữ liệu này. Để thực sự ghi nó vào cơ sở dữ liệu của Git, bạn cần sử dụng tham số -w:
echo "Hello Git" | git hash-object --stdin -w
Bạn vẫn sẽ nhận được cùng một băm vì nội dung không thay đổi. Nhưng lần này, Git ghi nó vào thư mục objects/ bên trong .git.
Chúng ta vẫn nhận được cùng một băm vì nội dung là như nhau. Nếu bạn kiểm tra thư mục .git/objects của mình bây giờ, bạn sẽ thấy một thư mục mới:
Bên trong đó, bạn sẽ tìm thấy một tệp (gì đó như 4d...) đại diện cho nội dung của bạn. Tệp đó không phải là văn bản thô "Hello Git" mà là một đối tượng nén với siêu dữ liệu. Git luôn lưu trữ dữ liệu theo cách này — đã băm, nén và được tham chiếu.
Những Lưu Ý Quan Trọng
Vì vậy, lần tiếp theo bạn chạy git init, hãy nhớ rằng:
- Bạn không chỉ đơn giản là "bắt đầu một kho lưu trữ."
- Bạn đang yêu cầu Git thiết lập cơ sở dữ liệu của nó (thư mục
.git) nơi nó có thể lưu trữ và theo dõi mọi thứ về dự án của bạn. - Nếu không có bước này, Git sẽ không có nơi nào để lưu giữ lịch sử của bạn.
Tóm lại: git init đặt nền tảng cho tất cả các phép thuật quản lý phiên bản mà theo sau. 🚀
Nếu bạn thấy bài viết này hữu ích, hãy cho tôi một 👍 và theo dõi để nhận phần tiếp theo!