OK OK, do thật sự là hôm nay người không khoẻ, nên mình ngồi viết nhảm tiếp. Một ngày như này viết nhảm là siêu chuẩn rồi.
Cái seri này như đã nói mình sẽ đưa mọi người chạy qua từng thứ một của git theo cách mình cho là dễ hiểu nhất. Hôm nay Bachthing xin gửi tới các bạn phần tiếp theo và là đoạn vào đề của GIT.
Chúng ta sẽ có các phần sau trong seri tổng quan :
- Git và các thành phần. Cấu trúc sẽ ở đây sau đó là tính năng.
- Git dưới góc nhìn tree, trunk, branch. Từ kiến trúc trên chúng ta sẽ nắm và suy ra các lệnh của git làm gì.
- Git và các lệnh. Sẽ là vài phần liền.
- Git chuyên sâu, control bằng gọi hash, edit =))) mong là chúng ta đủ chăm tới ngày này. ( đừng hi vọng gì cả ).
Git và các khái niệm cơ bản. Bắt đầu.
(vì lười vẽ mới lên mình sẽ thó mấy quả ảnh giải thích cho nhanh =)) vì dù gì cái này họ viết thành sách hết rồi, đây tổng hợp giải thích dưới tiếng việt thôi)
Rồi. Ở phần 1 mình đã có nói qua về việc Git khác Svn chỗ Git chứa mọi thứ dưới dạng metadata trong file .git trong khi mọi thứ trong Svn là táng nguyên directory. Vìiii lý do đó, hôm nay chúng ta cùng đào sâu vào .git và cùng tìm hiểu xem nó hoạt động ra sao.
Ô kê, sau đây là các đối tượng chính chúng ta cần phải biết :
- Blob : Git không lưu trữ sự khác biệt giữa các version file kiểu file cũ ít hơn file mới 10 chữ tại dòng số 6 sang phải 20 ô. Không Git lưu trữ toàn bộ một phiên bản file của bạn dưới dạng blob, file lưu trữ này được chốt mỗi đợt commit, tất nhiên là bạn cần phải chọn file này vào index để commit.
- Tree : Cây, cây thì có nhánh. Cơ bản thì là một cấu trúc thân cây với hằng hà các cành là các đối tượng tree nối với nhau tạo thành còn các đối tượng blob đại diện cho lá cây.
- Commit : Rễ cây, điểm theo dõi đầu tiên chỉ ra mỗi lần commit. Nó sẽ trỏ vào tree root là điểm tree chính xong trỏ sang các đối tượng con trong file.
- Tag : Đánh dấu, coi như sơn trắng đánh dấu mã số cây đi. Chủ yếu dùng để đánh dấu một giai đoạn commit quan trọng và cố định vị trí trỏ vào một commit cứng. Bạn không thể bóc vỏ cây để lôi cái đống sơn đi chỗ khác.trên cây.
Vào luông cho nóng. Rồi phần này chúng ta sẽ quan tâm tới một folder trong .git là objects. 3 đối tượng dính dáng ở đây là BloB, Tree, Commit
_____________________________________
Chuyên sâu 1: Database Key-Value và Cơ Chế Lưu Trữ
_____________________________________
Đầu tiên, git là một dạng database key-value, khu vực lưu trữ là .git/objects . Mỗi file trong code của bạn đại diện cho một blob, directory đại diện cho tree. Cơ chế sẽ dạng dạng này, xin trân trọng thông báo đây không phải là một quy trình chuẩn mà là trường hợp đầu tiên với một repo trống, để làm rõ phần tử thôi.
- Bạn chạy git init ra một repo trống huơ trống hoác.
- Rồi thì bạn tạo ra một file text hay file bất kì nào đấy, cộng thêm một directory nếu muốn.
- Add tụi nó vào index (index cơ bản là một file binary chứa tên file và SHA 1 code đóng vai trò key trong db key-value, nó sẽ show dựa theo HEAD, cái này để sau hoặc tiện thì google đi các bạn).
- Commit git.
ok thao tác tay xong, cảm ơn bạn đã nhọc công. Tiếp theo git sẽ làm những việc sau với những file thay đổi hoặc mới, git sẽ mã hóa SHA-1 lấy một đoạn code 40 kí tự dài như cuộc đời cậu vàng làm key db, value khi này chính là toàn bộ dữ liệu của file.
Nó sẽ có key là dạng này 1cxdcv919d52e3c1b08f7924fa05d6de10187456
Và sau đó sẽ lưu dữ liệu ở vị trí .git/objects/1c/xdcv919d52e3c1b08f7924fa05d6de10187456 tách 2 kí tự đầu là sub-directory trong object.
Tương tự với các đối tượng khác. Chúng ta có một đoạn mã SHA-1 mà chắc là chả thể trùng được đâu. Việc này dùng để so sánh nhanh xem file mới và file cũ có khác biệt không từ đấy sinh ra việc lưu trữ cây Git.
Khi đấy chúng ta sẽ có một cây đối tượng thế này, các bạn có thể dễ dàng nhìn được qua cái ảnh mình chôm trên mạng.
Rồi, hành động commit phía trên chúng ta đã tạo ra các thứ sau:
- Các đoạn mã SHA 1 để đánh dấu các đối tượng
- Các đường trỏ của các đối tượng vào nhau.
- Một object commit đánh dấu một hành động chốt sổ, lưu trữ thay đổi code.
- Và một object file đầu tiên mà commit trỏ tới được sinh ra dưới danh nghĩa root tree (e11479fe). Root tree là được sinh ra còn tree dưới thì là đại diện directory trong khu code nhá các bạn nhỏ.
Ô Kê, vài phút suy ngẫm. Từ cái mớ ở trên chúng ta có thể nhận ra một vài chuyện.
- Tất cả các đối tượng lưu trữ ngang hàng. Dễ nhìn thấy ở objects rồi.
- Các đối trượng trỏ một chiều qua nhau. Cái ảnh đấy, còn muốn dùng command nếu có hứng mình làm bài sau.
- Khi commit dưới đối tượng commit sẽ tạo một đối tượng tree root. Và dựa vào thay đổi các đối tượng blob sẽ tạo ra các tree tương ứng.
- Sự tận dụng các đối tượng cũ. Vậy có nghĩa là nếu file còn tồn tại khi quét index và so sánh key SHA-1 trùng lập chúng ta cơ bản sẽ không tạo ra file mới.
Để hình tượng hóa chúng ta sẽ nhìn các ảnh sau. Cũng là chôm trên mạng.
đây là một cây commit bình thường, đơn giản dễ hiểu với 2 sub-directory và 3 file. Nếu thay đổi dữ liệu file ở tầng sâu (blob dưới đáy rõ nét) nhất ta sẽ bị thay đổi thế này.
Tạo hẳn ra một file tầng đáy khác nhưng 2 file cũ vẫn được trỏ vào. Nếu bây giờ ta thay đổi dữ liệu file ngay tầng đầu thì sao (con blob ngay tree đầu). Ta sẽ có 3 version như sau.
Đối tượng cuối tag.
Đúng rồi nó tag ra một cái đánh dấu tên tuổi địa chỉ số đo 3 vòng vào commit. Thế thôi, hết rồi. Thế là xong tư duy lưu trữ cơ bản của Git, nó lại là dễ.
Đấy nhìn dễ ợt. Đây chính là sơ đồ cây của git trong cơ chế lưu trữ. Buổi sau thì bàn về HEAD, Branch và có thể là Work-Flow. Ờ tùy hứng.
THẾ NHÁ. CHÀO.