Git là gì?

Git là hệ thống kiểm soát phiên bản phân tán mã nguồn mở (Open Source Distributed Version Control System). Có rất nhiều cách để định nghĩa Git, ở đây tôi sẽ tách nhỏ ra và giải thích chi tiết ngữ nghĩa.

 ● Hệ thống kiểm soát (Control System): Về cơ bản, điều này có nghĩa Git là một trình theo dõi nội dung, do đó, Git có thể được sử dụng để lưu trữ nội dung và chủ yếu được sử dụng để lưu trữ source code dựa theo những tính năng mà nó cung cấp.

 ● Hệ thống kiếm soát phiên bản (Version Control System): Source code lưu trữ trong Git sẽ thay đổi khi có càng nhiều source code mới được thêm vào. Hơn nữa, nhiều developer có thể add thêm source code song song đó. Vì vậy Hệ thống kiểm soát phiên bản giúp xử lý vấn đề này bằng cách duy trì lịch sử những thay đổi đã xảy ra. Thêm vào đó, Git còn cung cấp các tính năng như nhánh (branch) và gộp nhánh (merge) 

 ● Hệ thống kiểm soát phiên bản phân tán (Distributed Version Control System): Git có một kho lưu trữ từ xa được lưu trữ trong một máy chủ và một kho lưu trữ cục bộ được lưu trữ trong máy tính của mỗi developer. Điều này có nghĩa là source code không chỉ được lưu trữ trong máy chủ trung tâm mà bản sao đầy đủ của source code đó cũng được lưu trữ trong tất cả các máy tính của developer. 

 

Các từ khóa cần biết trong Git

 

Git: Tên hệ thống quản trị mã nguồn (nó tương đương SVN hay TFS…) và nó không phải Github nhé.

 

Github: Là một dịch vụ lưu trữ và chia sẻ mã nguồn sử dụng hệ thống quản trị Git, ngoài ra có Azure DevOps, Bitbucket…

 

Repositories /レポシトリー : Là nơi đặt mã nguồn git, thường là 1 project sẽ tạo 1 Repository riêng hoặc 1 Repository chứa nhiều mã nguồn nhiều project con. Nói chung nó là một bộ mã nguồn nếu muốn lưu trữ trên git thì chúng ta đều phải tạo ra 1 repository và đẩy code lên đó. Thường thì 1 account Git hoặc 1 project sẽ cho tạo nhiều Repository trên đó. Ví dụ: https://github.com/teduinternational đây là Github account của TEDU chứa nhiều Repository trên đó, mỗi repository là một mã nguồn.

 

Branch/ブランチ : Mỗi một repository chúng ta chia ra nhiều nhánh code, để giúp các developer hay nhóm phát triển các tính năng độc lập của phần mềm mà không bị ảnh hưởng đến nhau, mỗi nhánh sẽ là một danh sách các commit mà không ảnh hưởng đến danh sách commit của nhánh khác, chúng được sắp xếp theo thời gian trước sau. Chỉ khi merge nhánh này với nhánh kia thì code mới được nhập chung với nhau.

 

Commit/コミット : Mỗi lần chúng ta làm xong chúng ta muốn báo cho Git lưu lại các thay đổi so với code nguyên bản trước khi sửa thì chúng ta cần lưu lại các thay đổi trong commit. Một commit là một lần chúng ta lưu lại code vào Git nó sẽ tự sinh ra 1 commit Id, chúng ta có thể quay về bất cứ commit nào trong lịch sử sửa code. Hoặc là tra xem sự khác nhau giữa các commit ra sao?

 

Merge code/コードをマージする : Là hành động merge code giữa 2 nhánh code từ một nhánh A vào 1 nhánh B hoặc ngược lại, nhánh được merge sẽ chứa code của cả 2 nhánh và tạo ra một commit mới là merged commit.

 

Rebase code/コードをリベースする : Cũng là một hành động merge code nhưng không tạo ra commit mới là merged commit mà sắp xếp các commit theo thứ tự thời gian của cả 2 nhánh, history sẽ đẹp tuy nhiên 2 nhánh mà lâu không rebase sẽ phải so sánh theo thời gian từng commit một sẽ mất thời gian.

 

Conflict/コンフリクト(衝突): Là sự xung đột khi merge code hay rebase khi mà cả 2 thành viên cùng sửa một đoạn code ở cả 2 nhánh lúc merge vào sẽ xung đột và Git hỏi xem muốn lấy sự thay đổi nào hoặc lấy cả 2.

 

Stash/スタッシュ : Là tính năng lưu tạm các sự thay đổi vào local khi chúng ta đang làm code dở ở nhánh A nhưng lại chưa muốn commit thì chúng ta phải sang nhánh B để fix bug nên chúng ta phải stash lại để không bị mất code cũng không phải commit. Khi quay lại nhánh A sẽ apply stash để sửa tiếp.

 

Gitignore: Là file nằm trong repository chúng ta tạo ra với tên. gitignore nằm liệt kê các file hay folder nằm trong folder git mà chúng ta không muốn git tracking mà chỉ lưu ở local thôi. Nó sẽ không đánh dấu sự thay đổi khi có thay đổi trong cac file này.