Khái niệm về GitGit là tên gọi của một Hệ thống quản lý phiên bản phân tán Distributed Version Control System – DVCS là một trong những hệ thống quản lý phiên bản ph
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI TRƯỜNG CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG BÁO CÁO BÀI TẬP LỚN Đề tài: Tìm hiểu về Git dưới góc nhìn của Hệ phân tán Lớp : Học phần : Các hệ thống phân tán và ứng dụng Mã học phần : 132666 IT4611 Giảng viên hướng dẫn : TS Đặng Tuấn Linh Danh sách thành viên nhóm: Họ và tên Nguyễn Thành Bắc Trương Văn Hiển Đinh Trọng Nghĩa Nguyễn Trường Sơn Mã số sinh viên 20194229 20194276 20194340 20194364 Hà Nội, tháng năm 2022 Bài tập lớn: Các hệ thớng phân tán và ứng dụng PHÂN CƠNG THÀNH VIÊN TRONG NHÓM ST Họ và tên MSSV Email Công việc T Tỷ lệ % công việc làm Nguyễn Thành Bắc 20194229 bac.nt19 4229@s Kiến trúc hệ phân tán 25% Trao đổi thông tin is.hust.e du.vn Trương Văn Hiển 20194276 hien.tv1 94276@ Cơ chế định danh 25% Cơ chế đồng bộ hóa sis.hust edu.vn Đinh Trọng Nghĩa 20194340 nghia.dt Tính nhân bản 194340 Tính nhất quán 25% @sis.hu st.edu.v n Nguyễn Trường Sơn 20194364 son.nt19 4364@s Tính chịu lỗi của hệ 25% phân tán is.hust.e du.vn Bài tập lớn: Các hệ thống phân tán và ứng dụng MỤC LỤC LỜI MỞ ĐẦU .4 CHƯƠNG 1: KIẾN TRÚC HỆ PHÂN TÁN 1.1 Khái niệm về Git .5 1.2 Các lợi thế của Git .5 1.3 Đặc tính phi tập trung mang tính tập trung của Git 1.4 Hệ thống quản lý phiên bản (Version Control System – VCS) 1.5 Mô hình quản lý source phân tán 1.6 So sánh mô hình quản lý source CVS – SVN CHƯƠNG 2: TRAO ĐỔI THÔNG TIN 10 CHƯƠNG 3: CƠ CHẾ ĐỊNH DANH .11 CHƯƠNG 4: CƠ CHẾ ĐỒNG BỘ HÓA 14 CHƯƠNG 5: TÍNH NHÂN BẢN VÀ NHẤT QUÁN 18 5.1 Tính nhân bản 18 5.2 Tính nhất quán 19 5.2.1 Quản lý dữ liệu Git 19 5.2.2 Các trạng thái Git .19 CHƯƠNG 6: TÍNH CHỊU LỖI CỦA HỆ PHÂN TÁN 22 DANH MỤC TÀI LIỆU THAM KHẢO 23 Bài tập lớn: Các hệ thống phân tán và ứng dụng LỜI MỞ ĐẦU Ngày nay, ứng dụng công nghệ thông tin và việc tin học hóa được xem là một những yếu tố mang tính quyết định hoạt động của các chính phủ, tổ chức, cũng của các công ty, nó đóng vai trò hết sức quan trọng, có thể tạo những bước đột phá mạnh mẽ Cùng với sự phát triển không ngừng về kỹ thuật máy tính và mạng điện tử, công nghệ thông tin cũng được những công nghệ có đẳng cấp cao và lần lượt chinh phục hết đỉnh cao này đến đỉnh cao khác Mạng Internet là một những sản phẩm có giá trị hết sức lớn lao và ngày càng trở thành một công cụ không thể thiếu, là nền tảng chính cho sự truyền tải, trao đổi thông tin toàn cầu Giờ đây, mọi việc liên quan đến thông tin trở nên thật dễ dàng cho người sử dụng, chỉ cần có một máy tính kết nối Internet và một dòng dữ liệu truy tìm thì gần lập tức vấn đề mà bạn đnag quan tâm sẽ hiện ra, có đầy đủ thông tin, hình ảnh và thậm chí đôi lúc có cả những âm nếu bạn cần Trong hoạt động công nghệ thông tin, Git là một dịch vụ nổi tiếng cung cấp kho lưu trữ mà nguồn cho các dự án phần mềm Ngoài còn là công cụ bổ sung những tính về social để các developer tương tác với Với lý đó, nhóm chúng em đã chọn đề tài “Tìm hiểu Git dưới góc nhìn của Hệ phân tán” làm đề tài cho Bài tập lớn môn học của mình Mặc dù đã cố gắng hoàn thiện sản phẩm không thể tránh khỏi những thiếu hụt về kiến thức và sai sót kiểm thử Chúng em rất mong nhận được những nhận xét thẳng thắn, chi tiết đến từ thầy để tiếp tục hoàn thiện nữa Cuối cùng, nhóm chúng em xin được gửi lời cảm ơn đến thầy TS Đăng Tuấn Linh đã hướng dẫn chúng em suốt quá trình hoàn thiện Bài tập lớn Nhóm chúng em xin chân thành cảm ơn thầy Bài tập lớn: Các hệ thống phân tán và ứng dụng CHƯƠNG 1: KIẾN TRÚC HỆ PHÂN TÁN 1.1 Khái niệm về Git Git là tên gọi của một Hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS) là một những hệ thống quản lý phiên bản phân tán phổ biến nhất hiện 1.2 Các lợi thế của Git - Mã nguồn mở và miễn phí - Tốc độ nhanh và nhỏ gọn - Dự phòng (sao lưu) ẩn - An toàn cao - Không yêu cầu phần cứng mạnh - Phân nhánh dễ dàng 1.3 Đặc tính phi tập trung mang tính tập trung của Git Trong mỗi lập trình triển khai một tính thuộc hệ thống rồi sau đó mới đẩy về kho trung tâm Mô hình rất hiệu quả các dự án đều sở hữu một kho code đầy đủ thì Git cho thiết lập một kho trung tâm thực sự, tất cả các lập trình viên đều có thể kéo (pull) các thay đổi từ đó về kho của mình, và đẩy (push) các thay đổi về kho trung tâm Tuy nhiên, bên cạnh những mối quan hệ pull-push tập trung, mỗi nhà phát triển cũng có thể kéo (pull) thay đổi từ các đồng nghiệp để tạo thành các nhóm nhỏ Ví dụ minh họa dưới cho thấy một dự án với kho code trung tâm và người, họ hình thành nhóm nhỏ là nhóm của A-B, A-C, B-D Mỗi nhóm này có thể phụ trách phá án lớn Bài tập lớn: Các hệ thống phân tán và ứng dụng 1.4 Hệ thống quản lý phiên bản (Version Control System – VCS) Hệ thống quản lý phiên bản (Version control system – VCS) là một dạng phần mềm Quản lý mã nguồn (Source Code Management – SCM) Vì phải sử dụng VCS : VCS là hệ thống hỗ trợ làm việc theo nhóm rất hiệu quả Khi một nhóm làm việc cùng một dự án (project), việc nhiều người cùng chỉnh sửa nội dung của một tệp tin là điều không thể tránh khỏi Việc chỉnh sửa vậy sẽ tạo các phiên bản (Versions/Revisions) khác và phát sinh nhu cầu quản lý chúng VCS đời để cung cấp các chức để có thể thực hiện việc này một cách đơn giản và an toàn Chức của VCS : - Lưu lại lịch sử thay đổi của file - Làm việc đồng thời - Phân nhánh và hợp nhất - Truy xuất nguồn gốc Bài tập lớn: Các hệ thống phân tán và ứng dụng 1.5 Mô hình quản lý source phân tán Git có thể nói là một hướng tiếp cận hoàn toàn mới so với SVN (CVS và SVN theo hướng CENTRALIZED - quản lý source code tập trung, còn Git theo hướng DISTRIBUTED - quản lý source code phân tán) Chúng ta thường dùng SVN chắc đã hiểu khái niệm CENTRALIZED là gì rùi, vậy thì DISTRIBUTED sẽ thế nào đây: Với một vài hệ thông Git và cả CVS và SVN, repository gốc sẽ được lưu trữ server và lập trình viên sẽ checkout về một bản copy mới nhất từ source code server đó để làm việc Và ta muốn apply thay đổi của ta từ local ta sẽ send yêu cầu đó lên server Đó chính là nguyên tắc chung của source control Source control đời để phục vụ nhu cầu cho nhiều một developer để họ có thể làm việc với cùng một project Mỗi một developer sẽ có một source code và làm việc với nó, và cập nhật thay đổi của mình cho những người khác team biết Việc cập nhật thay đổi của bạn đến server là theo nguyên lý của SVN và CVS, tức là không phân tán vì tất cả thay đổi đều tập trung ở server Việc quản lý tập trung yêu cầu quyền truy cập đến server ta commit hoặc update từ những thành viên khác, chính họ cũng đưa thay đổi của mình lên server (để tránh conflic hoặc out of update) Git hoàn toàn đối lập: Quản lý phân tán của Git là một repositories không cần có chung một nơi để lưu trữ, mà mỗi thành viên sẽ có một repository ở local của họ Tất cả thao tác ta làm việc với Git đều ở máy của ta, local repository, quyết định đưa những thay đổi đó lên server ta chỉ cần một thao tác "push" nó lên server Chúng ta vẫn có thể share thay đổi của chúng ta cho thành viên khác, cách commit hoặc update trực tiếp từ máy của họ mà không phải thông qua repositories gốc server (thông qua share ssh cho nhau) Và dĩ nhiên là mọi thao tác đều mang theo thông tin history với Git Bài tập lớn: Các hệ thống phân tán và ứng dụng Tính phân tán thì an toàn so với tập trung, vì mỗi bản copy của thành viên đều là full copy từ repository gốc, server bị down, các thành viên vẫn có thể làm việc offline, họ vẫn có thể commit và update local của họ hoặc thậm chí với mà không cần thông qua server Khi server hoạt động trở lại, họ có thể cập nhật tất cả lên lại server Với mô hình Git, mỗi thành viên tham gia git sẽ có một repository local của họ 1.6 So sánh mô hình quản lý source CVS – SVN CVS (Concurrent Versions System) và SVN (SubVersioN) với mô hình quản lý source code tập trung, là hai phiên bản được sử dụng phổ biến hiện Các hệ thống này cho phép các cộng tác viên theo dõi sự thay đổi thực hiện và biết phát triển nhánh nào của source code CVS đời trước, sau đó đến sự bùn nổ của SVN SVN bản chất vẫn là CVS được cải tiến, có nhiều công cụ hỗ trợ Cả CVS và SVN đều có tư tưởng chung về cách làm việc chung giữa các thành viên theo mô hình (quản lý source code tập trung) sau: - Sự cải thiện lớn nhất của SVN từ CVS là bổ sung việc commit của các thành viên được gọi là Atomic Commit Atomic Commit cho phép mỗi commit từ thành viên được upate đầy đủ hoặc không có gì cả, điều này rất có ý nghĩa máy chủ bị treo lúc commit Với CVS máy chủ bị treo hay kết nối bị trục trặc thì việc commit có thể bị dở dang, không đầy đủ - Với SVN, các commit có thể được roll-back lại trạng thái trước đó, CVS thì không thể undo - Ngoài SVN tiện lợi CVS việc đổi tên và di chuyển các tập tin, thư mục Với SVN các tập tin được đổi tên hoặc loại bỏ vẫn mang theo đầy đủ history và meta data của nó trước đó, đó với CVS thì tập tin bị đổi tên hoặc di chuyển sẽ bị mất history trước đó CVS cũng không thể đẩy bất cứ những thay đổi mới đến repositories cha mà chỉ có thể đẩy lên repositories của nó, một số công cụ SVN có khả này Bài tập lớn: Các hệ thống phân tán và ứng dụng - Ngoài SVN tiện lợi CVS việc đổi tên và di chuyển các tập tin, thư mục Với SVN các tập tin được đổi tên hoặc loại bỏ vẫn mang theo đầy đủ history và meta data của nó trước đó, đó với CVS thì tập tin bị đổi tên hoặc di chuyển sẽ bị mất history trước đó CVS cũng không thể đẩy bất cứ những thay đổi mới đến repositories cha mà chỉ có thể đẩy lên repositories của nó, một số công cụ SVN có khả này Bài tập lớn: Các hệ thống phân tán và ứng dụng CHƯƠNG 2: TRAO ĐỔI THÔNG TIN Phần lớn các thao tác/hoạt động Git chỉ cần yêu cầu các tập tin hay tài nguyên cục bộ - thông thường nó sẽ không cần bất cứ thông tin từ máy tính nào khác mạng lưới của bạn Nếu ta quen với việc sử dụng các hệ thống quản lý phiên bản tập trung nơi mà đa số hoạt động đều chịu sự ảnh hưởng bởi độ trễ của mạng, thì với Git đó lại là một thế mạnh Bởi vì toàn bộ dự án hoàn toàn nằm ổ cứng, các thao tác được thực hiện gần lập tức Ví dụ, muốn xem lịch sử của dự án, Git không cần phải lấy thông tin đó từ một máy chủ khác để hiển thị, mà đơn giản nó được đọc trực tiếp từ chính sở dữ liệu cục b Điều này có nghĩa là ta có thể xem được lịch sử thay đổi của dự án gần lập tức Nếu ta muốn so sánh sự thay đổi giữa phiên bản hiện tại của một tập tin với phiên bản của một tháng trước, Git có thể tìm kiếm tập tin cũ đó máy cục bộ rồi sau đó so sánh sự khác biệt cho bạn Thay vì việc phải truy vấn từ xa hoặc "kéo về" (pull) phiên bản cũ của tập tin đó từ máy chủ trung tâm rồi mới thực hiện so sánh cục bộ Điều này còn đồng nghĩa với có rất ít việc mà ta không thể làm được không có kết nối Internet hoặc VPN bị ngắt Nếu ta muốn làm việc cả ở máy bay hoặc tầu, ta vẫn có thể commit bình thường cho tới có kết nối Internet để đồng bộ hoá Nếu ta ở nhà mà VPN lại không thể kết nối được, ta cũng vẫn có thể làm việc bình thường Trong rất nhiều hệ thống khác, việc này gần là không thể hoặc rất khó khăn Ví dụ Perforce, ta gần không thể làm gì nếu không kết nối được tới máy chủ; Subversion và CVS, ta có thể sửa tập tin không thể commit các thay đổi đó vào sở dữ liệu (vì sở dữ liệu không được kết nối) 10 Bài tập lớn: Các hệ thống phân tán và ứng dụng CHƯƠNG 3: CƠ CHẾ ĐỊNH DANH - Git có một mục object được lưu trữ dùng để chứa file gốc và tất cả những tin nhắn log, chủ nhân file, ngày tạo và thông tin khác cần để tạo nên một sửa đổi hay nhánh cho dự án Có thành phần quan trọng của object cần chú ý: type, size, content Size: kích cỡ của nội dung Content: dựa vào type (loại) của đối tượng Type: loại đối tượng được chứa đường dẫn git/objects, gồm loại khác nhau, bao gồm: o Blob: dùng để lưu file dữ liệu – là tập tin nhị phân của mỗi phiên bản file, còn là nguyên nhân dẫn đến sự gia tăng dung lượng của kho chứa o Tree: là một đường dẫn o Commit: giữ metadata cho mỗi lần file thay đổi kho lưu trữ, bao gồm chủ sở hữu, người gửi, dữ liệu commit, thông điệp nhật ký o Tag: gán một tên có ý nghĩa mà người dùng đọc được cho một đối tượng cụ thể sử dụng commit - Có một khái niệm liên quan đến chế snapshot của Git là loose object format (định danh đối tượng suốt của git) Để thấy được thư mục đối tượng, người quản trị tạp file lần lượt là 0.txt, 1.txt, 2.txt và sử dụng các lệnh commit, folder sẽ xuất hiện file git 11 Bài tập lớn: Các hệ thống phân tán và ứng dụng - Git tạo thư mục đường dẫn git/objects lần lượt là 53, ab, e6 - Trong mỗi thư mục sẽ có chứa file mã băm gồm 40 kí tự với kí tự là tên gọi của thư mục đường dẫn, 38 kí tự còn lại được dùng tên file, người dùng gõ lệnh “git cat-file [-option] [ten_file]”, option được chọn ở là [-t] Lưu ý: ten_file phải bao gồm đủ 40 kí tự, tức là bao gồm cả kí tự tên thư mục đường dẫn - Chỉnh sửa nội dung tập tin, Git sẽ tạo thêm tập tin những tập tin cũ 12 Bài tập lớn: Các hệ thống phân tán và ứng dụng - Thông qua lệnh git cat-file [-t], các thư mục băm với hai kí tự đầu sẽ được hiển thị rõ ràng nội dung cũng tính tương tự - Bất cứ nào người dùng commit, git đều chụp lại vào ổ đĩa giữa phiên bản cũ và phiên bản mới cùng một file, kể cả ta chỉ thay đổi một kí tự nội dung file 13 Bài tập lớn: Các hệ thống phân tán và ứng dụng CHƯƠNG 4: CƠ CHẾ ĐỜNG BỢ HÓA - Git và Github khơng hoàn toàn giống nhau, chúng thường được sử dụng cùng nhau, cụ thể sau: Git là hệ thống kiểm soát phiên bản, là một phần của phần mềm Người dùng có thể tải phần mềm để sử dụng máy tính của mình hoặc để đồng bộ hóa một thư mục với một máy chủ web Theo mặc định, người dùng sử dụng terminal để đưa hướng dẫn cho Git thông qua các dòng lệnh Bạn có thể sử dụng ứng dụng người dùng/giao diện Git để không phải gõ lệnh và thực hiện các hành động tương tự (ít nhất là đối với những hành động đơn giản, rất thường dùng) Nếu muốn lưu trữ thư mục của mình một host website để cùng làm việc với những người khác, người dùng có thể tạo một tài khoản tại Github, Gitlab, Bitbucket hoặc những nền tảng khác - Vì vậy, người dùng có thể sử dụng ứng dụng/giao diện Github Desktop, sử dụng Git nền để quản lý các tệp của bạn, cả cục bộ máy tính của bạn và từ xa máy chủ Github - Kho lưu trữ cục bộ và từ xa: Clone (Nhân bản) là tạo một bản của kho lưu trữ Git ở một nơi khác Ví dụ: người dùng có thể clone một kho lưu trữ trực tuyến từ Github xuống máy tính của mình hoặc bắt đầu với một kho lưu trữ cục bộ (local repository) và clone nó trực tuyến lên Github Khi người dùng đã clone một kho lưu trữ, các tệp dự án tồn tại ở hai nơi: o Kho lưu trữ cục bộ (local) máy tính của mình Đây là nơi người dùng thực hiện các thay đổi thực tế đối với các tệp/code o Kho lưu trữ từ xa (remote), kho lưu trữ trực tuyến: các phiên bản của tệp dự án kho lưu trữ Github (hoặc bất kỳ nền tảng nào khác) Để đồng bộ hóa các kho này, chúng ta sẽ sử dụng nhiều hàm Thật vậy, không giống Sharepoint, Dropbox hoặc các phần mềm đồng bộ hóa khác, 14 Bài tập lớn: Các hệ thống phân tán và ứng dụng Git không thực hiện tự động cập nhật kho lưu trữ cục bộ của người dùng dựa những gì có cloud, hoặc ngược lại Tuy nhiên, người dùng có thể chọn thời điểm và cách thức đồng bộ hóa o git fetch: tải xuống các thay đổi mới từ kho lưu trữ từ xa không làm thay đổi kho lưu trữ cục bộ của bạn Hãy coi nó giống việc kiểm tra trạng thái của kho lưu trữ từ xa o git pull: tải xuống các thay đổi mới từ kho lưu trữ từ xa và cập nhật kho lưu trữ cục bộ của bạn o Khi người dùng đã thực hiện một hoặc một số commit cục bộ, họ có thể git push để đẩy các commit đến kho lưu trữ từ xa Điều này giúp gửi các thay đổi của họ tới Github để người khác có thể xem và kéo về (pull) nếu họ muốn - Lấy những commits mới từ kho lưu trữ gốc: Sơ lược về forking: Người dùng có thể fork một dự án nếu họ muốn đóng góp cho nó không có quyền để thực hiện, hoặc chỉ là muốn chỉnh sửa cho mục đích sử dụng cá nhân Trong Github, nhấp vào nút “Fork”: Thao tác này sẽ clone kho lưu trữ gốc, được lưu hồ sơ của người dùng Do đó, bây giờ có hai phiển bản của kho lưu trữ Github: phiên bản gốc mà không thể chỉnh sửa, và phiên bản clone hồ sơ của người dùng Sau đó, họ có thể tiếp tục clone phiên bản trực tuyến xuống máy tính, sử dụng bất kỳ phương pháp nào Tiếp theo, họ có thể tạo một nhánh mới, tạo các thay đổi, commit và push chúng lên kho lưu trữ từ xa của họ 15 Bài tập lớn: Các hệ thống phân tán và ứng dụng Khi người dùng hài lòng với các kết quả, họ có thể tạo một Pull Request từ Github hoặc Github Desktop để bắt đầu một cuộc thảo luận với chủ sở hữu/người bảo trì của kho lưu trữ gốc Nếu đó đã tạo một thay đổi quan trọng kho lưu trữ gốc, và người dùng muốn thêm những thay đổi đó vào kho lưu trữ của mình Điều này là khả thi để đồng bộ hóa kho lưu trữ họ đã fork với kho lưu trữ gốc Nó yêu cầu sử dụng terminal, không quá phức tạp Họ chỉ cần nhớ rằng: o Upstream (thượng nguồn) hay kho lưu trữ gốc, là cái mà họ không thể chỉnh sửa o Origin (bản gốc) hay phiên bản kho lưu trữ hồ sơ Github của bạn Đầu tiên, gõ vào Git terminal (bên repo): Nếu người dùng chưa từng cấu hình upstream repository (kho lưu trữ gốc), họ sẽ thấy hai dòng, bắt đầu bởi từ origin Chúng hiển thị kho lưu trữ từ xa để fetch và push các điểm vào Hãy nhớ, origin là biệt danh thường dùng cho phiên bản kho lưu trữ của chính họ Github Ví dụ: Bây giờ, thêm một kho lưu trữ từ xa: Địa chỉ ở là địa chỉ mà Github tạo người dùng clone một repository (xem mục về cloning) Bây giờ họ sẽ có bốn điểm từ xa: Quá trình thiết lập đã xong Bất cứ nào người dùng muốn lấy các sự thay đổi từ kho lưu trữ gốc (upstream), họ chỉ cần tới (checkout) nhánh họ muốn cập nhật và gõ: 16 Bài tập lớn: Các hệ thống phân tán và ứng dụng Nếu có xung đột, người dùng sẽ phải giải quyết chúng đã trình bày ở Tổng kết: forking là cloning, chỉ phía máy chủ của Github Các hành động còn lại là điển hình của mô quy trình cộng tác(clone, push, pull, commit, merge, gửi pull requests…) 17 Bài tập lớn: Các hệ thống phân tán và ứng dụng CHƯƠNG 5: TÍNH NHÂN BẢN VÀ NHẤT QUÁN 5.1 Tính nhân bản Nhân bản dữ liệu là rất quan trọng đối với một hệ phân tán bởi vì: - Nó tăng tính tin cậy cho hệ thống: Trong quá trình đọc hoặc ghi dữ liệu, nếu một bản bị hỏng hoặc vì lý nào đấy nó không sẵn sàng để sử dụng thì ta có thể sử dụng một bản khác Tránh việc sử dụng dữ liệu sai lạc, không chính xác - Tăng hiệu của hệ thống: Việc phân bố các bản sẽ giúp tăng quy Mô hệ thống cả về số lượng lẫn phạm vi địa lý Ví dụ: Nếu tăng số lượng máy => Tải mỗi máy hệ phân tán cúng không tăng lên nhiều Phạm vi địa lý tăng => Có thể sử dụng các nhân bản gần khu vực địa lý đó Tuy nhiên cái giá phải trả cho việc nhân bản dữ liệu là phải chắc chắn một bản được cập nhất thì tất cả những bản còn lại cũng phải được cập nhật theo để đảm bảo tính nhất quán của dữ liệu máy khách và máy chủ Git với tiêu chí là “Every thing is local” Phần lớn các thao tác/hoạt động Git chỉ cần yêu cầu các tập tin hay tài nguyên cục bộ - thông thương nó sẽ không cần bất cứ thông tin từ máy tính nào khác mạng lưới Quản lý phân tán của Git là một repositories không cần có chung một nơi để lưu trữ, mà mỗi thành viên sẽ có một repository ở local của họ Và mỗi repository ở local được người dùng clone về đều là bản copy của repository gốc (được lưu tại server) Đúng tiêu chí đề ra, 90% thao tác của người dùng là ở tại local Khi người dùng “pull” dữ liệu về thì toàn bộ dự án hiện tại được lưu trữ ngày tại máy tính của họ Việc của họ chỉ cần làm việc trực tiếp các file đã được “pull” về Điều này giúp chúng ta làm việc cả môi trường không có kết nối internet Thậm chí chúng ta vẫn có thể commit bình 18 Bài tập lớn: Các hệ thống phân tán và ứng dụng thường và sẽ được đồng bộ hoá cho đến máy tính được kết nối mạng trở lại Tóm lại, các nhân bản sẽ được lưu trữ trực tiếp tại chính tại local của người dùng Việc của người dùng là tương tác với các nhân bản này và commit lại cho server Git sẽ chỉ cần quản lý các thay đổi này (liên quan đến tính nhất quán) Điều này giúp cho người dùng làm việc nhanh thao tác chính thiết bị của mình thay vì làm việc các nền tảng online 5.2 Tính nhất quán 5.2.1 Quản lý dữ liệu Git Mọi thứ Git được "băm" (checksum or hash) trước lưu trữ và được tham chiếu tới mã băm đó Có nghĩa là việc thay đổi nội dung của một tập tin hay một thư mục mà Git không biết tới là điều không thể Chức này được xây dựng Git ở tầng thấp nhất và được coi là toàn vẹn Ta không thể mất thông tin/dữ liệu truyền tải hoặc nhận về một tập tin bị hỏng mà Git không phát hiện Cơ chế mà Git sử dụng cho việc băm này được gọi là mã băm SHA-1 Đây là một chuỗi được tạo thành bởi 40 ký tự của hệ số 16 (0-9 và a-f) và được tính toán dựa nội dung của tập tin hoặc cấu trúc thư mục Git Một mã băm SHA-1 có định dạng sau: 24b9da6552252987aa493b52f8696cd6d3b00373 Các mã băm được sử dụng ở mọi nơi Git Thực tế, Git không sử dụng tên của các tập để lưu trữ mà các mã băm từ nội dung của tập tin vào một sở dữ liệu có thể truy vấn được Git quản lý Repository theo các phiên bản mà dữ liệu bị sửa đổi Vì dữ liệu được băm trước lưu trữ nên các phiên bản này hoàn toàn là nhất và không trùng Và người dùng sẽ hoàn toàn có thể tiếp cận được tất cả các phiên bản này tránh việc có kẻ xấu làm hỏng dữ liệu 5.2.2 Các trạng thái Git Mỗi tập tin Git được quản lý dựa ba trạng thái: committed, modified, và staged 19 Bài tập lớn: Các hệ thống phân tán và ứng dụng - Committed: dữ liệu đã được lưu trữ một cách an toàn sở dữ liệu - Modified: đã thay đổi tập tin chưa commit vào sở dữ liệu - Staged: đã đánh dấu sẽ commit phiên bản hiện tại của một tập tin đã chỉnh sửa lần commit sắp tới Điều này tạo ba phần riêng biệt của một dự án sử dụng Git: thư mục Git, thư mục làm việc, và khu vực tổ chức (staging area) Thư mục Git là nơi Git lưu trữ các "siêu dữ kiện" (metadata) và sở dữ liệu cho dự án củangười dùng Đây là phần quan trọng nhất của Git, nó là phần được lưu về người dùng tạo một bản (clone) của một kho chứa từ một máy tính khác Thư mục làm việc là bản một phiên bản của dự án Những tập tin này được kéo về (pulled) từ sở dữ liệu được nén lại thư mục Git và lưu ổ cứng cho người dùng sử dụng hoặc chỉnh sửa Khu vực khán đài là một tập tin đơn giản được chứa thư mục Git, nó chứa thông tin về những gì sẽ được commit lần commit sắp tới Nó còn được biết đến với cái tên "chỉ mục" (index), khu vực tổ chức (staging area) dần được coi là tên tiêu chuẩn 20