Mình mới hoàn thành xong course “How Git Works“, thấy rất hay nên muốn viết lại 1 bài để lưu lại kiến thức, chứ ko có ý định ăn cắp gì cả. Mình khuyến khích các bạn vào học khóa này, cực kỳ hay.

Nội dung bài viết
I. Persistent Map
- Map là cấu trúc để lưu dữ liệu dưới dạng key-value
- Persistent Map là những cặp key-value không thể sửa đổi, chỉ có thể thêm và xóa, KHÔNG sửa.
Vậy cái gì là key, cái gì là value???
- Value là nội dung file dưới dạng chuỗi bytes
- Key là nội dung file được hash bằng thuật toán SHA-1, dù dài hay ngắn thì nội dung file sẽ được hash thành 1 chuỗi hex có độ dài 40 ký tự, và content giống nhau sẽ cho ra hash giống nhau, content khác nhau có khả năng ra hash giống nhau, nhưng tỉ lệ ấy bằng 6 lần trúng Jackpot liên tiếp (tỷ lệ ăn 1 lần jackpot thì 1/175.000.000)

II. Content tracker
Content tracker có nghĩa là theo dõi và lưu thông tin file và folder sau mỗi lần thay đổi
Để làm được việc này, Git sử dụng 1 database được xây dựng trên 4 objects (đối tượng) chính:
- Blob: key-value của file
- Tree: key-value của folder, trong tree chứa pointer trỏ đến tree và blob
- Commit: chứa pointer trỏ đến tree
- Annotated Tag: 1 pointer trỏ đến commit


- Blue là blob
- Green là tree
- Orange là commit
Git lưu blob, tree, commit ở đâu? —> ở folder .git\objects
nhé
III. Version Control
Để từ Content Tracker –> Version Control, thì git phải có cách để giúp người dùng có thể đi đến mọi thời điểm trong quá khứ, đó chính là 1 hệ thống branch.
Branch chỉ là reference (pointer) trỏ vào 1 commit nào đó.

Ở đây ta có
- Commit cd67
- 2 branch main và ideas đều trỏ vào commit đó
- HEAD trỏ vào branch main
Khi branch main có 1 commit mới thì, main trỏ vào commit mới, HEAD di chuyển theo main

Khi chuyển sang 1 branch mới, thực chất là bạn thay đổi nội dung của file HEAD, HEAD trỏ lại vào ideas

Khi bạn đang ở nhánh main, bạn merge nhánh ideas vào main, thực chất là bạn tạo ra 1 commit mới, và main, HEAD trỏ vào commit mới.

Khi bạn đang ở nhánh spaghetti, bạn rebase lên nhánh main thì, git sẽ copy cái nhánh spaghetti và nối vào nhánh main.


Phần thừa ra sẽ bị unreachable và git sẽ xóa bỏ, cuối cùng ta có

So sánh Rebase và Merge

Vậy git lưu thông tin về branch và HEAD ở đâu?
- branch –>
.git\refs\heads
- HEAD –>
.git\HEAD
IV. Distributed Version Control System
Mệt, không viết nữa. Update sau
V. Tổng kết
Mình nhắc lại, mình khuyến khích các bạn học khóa học gốc, rất hay và hữu ích vì có nhiều nội dung mà mình không viết ra được, mình viết bài này chỉ nhằm mục đích 1 bài tổng hợp kiến thức chính của khóa học. Hết
Cảm ơn bạn đã viết bài viết này. Mình có thể copy một đoạn và cho nó vào kho dữ liệu công khai của mình không? Tất nhiên là có dẫn nguồn trang của bạn
ok bạn