Bản chất của git

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.

NOTE: Đừng bạn nào copy lại bài này như bạn ***Tester.com đã từng làm với các bài viết khác của mình.

Hình tự vẽ

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.00.00)
Hình copy từ trong slide khóa học

II. Content tracker

Content tracker có nghĩa là theo dõi và lưu thông tin filefolder 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
Hình copy từ trong slide khóa học
Hình copy từ trong slide khóa học
  • 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 đó.

Hình copy từ trong slide khóa học

Ở đây ta có

  • Commit cd67
  • 2 branch main 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

Hình copy từ trong slide khóa học

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

Hình copy từ trong slide khóa học

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.

Hình copy từ trong slide khóa học

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.

Hình copy từ trong slide khóa học
Hình copy từ trong slide khóa học

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

Hình copy từ trong slide khóa học

So sánh Rebase và Merge

Hình copy từ trong slide khóa học

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

Leave a Reply

Your email address will not be published. Required fields are marked *