Giới thiệu về git

Trong bài chuỗi mở đầu về git, mình sẽ giới thiệu về git, về cách hoạt động của git và lợi ích git mang lại khi sử dụng.

1. Git là gì?

Git là một hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS), nó là một trong những hệ thống quản lý phiên bản phân tán phổ biến nhất hiện nay. Git cung cấp các kho lưu trữ (repository) chứa toàn bộ lịch sử thay đổi.

Version Control System – VCS là gì?

VCS là viết tắt của Version Control Systemhệ thống kiểm soát các phiên bản phân tán mã nguồn mở. Các VCS sẽ lưu trữ tất cả các file trong toàn bộ dự án và ghi lại toàn bộ lịch sử thay đổi của file. Mỗi sự thay đổi được lưu lại sẽ được và thành một version (phiên bản).

VCS nghĩa là hệ thống giúp lập trình viên có thể lưu trữ nhiều phiên bản khác nhau của một mã nguồn được clone từ một kho chứa mã nguồn (repository), mỗi thay đổi vào mã nguồn trên local sẽ có thể commit rồi đưa lên server nơi đặt kho chứa chính.

Và một máy tính khác nếu họ có quyền truy cập cũng có thể clone lại mã nguồn từ kho chứa hoặc clone lại một tập hợp các thay đổi mới nhất trên máy tính kia.

Lập trình viên có thể xem lại rất nhiều thông tin về danh sách các sự thay đổi của file như xem một dòng thời gian của các phiên bản. Mỗi phiên bản bao gồm: nội dung file bị thay đổi, ngày giờ sửa đổi, người thay đổi là ai, lý do thay đổi hay tên phiên bản…vv

VCS có tác dụng như thế nào?

  1. Lưu lại lịch sử các version của bất kỳ thay đổi nào của dự án. Giúp xem lại các sự thay đổi hoặc khôi phục (revert) lại sau này.
  2. Việc chia sẻ code trở nên dễ dàng hơn, lập trình viên có thể để public cho bất kỳ ai, hoặc private chỉ cho một số người có thẩm quyền có thể truy cập và lấy code về.

Git cũng là một VCS nên cũng sẽ chứa tất cả tác dụng ở trên.

2. Kiến trúc của git

Git hoạt động như thế nào? Trước tiên, hầu hết các hệ thống VCS đều lưu trữ thông tin dưới dạng danh sách các thay đổi dựa trên file và coi thông tin lưu giữ dưới dạng một tập hợp các file.

Như trong hình trên ta thấy, ở các hệ thống VCS thông thường, với mỗi version, chỉ những file có sự thay đổi mới được đưa vào version, như v1 sẽ lưu 3 file mới là A, B, C, sang version 2 đó sẽ là thay đổi ở file A và C và cứ như thế cho mỗi version.

Nhưng Git lại khác, Git coi thông tin được lưu trữ là một tập hợp các snapshot – ảnh chụp toàn bộ nội dung tất cả các file tại thời điểm.

Mỗi khi bạn commit, Git sẽ chụp và tạo ra một snapshot cùng một tham chiếu tới snapshot đó. Để hiệu quả, nếu các tệp không thay đổi, Git sẽ không lưu trữ lại file — chỉ là một liên kết đến tệp giống file trước đó mà nó đã lưu trữ. Như trong ảnh, ta thấy ở version 1 git snapshot 3 file A, B, C sau đó sang version 2 git cũng snapshot 3 file A, B, C nhưng ở đây file A và C thay đổi thành A1 và C1, file B không đổi.

Action các thông tin về lịch sử thay đổi các file hoàn toàn nằm trên máy tính của bạn, các thao tác với các tập tin bạn gần như có thể thực hiện ngay lập tức mà không cần lo lắng đến vấn đề tốc độ internet. Ví dụ nếu bạn cần xem lịch sử thay đổi của 1 file ở thời điểm 1 tháng trước, Git sẽ tìm kiềm file đó trên máy bạn và ngay lập tức so sánh sự thay đổi giữa thời điểm hiện tại và 1 tháng trước thay vì việc bạn phải lấy thông tin tập tin đó từ 1 máy chủ từ xa. Đồng nghĩa với việc nếu Internet chỗ bạn quá kém, bạn bị mất kết nốt internet thì cũng không ảnh hưởng gì. Bạn vẫn có thể xem log, commit các thay đổi mới nhất ở local. Đến khi Internet quay trở lại, bạn chỉ đẩy code mới nhất lên.

Tính toàn vẹn các file trong Git đều được băm trước khi lưu và được tham chiếu bằng mã băm đó vậy nên việc bạn bị mất trong khi truyền tải hoặc nhận dữ liệu là điều không thể. Cơ chế băm mà Git sử dụng là SHA-1. Một mã SHA-1 có định dạng như sau : 24b9da6552252987aa493b52f8696cd6d3b00373.

Thực tế, Git không sử dụng tên của các tập để lưu trữ mà bằng các mã băm từ nội dung của tập tin vào một cơ sở dữ liệu có thể truy vấn được.

Tất các các hành động của bạn đều được Git ghi lại vào trong cơ sở dữ liệu. Mọi hành động này đều có thể khôi phục được, bạn không cần lo lắng đền việc bạn đã làm code lộn xộn sau mỗi lần commit mà không revert lại được code trước đấy. Lưu ý là chỉ sau khi bạn đã commit nhé.

Trạng thái: Mỗi file trong Git được quản lý với 3 trạng thái : committed, modified hoặc untracked, staged.

Ngoài 3 trạng thái trên, Git files còn làm việc với 3 khu vực: working directory, staging areagit directory

  • git directory (Thư mục Git): nơi lưu trữ các metadata và database cho dự án. Đây là phần quan trọng nhất của Git, được sao lưu về máy tính cá nhân khi bạn clone code từ 1 repository.
  • Working directory (Thư mục làm việc): nơi lưu trữ source code dự án. Dữ liệu được lấy từ database nén trong thư mục Git
  • Staging area: là một tập tin nằm trong thư muc Git, bao gồm các thông tin về những gì sẽ được commit trong lần commit sắp tới. Hay còn được gọi là index.

Như trong ảnh ta thấy:

  • modified/untracked: Git sẽ theo dõi các file untracked hoặc modified. Với untracked là các file mới trong project, modified là file đã có thay đổi nhưng thay đổi đó chưa được snapshot.

  • staged: khi file có trạng thái staged, nó sẽ được đưa và Staging Area - nơi mà git có thể snapshot và lưu trạng thái hiện tại của file trên local repository(thư mục trên máy của bạn). Staging Area cũng được coi là khu vực được đánh index.

  • committed: tức là git đã snapshot lại file ở Staging Area phía trên với 1 unique index trong Git directory. Mục đích của việc committed là bạn có thể revert về các trạng thái cũ của dự án ở bất kì thời điểm nào trong tương lai.(sau khi đã committed) và snapshot cuối cùng đó chính là HEAD.

3. Git có lợi ích gì?

Các dự án thực tế thường có nhiều thành viên làm việc song song. Vì vậy, một hệ thống kiểm soát phiên bản như Git là cần thiết để đảm bảo không có xung đột code(conflict) giữa các thành viên với nhau.

Ngoài ra, các yêu cầu trong các dự án như vậy thay đổi thường xuyên. Vì vậy, một hệ thống kiểm soát phiên bản cho phép các nhà phát triển thay đổi, revert và checkout phiên bản cũ hơn của code.

Cuối cùng, đôi khi một số dự án đang được chạy song song liên quan đến cùng một cơ sở code. Trong trường hợp như vậy, khái niệm phân nhánh trong Git là rất quan trọng.

  • Dễ sử dụng, thao tác nhanh, gọn, lẹ và rất an toàn.
  • Dễ dàng kết hợp các phân nhánh (branch), có thể giúp quy trình làm việc code theo nhóm đơn giản hơn rất nhiều.
  • Chỉ cần clone mã nguồn từ kho chứa hoặc clone một phiên bản thay đổi nào đó từ kho chứa, hoặc một nhánh nào đó từ kho chứa là bạn có thể làm việc ở mọi lúc mọi nơi.
  • Deployment sản phẩm của bạn một cách không thể nào dễ dàng hơn.

Mình vừa giới thiệu một số khái niệm về git, về kiến trúc của git và lợi ích khi sử dụng git. Trong bài tiếp theo của series này mình sẽ hướng dẫn một số config option cho git thường sử dụng:

Giới thiệu các config option cho git thường sử dụng

Related article