tek4

Git là gì? Tại sao git là công cụ mà mọi lập trình viên đều nên thành thạo?

by - September. 26, 2021
Kiến thức
<p style="text-align: justify;">Git l&agrave; g&igrave;? Tại sao n&oacute; lại l&agrave; c&ocirc;ng cụ m&agrave; mọi lập tr&igrave;nh vi&ecirc;n chuy&ecirc;n nghiệp đều cần th&agrave;nh thạo? B&agrave;i viết n&agrave;y sẽ trả lời cho những c&acirc;u hỏi đ&oacute;.</p> <h2 style="text-align: justify;">B&agrave;i to&aacute;n quản l&yacute; phi&ecirc;n bản (version control)</h2> <p><img class=" wp-image-5015 aligncenter" src="https://tek4.vn/wp-content/uploads/2019/10/version-control-system.jpg" alt="" width="433" height="207" /></p> <p style="text-align: justify;">Quản l&yacute; phi&ecirc;n bản (<a href="https://tek4.vn/khong-phai-ide-day-moi-la-cong-cu-khong-thieu-cho-moi-lap-trinh-vien-chuyen-nghiep/">version control</a>) l&agrave; g&igrave;? tại sao ch&uacute;ng ta n&ecirc;n quan t&acirc;m đến n&oacute;? Để hiểu được vấn đề n&agrave;y, ch&uacute;ng ta nhắc lại một v&iacute; dụ sau:</p> <p style="text-align: justify;">Giả sử, bạn l&agrave; một lập tr&igrave;nh vi&ecirc;n v&agrave; c&ocirc;ng việc h&agrave;ng ng&agrave;y của bạn l&agrave; lập tr&igrave;nh. Tuy nhi&ecirc;n, c&oacute; một vấn đề m&agrave; bạn chắc chắn sẽ hay gặp phải đ&oacute; l&agrave; m&atilde; nguồn m&agrave; c&aacute;c bạn viết ra lần đầu, lần thứ 2, ... v&agrave; thậm ch&iacute; lần thứ n cũng kh&oacute; c&oacute; thể đ&uacute;ng v&agrave; ho&agrave;n hảo ngay lập tức. Điều n&agrave;y đ&uacute;ng cả cho những lập tr&igrave;nh vi&ecirc;n mới v&agrave;o nghề v&agrave; cả với những chuy&ecirc;n gia gạo cội nhất.</p> <p style="text-align: justify;">Vậy, th&ocirc;ng thường nếu l&agrave; bạn th&igrave; bạn sẽ quản l&yacute;, lưu trữ c&aacute;c phi&ecirc;n bản n&agrave;y như thế n&agrave;o?</p> <p style="text-align: justify;"><strong>X&oacute;a ch&uacute;ng đi v&agrave; l&agrave;m ho&agrave;n to&agrave;n mới?</strong></p> <p style="text-align: justify;">Nếu bạn l&agrave;m như vậy, th&igrave; bạn sẽ gặp rắc rối kh&aacute; lớn với c&aacute;c dự &aacute;n lớn. Bởi rất nhiều khi, phi&ecirc;n bản sửa đổi lại tệ hơn cả phi&ecirc;n bản gốc v&agrave; bạn cần phải quay lại để sử dụng những g&igrave; bạn đ&atilde; viết cũ trước đ&acirc;y ! Vậy để đảm bảo việc đưa m&atilde; nguồn về trạng th&aacute;i trước khi chỉnh sửa&nbsp; th&igrave; ch&uacute;ng ta sẽ l&agrave;m như thế n&agrave;o?</p> <p style="text-align: justify;"><strong>C&aacute;ch đơn giản nhất l&agrave; lưu n&oacute; lại th&agrave;nh một file kh&aacute;c, v&agrave; tiếp tục l&agrave;m dưới file mới n&agrave;y?</strong></p> <p style="text-align: justify;">Tuy nhi&ecirc;n, nếu kh&ocirc;ng c&oacute; quy ước đặt t&ecirc;n hợp l&yacute;, sẽ c&oacute; rất nhiều vấn đề xảy ra.</p> <p><img class=" wp-image-5013 alignleft" src="https://tek4.vn/wp-content/uploads/2019/10/git.png" alt="git" width="327" height="213" /></p> <p style="text-align: justify;">R&otilde; r&agrave;ng, bạn sẽ rất kh&oacute; để t&igrave;m kiếm được file n&agrave;o m&agrave; bạn muốn. Thật sự l&agrave; như vậy, với ri&ecirc;ng bản th&acirc;n m&igrave;nh t&ocirc;i đ&atilde; bị rất nhiều trường hợp phải t&igrave;m file m&igrave;nh cần giữa một loạt c&aacute;c file c&oacute; t&ecirc;n l&agrave; "_final", thậm ch&iacute; "_final_final"... m&agrave; cũng chẳng biết file n&agrave;o thực sự l&agrave; cuối c&ugrave;ng. Bạn c&oacute; thể th&ecirc;m c&aacute;c ng&agrave;y th&aacute;ng v&agrave;o t&ecirc;n của file v&iacute; dụ như tr&ecirc;n h&igrave;nh. Tuy nhi&ecirc;n, việc tự m&igrave;nh sao ch&eacute;p file mỗi lần chỉnh sửa th&igrave; sẽ rất vất vả, v&agrave; cũng dễ xảy ra nhầm lẫn. Hoặc thậm ch&iacute; ngay cả khi chẳng c&oacute; nhầm lẫn th&igrave; bạn cũng rất kh&oacute; t&igrave;m lại sau một thời gian kh&ocirc;ng động đến n&oacute; nữa. Bạn chẳng thể biết file ng&agrave;y 22/4 hay file ng&agrave;y 24/4 l&agrave; file m&igrave;nh cần. Bởi bạn chẳng nhớ nổi file đ&oacute; đ&atilde; sửa g&igrave; v&agrave; sửa đến đ&acirc;u, c&oacute; g&igrave; kh&aacute;c so với c&aacute;c file cũ. Rất kh&oacute; khăn phải kh&ocirc;ng ạ?</p> <p class="Mg-b30" style="text-align: justify;">Chưa kể, khi ch&uacute;ng ta đặt t&ecirc;n một c&aacute;ch v&ocirc; trật tự th&igrave; kh&ocirc;ng biết ch&uacute;ng ta sẽ ph&acirc;n biệt ch&uacute;ng kiểu g&igrave;. Th&ecirc;m v&agrave;o đ&oacute;, với c&aacute;c dự &aacute;n lớn, ch&uacute;ng ta cũng thường phải l&agrave;m việc nh&oacute;m v&agrave; y&ecirc;u cầu chia sẻ c&aacute;c file trong nh&oacute;m th&igrave; vấn đề c&agrave;ng trở l&ecirc;n phức tạp hơn như c&aacute;c vấn đề về đồng bộ khi c&oacute; nhiều người c&ugrave;ng chỉnh sửa c&ugrave;ng l&uacute;c. Khi đ&oacute; sẽ xảy ra trường hợp x&oacute;a mất nội dung thay đổi của người đ&atilde; chỉnh sửa trước đ&oacute;.</p> <p><img class="size-full wp-image-5014 aligncenter" src="https://tek4.vn/wp-content/uploads/2019/10/version-control-system_2.png" alt="version control system_2" width="473" height="213" /></p> <p class="Mg-b40" style="text-align: justify;">Để giải quyết những vấn đề n&agrave;y ch&uacute;ng ta sử dụng c&aacute;c hệ thống quản l&yacute; phi&ecirc;n bản (VCS). V&agrave; một điển h&igrave;nh hay gặp nhất của n&oacute; l&agrave; Git.</p> <h2>Hệ thống quản l&yacute; phi&ecirc;n bản l&agrave; g&igrave;?</h2> <p style="text-align: justify;">Hệ thống quản l&yacute; phi&ecirc;n bản n&oacute;i một c&aacute;ch đơn giản l&agrave; một hệ thống lưu trữ c&aacute;c thay đổi của một tập tin (file) hoặc tập hợp c&aacute;c tập tin theo thời gian v&agrave; cho ph&eacute;p người d&ugrave;ng c&oacute; thể quay lại một phi&ecirc;n bản x&aacute;c định n&agrave;o đ&oacute; khi cần thiết.</p> <p style="text-align: justify;">Như định nghĩa tr&ecirc;n c&oacute; thể thấy, hệ thống quản l&yacute; phi&ecirc;n bản kh&ocirc;ng chỉ đơn thuần gi&uacute;p ch&uacute;ng ta quản l&yacute; m&atilde; nguồn của phần mềm như ch&uacute;ng ta vẫn hay gặp như Git, Github,...m&agrave; n&oacute; c&ograve;n c&oacute; thể được sử dụng để quản l&yacute; lưu trữ bất cứ định dạng tệp tin n&agrave;o.</p> <p style="text-align: justify;">Bạn c&oacute; thể sử dụng hệ thống quản l&yacute; phi&ecirc;n bản (Version Control System - VCS) để lưu trữ tất cả c&aacute;c phi&ecirc;n bản của một bức ảnh trong trường hợp bạn l&agrave; một nh&agrave; thiết kế đồ họa, hoặc sử dụng n&oacute; để lưu trữ c&aacute;c bản layout của website trong trường hợp bạn l&agrave;m thiết kế web. N&oacute;i chung VCS l&agrave; một c&ocirc;ng cụ hữu &iacute;ch v&agrave; cần thiết đối với mọi người.</p> <p style="text-align: justify;">VCS gi&uacute;p bạn trong việc kh&ocirc;i phục lại phi&ecirc;n bản cũ của c&aacute;c file, kh&ocirc;i phục lại phi&ecirc;n bản cũ của to&agrave;n bộ dự &aacute;n, xem lại c&aacute;c thay đổi đ&atilde; được thực hiện theo thời gian, xem ai l&agrave; người thực hiện thay đổi cuối c&ugrave;ng, xem x&eacute;t sự cố c&oacute; thể xảy ra khi n&agrave;o, ai l&agrave; người đ&atilde; g&acirc;y ra sự cố đ&oacute;...</p> <p style="text-align: justify;">Thậm ch&iacute; khi bạn lỡ tay l&agrave;m rối tung mọi thứ hoặc v&ocirc; t&iacute;nh x&oacute;a mất c&aacute;c file đi, bạn cũng c&oacute; thể kh&ocirc;i phục lại trạng th&aacute;i của ch&uacute;ng một c&aacute;ch dễ d&agrave;ng, nhanh ch&oacute;ng v&agrave; kh&ocirc;ng hề tốn qu&aacute; nhiều c&ocirc;ng sức.</p> <h2 style="text-align: justify;">Hệ thống quản l&yacute; phi&ecirc;n bản tập trung v&agrave; hệ thống quản l&yacute; phi&ecirc;n bản ph&acirc;n t&aacute;n</h2> <p style="text-align: justify;">Hệ thống quản l&yacute; phi&ecirc;n bản tập trung (Centralized Version Control Systems - CVCS) <span id="result_box" class="" lang="vi" tabindex="-1"><span title="First came the centralized version control system with RCS (1982) and its successor CVS (1987).">l&agrave; một hệ thống lưu trữ c&aacute;c thay đổi tại một m&aacute;y chủ trung t&acirc;m v&agrave; c&aacute;c m&aacute;y kh&aacute;ch phải truy cập v&agrave; tiến h&agrave;nh commit c&aacute;c thay đổi v&agrave;o kho lưu trữ (repository) trung t&acirc;m n&agrave;y</span></span>. C&aacute;c hệ thống n&agrave;y, v&iacute; dụ như <span id="result_box" class="" lang="vi" tabindex="-1"><span title="Currently the most popular are Subversion, TFVC, Perforce and Clearcase.">Subversion, TFVC, Perforce v&agrave; Clearcase</span></span>... bao gồm một m&aacute;y chủ c&oacute; chứa tất cả c&aacute;c tập tin đ&atilde; được "phi&ecirc;n bản ho&aacute;" (versioned), v&agrave; danh s&aacute;ch c&aacute;c m&aacute;y kh&aacute;ch c&oacute; quyền thay đổi c&aacute;c tập tin n&agrave;y tr&ecirc;n m&aacute;y chủ trung t&acirc;m đ&oacute;. <span id="result_box" class="" lang="vi" tabindex="-1"><span title="First came the centralized version control system with RCS (1982) and its successor CVS (1987)."><span title="If a change is made, it will reach every developer before they can commit their changes and unfortunately, that also includes broken code.">Nếu một thay đổi được thực hiện, n&oacute; sẽ tiếp cận v&agrave; đồng bộ tr&ecirc;n m&aacute;y chủ trung t&acirc;m v&agrave; mọi nh&agrave; ph&aacute;t triển ph&iacute;a m&aacute;y kh&aacute;ch đều c&oacute; thể thực hiện c&aacute;c commit thay đổi, điều đ&oacute; cũng c&oacute; nghĩa rằng họ c&oacute; thể đưa c&aacute;c m&atilde; nguồn lỗi v&agrave;o kho lưu trữ n&agrave;y. Điều n&agrave;y thật kh&ocirc;ng ổn khi chỉ một người đưa m&atilde; nguồn lỗi l&ecirc;n hệ thống th&igrave; to&agrave;n bộ những người tham gia sẽ bị ảnh hưởng v&agrave; l&agrave;m việc tr&ecirc;n m&atilde; nguồn lỗi n&agrave;y. Hơn nữa </span><span title="Since there is only one &ldquo;true&rdquo; repository, working offline can be a challenge.">do chỉ c&oacute; một kho lưu trữ &ldquo;đ&uacute;ng&rdquo; duy nhất, v&igrave; vậy việc l&agrave;m việc ngoại tuyến m&agrave; kh&ocirc;ng c&oacute; mạng l&agrave; một vấn đề. </span><span title="In order to complete basic operations like adding the viewing history or committing code, you need access to the repository. ">Để ho&agrave;n th&agrave;nh c&aacute;c hoạt động cơ bản như th&ecirc;m lịch sử xem hoặc commit m&atilde; nguồn mới, người d&ugrave;ng cần phải tiến h&agrave;nh truy cập v&agrave;o kho lưu trữ.&nbsp;</span></span></span>M&ocirc; h&igrave;nh n&agrave;y được sử dụng kh&aacute; phổ biến v&agrave; được coi l&agrave; m&ocirc; h&igrave;nh ti&ecirc;u chuẩn cho c&aacute;c hệ thống quản l&yacute; phi&ecirc;n bản trước đ&acirc;y.</p> <p><img class=" wp-image-5016 aligncenter" src="https://tek4.vn/wp-content/uploads/2019/10/git-l&agrave;-g&igrave;.png" alt="git l&agrave; g&igrave;" width="584" height="370" /></p> <p style="text-align: justify;"><span id="result_box" class="" lang="vi" tabindex="-1"><span title="First came the centralized version control system with RCS (1982) and its successor CVS (1987)."><span title="In order to complete basic operations like adding the viewing history or committing code, you need access to the repository. ">Do những hạn chế của c&aacute;c hệ thống quản l&yacute; phi&ecirc;n bản tập trung, C&aacute;c hệ thống quản l&yacute; phi&ecirc;n bản ph&acirc;n t&aacute;n - Distributed Version Control Systems (DVCS) như Git, Mercurial, Bazaar hay Darcs đ&atilde; ra đời. Trong c&aacute;c hệ thống n&agrave;y c&aacute;c m&aacute;y kh&aacute;ch kh&ocirc;ng chỉ "check out" (sao ch&eacute;p về m&aacute;y cục bộ) c&aacute;c phi&ecirc;n bản mới nhất của c&aacute;c tập tin m&agrave; ch&uacute;ng c&ograve;n sao ch&eacute;p (mirror) to&agrave;n bộ kho chứa (repository) v&agrave; l&agrave;m việc cục bộ tr&ecirc;n ch&iacute;nh kho chứa sao ch&eacute;p n&agrave;y, sau đ&oacute; sẽ tiến h&agrave;nh commit c&aacute;c thay đổi l&ecirc;n hệ thống chung. Ch&iacute;nh v&igrave; vậy nếu như một m&aacute;y kh&aacute;ch n&agrave;o trong hệ thống bị lỗi, th&igrave; kho chứa từ một m&aacute;y kh&aacute;ch bất kỳ kh&aacute;c n&agrave;o cũng c&oacute; thể d&ugrave;ng để sao ch&eacute;p ngược trở lại m&aacute;y chủ để kh&ocirc;i phục lại to&agrave;n bộ hệ thống. Mỗi lần checkout của m&aacute;y kh&aacute;ch l&agrave; một lần tạo bản sao đầy đủ của tất cả dữ liệu.</span></span></span><span id="result_box" class="" lang="vi" tabindex="-1"><span title="Using these systems all developers access a single central repository."><br /></span></span></p> <p><img class=" wp-image-5017 aligncenter" src="https://tek4.vn/wp-content/uploads/2019/10/git-l&agrave;-g&igrave;_2.png" alt="git l&agrave; g&igrave;_2" width="539" height="419" /></p> <p style="text-align: justify;"><span title="In the distributed model, every developer has his/her own copy of the repository.">Trong m&ocirc; h&igrave;nh ph&acirc;n t&aacute;n, mọi nh&agrave; ph&aacute;t triển đều c&oacute; bản sao kho lưu trữ của ri&ecirc;ng m&igrave;nh m&agrave; kh&ocirc;ng cần l&agrave;m việc qua một m&aacute;y chủ trung t&acirc;m. </span><span title="Using this approach, developers can work offline &mdash; they can commit, branch, merge branches, view history, anything they need as they have the whole repository at hand.">Với c&aacute;ch tiếp cận n&agrave;y, c&aacute;c nh&agrave; ph&aacute;t triển c&oacute; thể l&agrave;m việc ngoại tuyến &ndash; c&oacute; thể commit, ph&acirc;n nh&aacute;nh, hợp nhất c&aacute;c nh&aacute;nh, xem lịch sử, hoặc bất cứ thao t&aacute;c g&igrave; cần thiết khi đ&atilde; c&oacute; to&agrave;n bộ kho lưu trữ cục bộ. </span><span title="Internet access is needed only when synchronization with the other team members occurs.">Chỉ cần truy cập Internet khi muốn đồng bộ h&oacute;a dữ liệu với c&aacute;c th&agrave;nh vi&ecirc;n kh&aacute;c trong nh&oacute;m.</span></p> <p style="text-align: justify;">C&aacute;c hệ thống quản l&yacute; phi&ecirc;n bản ph&acirc;n t&aacute;n n&agrave;y xử l&yacute; rất tốt việc quản l&yacute; nhiều kho chứa từ xa, v&igrave; vậy bạn c&oacute; thể cộng t&aacute;c với nhiều nh&oacute;m c&aacute;c nh&agrave; ph&aacute;t triển kh&aacute;c nhau theo những c&aacute;ch kh&aacute;c nhau trong c&ugrave;ng một dự &aacute;n. Điều n&agrave;y cho ph&eacute;p bạn c&agrave;i đặt nhiều loại "tiến tr&igrave;nh c&ocirc;ng việc" (workflow) kh&ocirc;ng thể thực hiện được với c&aacute;c hệ thống tập trung.</p> <h2>Git l&agrave; g&igrave;?</h2> <p style="text-align: justify;">Git l&agrave; một hệ thống quản l&yacute; phi&ecirc;n bản ph&acirc;n t&aacute;n để theo d&otilde;i c&aacute;c thay đổi trong m&atilde; nguồn trong qu&aacute; tr&igrave;nh ph&aacute;t triển phần mềm. N&oacute; được thiết kế với mục ti&ecirc;u ch&iacute;nh l&agrave; để hỗ trợ sự phối hợp c&ocirc;ng việc giữa c&aacute;c lập tr&igrave;nh vi&ecirc;n, tuy nhi&ecirc;n n&oacute; cũng c&oacute; thể được sử dụng để theo d&otilde;i c&aacute;c thay đổi trong c&aacute;c hệ thống tệp tin bất kỳ n&oacute;i chung.</p> <p style="text-align: justify;">Git được Linus Torvalds tạo ra v&agrave;o năm 2005, vốn được ph&aacute;t triển nhằm tạo thuận lợi cho việc quản l&yacute; m&atilde; nguồn trong qu&aacute; tr&igrave;nh ph&aacute;t triển nh&acirc;n của Linux. V&agrave; sau n&agrave;y n&oacute; cũng được mở rộng sang c&aacute;c m&ocirc;i trường kh&aacute;c như Windows hay MacOS với nhiều mục đ&iacute;ch kh&aacute;c nhau, tuy nhi&ecirc;n mục ti&ecirc;u t&iacute;nh vẫn l&agrave; được sử dụng để quản l&yacute; m&atilde; nguồn trong qu&aacute; tr&igrave;nh ph&aacute;t triển phần mềm. Giống như hầu hết c&aacute;c hệ thống kiểm so&aacute;t phi&ecirc;n bản ph&acirc;n t&aacute;n kh&aacute;c, mọi thư mục Git tr&ecirc;n mỗi m&aacute;y t&iacute;nh l&agrave; một kho lưu trữ ghi lại đầy đủ nội dung v&agrave; lịch sử thay đổi c&ugrave;ng với khả năng theo d&otilde;i phi&ecirc;n bản m&agrave; kh&ocirc;ng cần duy tr&igrave; kết nối mạng li&ecirc;n tục. Git l&agrave; phần mềm miễn ph&iacute; v&agrave; nguồn mở được ph&acirc;n phối theo c&aacute;c điều khoản của Giấy ph&eacute;p C&ocirc;ng cộng GNU phi&ecirc;n bản 2.</p> <p class="Mg-b30" style="text-align: justify;">Tr&ecirc;n Git, c&aacute;c lịch sử cập nhật sẽ lưu trạng th&aacute;i của file khi c&oacute; nhu cầu. V&igrave; thế, ch&uacute;ng ta c&oacute; thể kh&ocirc;i phục lại trạng th&aacute;i của một file đ&atilde; chỉnh sửa về trạng th&aacute;i cũ hoặc c&oacute; thể xem x&eacute;t được sự kh&aacute;c biệt qua c&aacute;c lần chỉnh sửa.</p> <p class="Mg-b30" style="text-align: justify;">Khi định ghi đ&egrave; (overwrite) l&ecirc;n file mới nhất đ&atilde; chỉnh sửa của người kh&aacute;c bằng file đ&atilde; chỉnh sửa dựa tr&ecirc;n file cũ, th&igrave; khi đăng (upload) l&ecirc;n server sẽ hiện ra cảnh c&aacute;o. Điều n&agrave;y gi&uacute;p tr&aacute;nh được c&aacute;c lỗi xung đột do việc ghi đ&egrave; l&ecirc;n nội dung chỉnh sửa của người kh&aacute;c m&agrave; kh&ocirc;ng hề hay biết.</p> <h2>Git ra đời như thế n&agrave;o?</h2> <p style="text-align: justify;">Sự h&igrave;nh th&agrave;nh của Git gắn liền với qu&aacute; tr&igrave;nh ph&aacute;t triển của nh&acirc;n Linux. Ban đầu, trong phần lớn thời gian cập nhật bảo tr&igrave; của nh&acirc;n Linux (1991-2002), c&aacute;c thay đổi tr&ecirc;n m&atilde; nguồn của n&oacute; được truyền đi dưới dạng c&aacute;c bản v&aacute; v&agrave; c&aacute;c tập tin lưu trữ.Tuy nhi&ecirc;n, do sự mở rộng của cộng đồng v&agrave; sự phức tạp trong dự &aacute;n ph&aacute;t triển, n&oacute; y&ecirc;u cầu phải sử dụng một hệ thống quản l&yacute; phi&ecirc;n bản ph&acirc;n t&aacute;n. Năm 2002, dự &aacute;n nh&acirc;n Linux bắt đầu sử dụng một hệ thống quản l&yacute; phi&ecirc;n bản ph&acirc;n t&aacute;n c&oacute; t&ecirc;n l&agrave; BitKeeper. Ban đầu, do sự hợp t&aacute;c giữa cộng đồng ph&aacute;t triển v&agrave; c&ocirc;ng ty ph&aacute;t triển BitKeeper, c&aacute;c nh&agrave; ph&aacute;t triển được sử dụng n&oacute; một c&aacute;ch miễn ph&iacute;. Tuy nhi&ecirc;n, do một số l&iacute; do, đến năm 2005, sự hợp t&aacute;c n&agrave;y kh&ocirc;ng được duy tr&igrave; nữa, v&agrave; c&aacute;c nh&agrave; ph&aacute;t triển bắt đầu phải trả ph&iacute;. Ch&iacute;nh điều n&agrave;y đ&atilde; th&uacute;c đẩy cộng đồng ph&aacute;t triển Linux (ch&iacute;nh x&aacute;c hơn l&agrave; <a href="https://en.wikipedia.org/wiki/Linus_Torvalds">Linus Torvalds</a>, người s&aacute;ng lập ra Linux) ph&aacute;t triển c&ocirc;ng cụ của ri&ecirc;ng dựa tr&ecirc;n những chức năng cơ bản của BitKeeper.</p> <p style="text-align: justify;">Kể từ khi ra đời năm 2005, Git đ&atilde; tiến ho&aacute; v&agrave; ph&aacute;t triển to&agrave;n diện để dễ d&agrave;ng sử dụng hơn, v&agrave; hoạt động v&ocirc; c&ugrave;ng hiệu quả với c&aacute;c dự &aacute;n lớn.</p> <h2>Sự kh&aacute;c biệt giữa c&aacute;c hệ thống quản l&yacute; phi&ecirc;n bản kh&aacute;c v&agrave; Git l&agrave; g&igrave;?</h2> <p>Nếu c&aacute;c bạn đ&atilde; c&oacute; một số kiến thức về c&aacute;c hệ thống quản l&yacute; phi&ecirc;n bản kh&aacute;c, như Subversion hay Perforce th&igrave; khi sang Git, bạn sẽ kh&aacute; bối rối. Mặc d&ugrave; giao diện v&agrave; một số thao t&aacute;c cơ bản tr&ecirc;n Git kh&aacute; giống c&aacute;c <a href="https://tek4.vn/svn-hay-git-dau-la-giai-phap-phu-hop-cho-lap-trinh-vien/">VCS kh&aacute;c</a>, tuy nhi&ecirc;n n&oacute; c&oacute; quan điểm về th&ocirc;ng tin v&agrave; c&aacute;ch thức lưu trữ th&ocirc;ng tin kh&aacute; kh&aacute;c biệt.</p> <p>Vậy sự kh&aacute;c biệt giữa c&aacute;c VCS kh&aacute;c v&agrave; Git l&agrave; g&igrave;?</p> <p style="text-align: justify;">Phần lớn c&aacute;c hệ thống VCS kh&aacute;c lưu trữ th&ocirc;ng tin dưới dạng danh s&aacute;ch c&aacute;c tập tin được thay đổi. Ch&uacute;ng coi th&ocirc;ng tin được lưu trữ như một tập hợp c&aacute;c tập tin v&agrave; c&aacute;c thay đổi được thực hiện tr&ecirc;n mỗi tập tin theo thời gian.</p> <p>[caption id="attachment_5018" align="aligncenter" width="491"]<img class="wp-image-5018" src="https://tek4.vn/wp-content/uploads/2019/10/c&aacute;c-VCS-kh&aacute;c.png" alt="c&aacute;c VCS kh&aacute;c" width="491" height="219" /> C&aacute;ch thức lưu trữ dữ liệu của c&aacute;c VCS kh&aacute;c[/caption]</p> <p style="text-align: justify;">Git kh&ocirc;ng xử l&yacute; dữ liệu theo c&aacute;ch n&agrave;y. Git coi dữ liệu giống như một tập hợp c&aacute;c "ảnh" (snapshot) của một hệ thống tập tin nhỏ. Mỗi lần bạn "commit", hoặc lưu lại trạng th&aacute;i hiện tại của dự &aacute;n trong Git sẽ đồng nghĩa với việc snapshot lại nội dung của tất cả c&aacute;c tập tin tại thời điểm đ&oacute; v&agrave; tạo ra một tham chiếu tới "ảnh" đ&oacute;. Nếu như tập tin kh&ocirc;ng c&oacute; sự thay đổi n&agrave;o, Git sẽ kh&ocirc;ng lưu trữ tập tin đ&oacute; lại một lần nữa m&agrave; chỉ tạo một li&ecirc;n kết tới tập tin gốc đ&atilde; tồn tại trước đ&oacute;.</p> <p>[caption id="attachment_5019" align="aligncenter" width="500"]<img class="size-full wp-image-5019" src="https://tek4.vn/wp-content/uploads/2019/10/Git-l&agrave;-g&igrave;.png" alt="Git l&agrave; g&igrave;" width="500" height="222" /> C&aacute;ch thức lưu trữ dữ liệu của Git[/caption]</p> <p style="text-align: justify;">Đ&acirc;y l&agrave; sự kh&aacute;c biệt lớn nhất giữa Git v&agrave; hầu hết c&aacute;c VCS kh&aacute;c. Điều n&agrave;y l&agrave;m cho Git kh&ocirc;ng chỉ l&agrave; một hệ thống quản l&yacute; phi&ecirc;n bản đơn giản, m&agrave; n&oacute; hoạt động gần giống như một hệ thống quản l&yacute; tập tin thu nhỏ với c&aacute;c t&iacute;nh năng, c&ocirc;ng cụ v&ocirc; c&ugrave;ng mạnh mẽ. N&oacute; tạo ra một số lợi &iacute;ch trong việc Ph&acirc;n nh&aacute;nh trong Git.</p> <h2>C&aacute;ch thức hoạt động của Git l&agrave; g&igrave;?</h2> <p style="text-align: justify;">Phần lớn c&aacute;c thao t&aacute;c/hoạt động trong Git chỉ cần y&ecirc;u cầu c&aacute;c tập tin hay t&agrave;i nguy&ecirc;n cục bộ. Git kh&ocirc;ng y&ecirc;u cầu bất cứ th&ocirc;ng tin hay t&agrave;i nguy&ecirc;n từ m&aacute;y t&iacute;nh n&agrave;o kh&aacute;c trong mạng. To&agrave;n bộ dự &aacute;n ho&agrave;n to&agrave;n nằm tr&ecirc;n ổ cứng của bạn, do đ&oacute; c&aacute;c thao t&aacute;c được thực hiện gần như ngay lập tức m&agrave; kh&ocirc;ng hề c&oacute; độ trễ như tr&ecirc;n c&aacute;c hệ thống quản l&yacute; phi&ecirc;n bản tập trung.</p> <p style="text-align: justify;">Khi bạn muốn xem lịch sử của dự &aacute;n, Git kh&ocirc;ng cần phải lấy th&ocirc;ng tin đ&oacute; từ một m&aacute;y chủ kh&aacute;c để hiển thị, m&agrave; đơn giản n&oacute; được đọc trực tiếp từ ch&iacute;nh cơ sở dữ liệu cục bộ của bạn. V&agrave; do đ&oacute; thao t&aacute;c n&agrave;y được thực hiện gần như ngay lập tức. Nếu như bạn muốn so s&aacute;nh sự thay đổi giữa phi&ecirc;n bản hiện tại của một tập tin với phi&ecirc;n bản của một th&aacute;ng trước, Git c&oacute; thể t&igrave;m kiếm tập tin cũ đ&oacute; tr&ecirc;n m&aacute;y cục bộ rồi sau đ&oacute; so s&aacute;nh sự kh&aacute;c biệt cho bạn. Thay v&igrave; việc phải truy vấn từ xa hoặc "k&eacute;o về" (pull) phi&ecirc;n bản cũ của tập tin đ&oacute; từ m&aacute;y chủ trung t&acirc;m rồi mới thực hiện so s&aacute;nh cục bộ.</p> <p style="text-align: justify;">Do đ&oacute;, bạn c&oacute; thể l&agrave;m hầu hết mọi việc m&agrave; kh&ocirc;ng cần đến kết nối Internet hay VPN. Bạn c&oacute; thể vừa di chuyển vừa l&agrave;m việc, l&agrave;m việc ở nh&agrave;, hay đi du lịch ở đ&acirc;u đ&oacute;, việc commit diễn ra b&igrave;nh thường cho tới khi c&oacute; kết nối Internet để đồng bộ ho&aacute;. Trong rất nhiều hệ thống kh&aacute;c, việc n&agrave;y gần như l&agrave; kh&ocirc;ng thể hoặc rất kh&oacute; khăn. V&iacute; dụ trong Perforce hay Subversion, bạn gần như kh&ocirc;ng thể l&agrave;m g&igrave; nếu như kh&ocirc;ng kết nối được tới m&aacute;y chủ; bạn c&oacute; thể sửa tập tin nhưng bạn kh&ocirc;ng thể commit c&aacute;c thay đổi đ&oacute; v&agrave;o cơ sở dữ liệu (v&igrave; cơ sở dữ liệu của bạn kh&ocirc;ng được kết nối). Đ&acirc;y c&oacute; thể kh&ocirc;ng phải l&agrave; điều g&igrave; đ&oacute; lớn lao đối với Git. N&oacute; c&ograve;n c&oacute; nhiều chức năng hay ho hơn nhiều.</p> <h3>Git đảm bảo t&iacute;nh to&agrave;n vẹn của tệp tin</h3> <p>Cơ chế đảm bảo t&iacute;nh to&agrave;n vẹn trong git l&agrave; g&igrave;?</p> <p style="text-align: justify;">Git "băm" mọi dữ liệu trước khi lưu trữ v&agrave; tiến h&agrave;nh tham chiếu tới dữ liệu th&ocirc;ng qua c&aacute;c m&atilde; băm n&agrave;y. Điều n&agrave;y l&agrave;m cho l&agrave; việc thay đổi nội dung của một tập tin hay một thư mục m&agrave; Git kh&ocirc;ng biết tới l&agrave; điều kh&ocirc;ng thể. Chức năng n&agrave;y l&agrave; cốt l&otilde;i trong Git v&agrave; về mặt l&yacute; thuyết c&oacute; thể đảm bảo t&iacute;nh to&agrave;n vẹn cho c&aacute;c tệp tin lưu trữ. Mọi sự mất m&aacute;t hay lỗi tr&ecirc;n dữ liệu đều sẽ bị Git ph&aacute;t hiện được.</p> <p style="text-align: justify;">Thuật to&aacute;n băm được sử dụng trong Git l&agrave; SHA-1. Thuật to&aacute;n băm n&agrave;y biến một nội dung dữ liệu c&oacute; k&iacute;ch thước bất kỳ th&agrave;nh một chuỗi c&oacute; độ d&agrave;i 40 k&yacute; tự Hexa (0-9 v&agrave; A - F). Một m&atilde; băm SHA-1 c&oacute; định dạng như sau:</p> <pre><code>24b9da6552252987aa493b52f8696cd6d3b00373 </code></pre> <p>M&atilde; băm n&agrave;y được t&iacute;nh to&aacute;n dựa tr&ecirc;n nội dung của tập tin hoặc cấu tr&uacute;c thư mục trong Git.</p> <p style="text-align: justify;">Bạn sẽ thấy c&aacute;c m&atilde; băm được sử dụng ở mọi nơi trong Git. Thực tế, Git kh&ocirc;ng lưu trữ v&agrave; xử l&yacute; trực tiếp t&ecirc;n tệp m&agrave; sử dụng c&aacute;c m&atilde; băm của tệp để đưa v&agrave;o lưu trữ trong một cơ sở dữ liệu c&oacute; thể truy vấn được.</p> <p style="text-align: justify;">Khi bạn thực hiện c&aacute;c h&agrave;nh động trong Git, phần lớn tất cả h&agrave;nh động đ&oacute; đều được th&ecirc;m v&agrave;o cơ sở dữ liệu của Git. Rất kh&oacute; để y&ecirc;u cầu hệ thống thực hiện một h&agrave;nh động n&agrave;o đ&oacute; m&agrave; kh&ocirc;ng thể kh&ocirc;i phục lại được (chẳng hạn như việc xo&aacute; dữ liệu). Giống như trong c&aacute;c VCS kh&aacute;c, bạn c&oacute; thể x&oacute;a hoặc l&agrave;m rối tung dữ liệu m&agrave; bạn chưa commit; nhưng khi bạn đ&atilde; commit th&igrave; rất kh&oacute; để x&oacute;a c&aacute;c dữ liệu đ&oacute; đi, đặc biệt l&agrave; nếu bạn thường xuy&ecirc;n đẩy (push) cơ sở dữ liệu sang một kho chứa kh&aacute;c.</p> <p style="text-align: justify;">Điều n&agrave;y khiến việc sử dụng Git trở n&ecirc;n "an to&agrave;n" bởi v&igrave; ch&uacute;ng ta c&oacute; thể thử nghiệm, "nghịch ngợm" m&agrave; kh&ocirc;ng lo sợ sẽ ph&aacute; hỏng mọi thứ.</p> <h3 id="Ba-Trạng-Th&aacute;i">Ba trạng th&aacute;i cơ bản của Git l&agrave; g&igrave;?</h3> <p style="text-align: justify;">Git xử l&yacute; v&agrave; lưu trữ c&aacute;c tệp dưới 3 trạng th&aacute;i cơ bản đ&oacute; l&agrave;: committed, modified, v&agrave; staged. Đ&acirc;y l&agrave; yếu tố quan trọng nhất m&agrave; bạn cần nhớ để c&oacute; thể hiểu được những phần tiếp theo một c&aacute;ch tr&ocirc;i chảy.</p> <ul> <li style="text-align: justify;">Committed l&agrave; trạng th&aacute;i khi dữ liệu đ&atilde; được lưu trữ một c&aacute;ch an to&agrave;n trong cơ sở dữ liệu.</li> <li style="text-align: justify;">Modified l&agrave; trạng th&aacute;i tệp tin đ&atilde; bị thay đổi nhưng chưa được commit v&agrave;o cơ sở dữ liệu.</li> <li style="text-align: justify;">V&agrave; staged l&agrave; trạng th&aacute;i đ&atilde; đ&aacute;nh dấu sẽ commit phi&ecirc;n bản hiện tại của một tập tin đ&atilde; chỉnh sửa trong lần commit sắp tới.</li> </ul> <p style="text-align: justify;">Dựa tr&ecirc;n 3 trạng th&aacute;i n&agrave;y Git tạo ra ba khu vực ri&ecirc;ng biệt: thư mục Git, thư mục l&agrave;m việc, v&agrave; khu vực tổ chức (staging area).</p> <p style="text-align: justify;">Thư mục Git l&agrave; nơi Git lưu trữ c&aacute;c "si&ecirc;u dữ liệu" (metadata) v&agrave; cơ sở dữ liệu cho dự &aacute;n. Đ&acirc;y l&agrave; phần quan trọng nhất của Git, n&oacute; l&agrave; phần được sao lưu về khi bạn tạo một bản sao (clone) của một kho chứa từ một m&aacute;y t&iacute;nh kh&aacute;c.</p> <p style="text-align: justify;">Thư mục l&agrave;m việc l&agrave; bản sao một phi&ecirc;n bản của dự &aacute;n. Những tập tin n&agrave;y được k&eacute;o về (pulled) từ cơ sở dữ liệu được n&eacute;n lại trong thư mục Git v&agrave; lưu tr&ecirc;n ổ cứng cho bạn sử dụng hoặc chỉnh sửa.</p> <p style="text-align: justify;">Khu vực tổ chức l&agrave; một tập tin đơn giản được chứa trong thư mục Git, n&oacute; chứa th&ocirc;ng tin về những g&igrave; sẽ được commit trong lần commit sắp tới. Khu vực n&agrave;y cũng thường được gọi l&agrave; khu vực "chỉ mục" (index).</p> <p style="text-align: justify;">Git tu&acirc;n theo tiến tr&igrave;nh l&agrave;m việc cơ bản như sau:</p> <ol> <li style="text-align: justify;">Đầu ti&ecirc;n bạn thay đổi c&aacute;c tập tin trong thư mục l&agrave;m việc.</li> <li style="text-align: justify;">Sau đ&oacute; bạn tổ chức c&aacute;c tập tin, tạo mới snapshot của c&aacute;c tập tin đ&oacute; v&agrave;o khu vực tổ chức.</li> <li style="text-align: justify;">Cuối c&ugrave;ng l&agrave; commit, snapshot của c&aacute;c tập tin trong khu vực tổ chức sẽ được lưu trữ vĩnh viễn v&agrave;o thư mục Git.</li> </ol> <p style="text-align: justify;">Nếu một phi&ecirc;n bản n&agrave;o đ&oacute; của một tập tin nằm trong thư mục Git, n&oacute; được coi l&agrave; đ&atilde; commit. Nếu như n&oacute; đ&atilde; được sửa v&agrave; th&ecirc;m v&agrave;o khu vực tổ chức, nghĩa l&agrave; n&oacute; đ&atilde; được staged. V&agrave; nếu n&oacute; được thay đổi từ khi checkout nhưng chưa được staged, n&oacute; được coi l&agrave; đ&atilde; thay đổi.</p> <p>Trong b&agrave;i viết n&agrave;y ch&uacute;ng ta đ&atilde; biết Git l&agrave; g&igrave;, v&agrave; một số kh&aacute;i niệm cơ bản trong Git, c&aacute;ch thức Git lưu trữ v&agrave; kiểm so&aacute;t c&aacute;c trạng th&aacute;i. Trong c&aacute;c b&agrave;i viết tiếp theo ch&uacute;ng ta sẽ t&igrave;m hiểu chi tiết hơn c&aacute;ch thức sử dụng Git v&agrave; l&agrave;m r&otilde; những ưu điểm của Git l&agrave; g&igrave;.</p> <p>H&atilde;y theo d&otilde;i chuy&ecirc;n mục v&agrave; để lại b&igrave;nh luận b&ecirc;n dưới nh&eacute;!</p> <p>&nbsp;</p> <hr /> <p style="text-align: center;"><em><strong>Fanpage Facebook:</strong>&nbsp;<a href="https://www.facebook.com/tek4.vn/">TEK4.VN</a></em>&nbsp;</p> <p style="text-align: center;"><em><strong>Tham gia cộng đồng để chia sẻ, trao đổi v&agrave; thảo luận:</strong>&nbsp;<a href="https://www.facebook.com/groups/tek4.vn/">TEK4.VN - Học Lập Tr&igrave;nh Miễn Ph&iacute;</a></em></p>