COMMIT LÀ GÌ TRONG GIT?
Bài đăng này đã không được cập nhật trong 3 năm
Khi làm việc với Git chúng ta thường hay nói về commit trong các thao tác như merge, rebase, cherry-pick… Để làm chủ và hiểu được sức mạnh thực sự của Git trước tiên chúng ta cần phải hiểu khái niệm một commit là gì. Để trả lời được câu hỏi này hãy xem xét đến cách lưu trữ dữ liệu trong Git.
Sau khi khởi tạo git bằng lệnh “git init” trong một thư mục, Git sẽ tạo ra một thư mục .git lưu trữ toàn bộ database và các thao tác đối với các dữ liệu này. Đây là list các thư mục con và các file trong .git
HEAD, branches/, config, description, hooks/ index, info/, objects/, refs/
trong đó thư mục objects/ là thư mục lưu trữ tất cả nội dung của database bao gồm 4 object cơ bản:
- tree : tương đương như một directory
- blob: tương đương một file
- commit
- tag
Mỗi một object trong git được định danh bởi một id duy nhất dài 40 ký tự mã hexa(160 bit) dựa vào SHA-1 hash. Cách tổ chức lưu trữ dữ liệu trong git cũng giống như cách tổ chức file trong linux nhưng đơn giản hơn
Dưới đây là hình ảnh minh họa cách lưu trữ dữ liệu trong Git.
Nhìn vào hình vẽ chúng ta có thể thấy mỗi một commit có 2 con trỏ, một con trỏ trỏ đến thư mục gốc tree, và một con trỏ trỏ đến commit cha của nó. trong đó tree sẽ tham chiếu đến tất cả các thư mục con và các file con của nó, như vậy có thể xem như mỗi một commit trong Git lưu trữ toàn bộ dữ liệu của thư mục(snapshot) chứ không phải là chỉ lưu trữ những thay đổi giữa 2 commit. Dưới đây là một số lệnh để thao tác với Git
- find .git/objects -type f: Hiển thị các object trong thư mục Git
- git cat-file -p “object_id”: Đọc nội dung của object
- git cat-file -t “object_id”: xem kiểu object
- git hash-object -w “filename”: add index cho object (lệnh git add override lệnh này)
- git log –pretty=oneline –graph –all: hiển thị history của tất cả các branch, branch chẳng qua cũng chỉ là một con trỏ tham chiếu đến một commit bất kỳ mà thôi
- git count-objects -v: Đếm tổng số tất cả các object trong .git/object
Các bạn có thể tự tao một project sử dụng Git(merge, rebase…) và kiểm tra xem mọi thứ thực sự diễn ra bên trong Git như thế nào thông qua các câu lệnh trên. Chi tiết và cụ thể hơn được viết trong chương 9 git book.
Tài liệu tham khảo
All rights reserved